본문 바로가기

Reversing/DreamHack

[Reversing] Dreamhack_basic_exploitation_000 문제 Handray

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