반응형 분류 전체보기167 FTZ Level 16 Level 16에 접속해서 파일들과 힌트를 봅니다. 함수 2개와 main 함수 1개 가 있네요 그런데 메인 함수를 보면 전 레벨의 메모리 구조와 비슷하다는 것을 눈치챌 수 있습니다. main 함수에서 포인트 함수를 호출하는게 보입니다. 그렇다면 여기서 버퍼오버플로우를 일으켜서 포인터함수를 호출하는 부분의 주소를 shell()함수 주소로 바꾸어주면 쉘창이 나타난다고 생각해볼 수 있습니다. (전 레벨의 프로그램과 비슷하므로 buf와 포인터 함수 사이의 더미는 20byte라고 생각했습니다.) 프로그램을 gdb를 사용해 shell함수의 시작 주소를 찾습니다. shell+1의 0x080484d0이 되겠군요. 그럼 바로 코드를 작성해봅시다. (python -c 'print "A"*40 + "\xd0\x84\x04\.. 2021. 8. 9. FTZ Level 15 Level 15에 접속하여 파일과 힌트를 봅니다. 14와 똑같은데 단한가지 다른게 포인터 변수 check입니다. 포인터를 사용했기 때문에 check에는 deadbeef가 있는 주소를 넣어주면 된다고 생각합니다. 우선 gdb를 뜯어보면 Level14와 메모리 구조는 똑같습니다. 여기서 main+32를 살펴보면 cmpl어셈블리 명령어를 사용하여 eax값을 비교 하고 있습니다. 이 프로그램은 0xdeadbeef가 하드코딩 되어있어 프로그램 속에 내제 되어 있습니다. 그러므로 내제되어있는 0xdeadbeef값의 주소를 찾으면 되는 것이지요 gdb에서 x/x를 이용하여 주소를 찾아줍니다. 찾으니 0x080484b2가 나오네요 Level14에서 사용했던 코드에서 Check부분의 값만 바꿔 줍니다. (python -.. 2021. 8. 9. FTZ Level 15 Level 15에 접속하여 파일과 힌트를 봅니다. 14와 똑같은데 단한가지 다른게 포인터 변수 check입니다. 포인터를 사용했기 때문에 check에는 deadbeef가 있는 주소를 넣어주면 된다고 생각합니다. 우선 gdb를 뜯어보면 Level14와 메모리 구조는 똑같습니다. 여기서 main+32를 살펴보면 cmpl어셈블리 명령어를 사용하여 eax값을 비교 하고 있습니다. 이 프로그램은 0xdeadbeef가 하드코딩 되어있어 프로그램 속에 내제 되어 있습니다. 그러므로 내제되어있는 0xdeadbeef값의 주소를 찾으면 되는 것이지요 gdb에서 x/x를 이용하여 주소를 찾아줍니다. 찾으니 0x080484b2가 나오네요 Level14에서 사용했던 코드에서 Check부분의 값만 바꿔 줍니다. (python -.. 2021. 8. 9. FTZ Level 14 Level14에 들어가서 파일들과 hint를 봅니다. 코드를 해석하면 이번 문제는 쉬운 문제인 것 같습니다. check의 위치를 찾아서 check값이 deadbeat가 되면 자동으로 15레벨의 쉘을 띄어줍니다. 프로그램 가지고 메모리 구조를 생각해 보면 RET4 SFP4 dummy? int crap4 dummy? int check4 dummy? buf20 이렇게 됩니다. main+3을 보면 총 56byte가 할당되는 것을 확인 할 수 있습니다. 그렇다면 20Byte(Buf) + Dummy + 4byte(Check) + Dummy + 4byte(crap) + Dummy = 56Byte 가 되는 것입니다. 여기서 Buf와 Check사이의 거리를 알아내어 Check에 deadbeef값을 넣어주면 됩니다. 이때.. 2021. 8. 9. FTZ Level 13 Level 13에 접속하여 파일과 힌트를 봅니다. 이번에도 attackme를 이용하는 것입니다. 소스를 보면 long형 변수 1개와 char형 배열 하나가 선언되어있습니다. 그리고 long I 의 값이 변하면 프로그램이 꺼집니다. 그러므로 I의 초기값을 유지해야합니다. 소스만 보고 스택구조를 보면 RET4 SFP4 DUMMY? I4 DUMMY? BUF1024 형태가 됩니다. 이를 gdb로 뜯어보면 main+3을 보면 (0x418) 1048바이트가 할당된 것을 볼 수 있습니다. 그렇다면 BUF(1024byte) + DUMMY(?) + I (4byte) + DUBBY = 1048Byte 입니다. 더미의 합은 20 byte가 되어야합니다. 4 + 16, 8 + 12, 12 + 8, 16+ 4 중 하나가 됩니다.. 2021. 8. 9. FTZ Level 12 Level 12에 접속하여 파일들을보면 Level 11과 똑같다 hint파일을 보면 11과 같이 256바이트를 할당한 변수를 생성하고 있다. 다른점은 strcpy함수가 아닌 gets함수를 사용한다는 것이다. gdb로 뜯어보면 구조는 Level11과 같다 RET4byte SFP4byte DUMMY8byte STACK256byte 그래서 Level11과 똑같이 풀었는데 안된다 ㅋㅋㅋㅋㅋㅋ 가만 생각해보니 gets 함수라서 그렇다. "|"와 cat을 사용하여 값을 넘겨주면 해결된다. (eggshell과 getenv 사용) (python -c 'print "A"*268+"\xbc\xf2\xff\xbf"';cat)|./attackme 그럼 Level 13의 권한을 획득한다. 2021. 8. 9. 이전 1 ··· 17 18 19 20 21 22 23 ··· 28 다음 반응형