https://dreamhack.io/wargame/challenges/2/
basic_exploitation_000
Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla
dreamhack.io
직접 핸드레이를 진행해보기 위해
pwnable을 학습할 때 풀었던 BoF 문제인 dreamhack basic_exploitation_000 파일을 가지고 직접 분석해보려 한다.
1) 먼저 gdb로 main 함수부터 확인해보았다.
위의 결과로 대충 합해보면 아래와 같은 코드를 작성할 수 있을 것 같다.
->
main( ) {
buf[0x80];
initialize();
printf(“buf = (%p)\n”, buf);
scanf(“%141s”, buf);
return 0;
}
2) initialize 함수
아래를 보니, 위의 두 setvbuf 함수는 각각 stdin과 stdout인 것을 알 수 있다.
그리고 mode가 2라고 되어있는데, 파일 버퍼링 형식은 _IOFBF, _LOLBF, _IONBF가 있는데,,,
_IONBF가 2이다.
그러면
setvbuf(stdin, 0, _IONBF, 0)
setvbuf(stdout, 0, _IONBF, 0)
이렇게 된다
3) signal 함수
그다음 signal 함수를 보면 0xe(14)랑 0x804857b라는 값이 담겨있다.
확인해보면 alarm_handler라는 것이고, 14는 시그널 종류에서 14번 SIGALRM(코어 덤프)를 뜻한다.
정리하면 signal(SIGALRM, alarm_hander);
이렇게 되지 않을까?
다음 alarm 함수는 alarm(30); 이렇게 될 것 같다
Initialize() {
setvbuf(stdin, 0, _IONBF, 0)
setvbuf(stdout, 0, _IONBF, 0)
signal(SIGALRM, alarm_handler);
alarm(30);
}
[ 결론 ]
Initialize() {
setvbuf(stdin, 0, _IONBF, 0)
setvbuf(stdout, 0, _IONBF, 0)
signal(SIGALRM, alarm_handler);
alarm(30);
}
main( ) {
buf[0x80];
initialize();
printf(“buf = (%p)\n”, buf);
scanf(“%141s”, buf);
return 0;
}
--------------------------------------------------
[정답]
문제에서 주어진 코드는 아래와 같다,,!
아래의 main 함수에서 argc, argv[]는 내가 알아서 써야 되는 걸까,,,? 그리고 char인건 우째 알어,,? 당연한 건가유,,?
대충 이렇게 되는데 이리저리 함수를 찾아보면서 하니 재미있다,,,!!
연산이 없어서 그렇게 어렵지는 않았던 것 같다.
'Reversing > DreamHack' 카테고리의 다른 글
[Reversing] Dreamhack_ ssp_001 Handray (0) | 2022.08.26 |
---|---|
[DreamHack_Wargame] rev_basic_8번 (0) | 2021.05.24 |
[DreamHack_Wargame] rev_basic_7번 (0) | 2021.05.24 |
[DreamHack_Wargame] rev_basic_6번 (0) | 2021.05.15 |
[DreamHack_wargame] rev_basic_5번 (0) | 2021.05.15 |