본문 바로가기
반응형

분류 전체보기167

LOB Level 19 nightmare nightmare -> xavius 로 접속합니다. 소스코드를 보는데 뭐 다막아놨어요 우선 계속 strcpy 가 나오다가 갑자기 fgets가 나온 것에 의문이 듭니다. char *fgets(char *s, int size, FILE *stream); 이소스에서는 fgets(buffer, 256, stdin)이라고 되어있는데 여기서 stdin이 뭔지 궁금해서 검색해보면 stdin이란, 표준입력 파일 스트림으로 표준 입력을 이야기할 때 흔히 '버퍼'를 이야기한다고 합니다. 그렇다면 fgets로 입력받은 값들이 stdin에 저장되는 것 같습니다. 제대로 알아보기 위해 gdb로 보면 fgets (main+21)에 break 를 걸고 stdin을 보면 0x00000000 이군요... 여기서 이게 아닌가 싶었는데 .. 2021. 8. 10.
LOB Level 18 succubus succubus -> nightmare 로 접속합니다. plt라는 힌트와 함께 흠? ret 부분에 strcpy 의 주소가 들어가야 하네요 우선 plt에 대해서 공부하면 PLT(Procedure Linkage Table) PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 됩니다.. GOT(Global Offset Table) GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있습니다. PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 됩니다. 한마디로 strcpy가 실행되는 것 같습니다. strcpy 구조 char * strcpy ( char .. 2021. 8. 10.
LOB Level 17 zombie_assassin zombie_assassin -> succubus 로 접속합니다. (소스코드가 길어서 캡처 말고 복붙 했습니다.) /* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); c.. 2021. 8. 10.
LOB Level 16 assassin assassin -> zombie_assassin 으로 접속합니다. 힌트로 FEBP가 나왔네요 FEBP란 Fake EBP의 약자입니다. fake ebp -> ebp 속이기 이 기법은 ret까지만 덮을 수 있고, 특정한 영역에 대해 필터링 해놓았을 때, (스택 주소 \xbf, 라이브러리주소 \x40 등) 공격할 방법이 없어보일 때 사용하면 된다네요. 공격방법은 Fake EBP는 말그대로 EBP를 속이는 기법이다. 해당기법은 RET까지 덮을수있다. leave - mov esp,ebp, pop ebp 명령을 가지고있다. esp에 ebp가 들어가고, ebp가 pop이된다. 처음에 ret명령이 실행될떄 pop eip 실행되고, leave,ret주소를 넣었기때문에 다시 되돌아간다. mov esp,ebp , pop .. 2021. 8. 10.
LOB Level 15 giant giant -> assassin 으로 접속합니다. 스택도 안되고 RTL도 안된답니다. 흑.... 그럼 다른 방법을 사용합시다. Ret Sled 스택영역을 ret를 덮어씌울 수 없으므로, ret영역에 ret 명령의 주소를 쓰는 것이다. dummy+&ret+&shellcode+shellcode esp 가 ret를 가리키고 정상적인 ret가 수행되면서 esp+4 ret명령이 한번 더 실행되며 shellcode의 주소로 점프 shellcode 실행 한마디로 ret영역에 ret명령 주소를 씌이면 그 다음 주소로 간다는 거네요 그럼 그 다음 주소에 system() 의 주소를 넣으면 되겠네요 44byte dummy + 4byte RET + system() ADDR + 4byte dummy + /bin/sh ADDR .. 2021. 8. 10.
LOB Level 14 bugbear bugbear -> giant 로 접속합니다. 우선 코드를 보는데 rtl을 system함수가 아닌 execve를 사용해서 풀어야하는 문제입니다. 우선 execve함수의 주소를 찾아냅니다. execve를 사용하여 bin/sh를 띄우려면 execve("/bin/sh", {"/bin/sh", 0}, 0) 형태가 되어야 합니다.... 우선 null값의 주소를 구합니다. 0xbffffffc 입니다. (모두 0 이네요 ㅎㅎ) 그런데 bin/sh와 0을 같이 넣어주어야 합니다. 여기서 저는 argv[0]을 생각했습니다. 바로 파일명을 심볼릭 함수로 주어서 넣는 거죠 ㅎㅎ 파일명은 0xbffffff5부터 시작하네요. 아마 실제 파일로 하면 약간의 차이가 있을거라고 예상합니다. bin/sh의 주소를 찾기위해 코딩을 하고.. 2021. 8. 10.
반응형