Sqix

FTZ Level16 본문

Wargame/FTZ

FTZ Level16

Sqix_ow 2018. 7. 20. 10:38



프로그램의 구조 상 void (*call)() 함수 포인터가 가리키는 함수의 주소를 shell 함수로 변경하여 shell 함수를 실행시켜야 하는 것 같습니다.


우선 어셈블리를 먼저 확인해보겠습니다.



56바이트의 스택을 확보하고 fgets로 사용자에게서 입력을 받아온 뒤, *call이 가리키는 함수를 실행시킵니다.


여기서 shell 함수의 주소를 찾고, stack에서 *call의 위치(ebp에서의 거리)를 찾아 그 전까지는 덮어버리고 *call을 다른 함수로 바꿔준다면 문제가 해결될 것 같습니다.



여기에서 보면 printit 함수의 주소는 0x8048500, shell함수의 주소는 0x80484d0입니다. 


어셈블리를 다시 보면, movl $0x8048500, 0xfffffff0(%ebp)라는 명령어가 있는데 이는 ebp-16의 위치에 printit 함수의 주소를 넣으라는 명령어입니다.


사실 스택을 구조화해 보고, gcc 3.2.2 버전에 따른 더미값을 알 수 있다면 거리 파악은 쉽습니다. 


http://www.hackerschool.org/HS_Boards/data/Lib_system/dummy3.txt 이 글에 따르면, 일반 변수는 8byte, buf은 크기에 따른 dummy를 넣습니다.


즉, 스택의 구조는 [ buf 20 ] [ dummy 20 ] [ call 4 ] [ dummy 4 ] [ crap 4 ] [ dummy 4 ] [ SFP 4 ] [ RET 4 ] 로 구성되어 있습니다.


따라서 우리는 40bytes의 A와 "\xd0\x84\x04\x08"을 fgets에 집어넣어 buffer overflow를 일으키면 shell 함수를 호출할 수 있습니다.



성공

'Wargame > FTZ' 카테고리의 다른 글

FTZ Level18  (0) 2018.07.20
FTZ Level17  (0) 2018.07.20
FTZ Level15  (0) 2018.07.10
FTZ Level14  (0) 2018.07.10
FTZ Level13  (0) 2018.06.29
Comments