LOB, orc -> wolfman 문제 확인 level4 문제와 거의 동일한데 마지막에 버퍼를 memset으로 초기화한다는 것만 다르다. 어차피 RET 뒤에 쉘코드를 주어서 풀었었기 때문에 버퍼 초기화는 영향이 없다. 따라서 이전 문제와 동일한 방식으로 풀이를 진행하도록 한다. LOB, orc -> wolfman 문제 풀이 현재 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 strcpy 호출 뒤인 main+194에 bp를 건 후 실행시키고 버퍼 주소값을 확인해준다. LOB, orc -> wolfman 익스플로잇 RET 앞에 44바이트 더미값을 준 다음 RET 자리에 덮어쓸 주소로 위 스택에서 확인한 적당한 주소값을 준다. 그리고 그 뒤에 nop과 쉘코드를 준다. ./wolfm..
LOB, goblin -> orc 문제 확인 strcpy 취약점을 이용해 bof를 하는 문제인데 앞에 2개정도 고려할 요소가 생겼다. 첫번째는 egghunter로 환경변수를 전부 초기화하고 있기 때문에 환경변수를 사용하지 않고 문제를 풀어야 한다는 것이고 두번째는 argv의 48번째 값이 \xbf여야 한다는 것이다. LOB, goblin -> orc 풀이 main문을 gdb로 확인해주면 일단 dummy값은 없는 것으로 확인되기 때문에 스택 상황은 아래와 같다. i buffer SFP RET 4 40 4 4 환경변수를 사용하지 못하기 때문에 gdb상에서 입력값이 저장되는 버퍼 주소값을 알아낼 필요가 있다. strcpy 바로 뒤인 main+194에 bp를 건다. 그리고 48번째 바이트가 \xbf가 아니면 프..
LOB, gremlin -> cobolt 문제 확인 gate -> gremlin 문제와 거의 동일한 문제로 strcpy 취약점을 이용한 bof 문제이다. LOB, gremlin -> cobolt 문제 풀이 gdb로 main문을 먼저 확인해본 결과 0x10을 할당하고 있으므로 dummy는 없는 것 같다. 따라서 스택 상황은 아래와 같다. buffer SFP RET 16 4 4 환경변수에 쉘코드와 nop을 100정도 주어 저장한 다음, 환경변수 주소를 알아낸다. LOB, gremlin -> cobolt 익스플로잇 환경변수 주소를 RET에 덮어주기만 하면 되기 때문에 앞단에 dummy값은 20바이트를 채워주면, 다음 단계로 가는 패스워드를 얻을 수 있게된다.
LOB, cobolt -> goblin 문제 확인 앞에 두문제와 거의 유사한 문제이지만 scanf 취약점에서 gets 취약점을 활용해서 bof를 해야한다는 점만 변경되었다. gets 함수는 사용자에게 입력받는 값의 길이를 체크하지 않기 때문에 bof에 취약한 함수이다. LOB, cobolt -> goblin 풀이 gdb로 main문을 살펴보니 총 0x10바이트(16)를 할당하는 것으로 보아 dummy 값은 없는 것으로 보인다. 따라서 스택 상황은 아래와 같다. buffer (16) SFP (4) RET (4) 먼저 앞단에 nop이 100정도 들어가있는 쉘코드를 환경변수에 올려준 후 주소값을 구해준다. LOB, cobolt -> goblin 익스플로잇 그리고 RET에 환경변수 주소 4바이트만 덮으면 되기 ..
해커스쿨의 Lord Of Bufferoverflow(LOB) 는 여러 bof 문제를 경험할 수 있는 환경?으로 보통 FTZ를 끝마쳤으면 LOB를 풀게된다. 2017년도에 풀고 블로그에 풀이를 올렸었는데 블로그를 여기로 이전하는 바람에 다시 작성하게 되었다. 초기설정 초기설정을 해놓치 않고 시작하면 엄청난 삽질을 경험할 수 있다. 난 링크(LOB 다운로드 & 초기설정)를 참고해서 초기설정을 진행해주었다. 초기설정은 아래와 같이 /etc/passwd의 bash를 전부 bash2로 변경하는 작업이다. 그다음 IP주소를 확인해주고 XShell이든 Putty든 연결해준다. 난 앞으로 XShell을 사용해서 문제풀이를 진행하도록 하겠다. LOB, gate -> gremlin 문제 확인 gate -> gremlin ..
pintool은 DBI(Dynamic Binary Instrumentation) 툴 중 하나로 리눅스에서는 pintool 사용이 쉬운편인데 윈도우용 Pin은 정리된 글이 많이 없어서인지 사용하는데 삽질을 좀 했다. cygwin64, Window pin 다운로드 64bit라는 가정하에 cygwin64, 윈도우용 Pin, 비쥬얼스튜디오 x64 가 필요하다. cygwin64 다운로드 및 설치 일단 첫번째로 cygwin은 64bit 버전으로 아래 링크에서 다운받는다. cygwin 다운로드 페이지 Cygwin Installation Cygwin Get that Linux feeling - on Windows Installing and Updating Cygwin Packages Installing and Upda..
OP에는 GOT Overwrite, RTL Chaining 등의 개념이 혼합되어 있다. DEP를 우외해 익스플로잇을 하기 위한 ROP에 대해 해당 게시글에서 차근차근 정리해나가려고 한다. 가젯(gadget) 이란 ROP에서 자주 등장하는 개념인 가젯이란 ret으로 끝나는 명령 조각을 말한다. (INT + ret 형태) 대표적으로 'pop - pop - return', 일명 PPR이 있다. 이러한 가젯을 사용해 내가 원하는 상황에 맞게 스택 포인터를 적당히 이동시켜주는 것이 중요하다. (ret을 사용해 esp로 돌아가고 esp를 올리기 위해 pop을 사용하고 등) VirtualProtect()를 호출하여 DEP를 해제하는 방식 다양한 방식이 존재하지만, 그 중 가장 손쉽게 DEP를 해제할 수 있..
역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Library) 이란 일단, RTL은 메모리에 이미 적재되어있는 공유 라이브러리를 이용해 원하는 함수를 실행시키는 기법이다. func1 함수를 실행시켜야 한다는 가정에서 아래 예를 봐보자. [buf + SFP +RET] 의 RET 자리에 func1 함수의 주소값이 들어갔고 4바이트의 dummy 후에 func1함수의 인자값이 들어간 구조가 됐다. 참고로 여기서 설명을 위해 사용하는 func1은 인자가 1개인 함수이고 func2는 인자가 2개가 필요한 함수라는 가정이다. // 기존 스택 상황 buf ..
FTZ level19 문제 확인 이번 문제 소스코드는 단 3줄인데 buf[20]을 선언 후 gets로 여태까지의 다른 문제들과는 확연한 차이가 있다. 바로 setreuid 함수가 사용되어있지 않다는 것이다. 입력값의 길이를 확인하고 있지 않으므로 RET을 덮어쓸 수 있고 쉘 또한 실행시킬 수 있지만, 아래 캡쳐 이미지에서 보는 바와 같이 setreuid가 걸려있지 않았기 때문에 쉘 실행 권한 id가 동일한 level19임을 알 수 있다. setreuid에 대해서는 [해커스쿨 FTZ] level11 풀이 에서 설명한 바 있다. 따라서, 이번 문제는 코드에는 없는 setreuid와 system('/bin/sh')를 직접 실행시켜주어야 하는 문제이다. 그리고 그러기 위해선 RTL(Return to Librar..
FTZ level18 문제 확인 FTZ level18 문제는 코드가 갑자기 길어진다. 코드가 길지만 왜 이문제를 냈는지에 대한 관점으로 입력값을 어디서 받는지 스택상 버퍼가 어디에 위치하고 뭘 바꿔야 하는지만 살펴보면 걸러지는 코드가 많아서 긴건 아니다. #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if..
FTZ level17 문제 확인 FTZ level16과 비슷해보이지만 하나 다른 점은 이번엔 shell() 없다는 것이다. shell() 함수 없이 call 함수 포인터 변수의 주소값을 어떠한 값으로 덮어써 쉘이 실행되게만 하면 된다. FTZ level17 문제 풀이 level17 풀이는 간단하다. 몇번 환경변수를 사용한 적이 있는데 환경변수에 쉘코드를 등록하고 환경변수의 주소를 덮어써주면 되는 것이다. 일단, 스택 구조부터 확인해보자. char buf[20] : 20바이트 (0x14) dummy : ? void *call : 4바이트 dummy : ? int crap : 4바이트 dummy : ? SFP : 4바이트 RET : 4바이트 입력해준 41414141 버퍼 시작부터 printit 함수 시작 주..
FTZ level16 문제 확인 FTZ level16은 11~15와는 조금 다른 형태의 문제가 출제되었다. call() 함수포인터를 printit() 함수로 지정해놨는데 printit() 함수는 "Hello there!"이라는 문자열을 출력하고 끝난다. 쉘획득을 위한 shell() 함수를 실행시키는 것이 level16의 목표이다. fgets가 있기때문에 48바이트까지는 입력할 수 있다. FTZ level16 문제 풀이 쉘획득을 위한 shell() 함수를 실행시키는 방법 중에 하나로 call() 함수 포인터의 값으로 들어있는 printit() 함수의 주소를 shell() 함수로 변경하는 것이다. 일단, 스택 구조부터 확인해보자. char buf[20] : 20바이트 (0x14) dummy : ? void ..