[pwnable.kr] bof- 5 pt
이번에 풀어볼 녀석은 너구리? 같은 넘이 손들고있는 bof문제이다.
bof는 소프트웨어 취약점으로 가장 흔하다고 한다.
bof바이너리 파일이랑 bof.c 소스코드를 제공한다.
받은 소스코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } | cs |
프로그램을 실행하면 func함수에 인자로 0xdeadbeef를 넣어 실행시킨다.
func함수는 "overflow me : "라는 문자열과 함께 gets으로 사용자에게 문자열을 입력받고, 여기서 오버플로우가 일으켜 인자로 주어진 key값을 변조시켜 system함수로 "/bin/sh"를 실행시킬수 있을 것이다.
먼저 checksec으로 bof에 걸려있는 보호기법을 확인해보았다.
일단 Canary가 있어서 bof가 일어나면 프로그램이 끝나기전에 검사하여 에러를 출력할 듯하다.
gets로 받는 buffer와 인자 key까지의 거리를 알기위해 gdb로 디스어셈블링해보았다.
0x00000649 <+29>: lea eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>
이부분이 get함수를 부르는 부분이다. buf는 ebp-0x2c부터 받는다.
0x00000654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0000065b <+47>: jne 0x66b <func+63>
ebp-0x2c ~ ebp+0x8까지 52의 차이가 나므로 이를 쓰레기값으로 채우고 다음으로0xcafebabe로 채우면 될 것같다.
공격을 하여 플래그를 출력해보았다.
끝나치고 나가려하니까 그제서야 *** stack smashing detected ***가 떴다. 카나리가 변조되서 뜬 것같지만...
그전에 system으로 쉘을 이용해서 큰 상관은 없는듯...
클리어!
'Wargame > Pwnable.kr' 카테고리의 다른 글
[pwnable.kr] input - 4 pt (0) | 2018.05.10 |
---|---|
[pwnable.kr] lotto - 2 pt (0) | 2018.05.10 |
[pwnable.kr] collision - 3 pt (0) | 2018.05.02 |
[pwnable.kr] blackjack - 1 pt (0) | 2018.05.01 |
[pwnable.kr] cmd1 - 1 pt (0) | 2018.05.01 |