Sqix

FTZ Level14 본문

Wargame/FTZ

FTZ Level14

Sqix_ow 2018. 7. 10. 15:49


====================================================

hint


레벨 14 이후로는 mainsource 문제를 그대로 가져왔습니다.

버퍼 오버플로우, 포맷스트링을 학습하는 데는 이 문제들이

가장 효과가 좋습니다.


#include <stdio.h>

#include <unistd.h>


main()

{

int crap;

int check;

char buf[20];

fgets(buf, 45, stdin);

if(check == 0xdeadbeef)

{

setreuid(3095,3095);

system("/bin/sh");

}

}


====================================================



마찬가지로 소스코드를 복사하여 tmp 디렉토리에 붙여넣고 컴파일을 하여 gdb에 올려봤습니다.


0x38, 즉 56bytes의 스택공간을 확보하여 놓습니다. 이 문제는 check 변수의 값을 0xdeadbeef로 만들어야 하기 때문에 check 변수의 위치를 파악하는 것이 중요하죠.


따라서 stack을 보면서 각 지역변수의 위치를 제대로 파악해야 할 것입니다.



여기서 드래그한 부분만큼이 확보된 56바이트 영역 + SFP입니다. A를 20개 넣어서 buf가 처음 20bytes를 차지한다는 것을 알아내었습니다.


또한, if 부분에서 check 부분과 비교할 때, 해당 위치를 알아내어 여기에 0xdeadbeef를 bof를 통해 넣어 줄 수 있습니다.



이로써 check 지역변수의 위치를 알아냈습니다. [ buf (20) ] - [ dummy (20) ] - [ check (4) ] - [ crap (4) ] - [ dummy (8) ] - [ SFP (4) ] - [ RET (4) ] 인 듯 합니다.


그럼 buf~dummy를 A로 덮고, check를 0xdeadbeef로 덮어준다면 if절을 패스할 수 있겠네요.


python code를 짜서 작동시켜 보겠습니다.



성공!






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

FTZ Level16  (0) 2018.07.20
FTZ Level15  (0) 2018.07.10
FTZ Level13  (0) 2018.06.29
FTZ Level12  (0) 2018.06.29
FTZ Level11  (0) 2018.06.18
Comments