[pwnable.kr] bof- 5 pt

2018. 5. 9. 14:36


이번에 풀어볼 녀석은 너구리? 같은 넘이 손들고있는 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+0x8위치에 있는 값과 0xcafebabe를 비교한다.
소스코드를 볼때 
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
key == 0xcafebabe 이므로 ebp+0x8위치에 있는 값이 인자로 들어온 key일 것이다. 
현재 이 값은 0xdeadbeef이고, 이 값을 0xcafebaba로 변조시키면 될 듯하다.


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

+ Recent posts