FTZ Level14
====================================================
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를 짜서 작동시켜 보겠습니다.
성공!