参考资料:linux程序的常用保护机制
生成shellcode
上一篇找到了这些坏字符,在生成shellcode的时候必须避免这些字符出现\x00\x09\x0a\x20
1 |
|
寻找返回地址
现在我们知道要到达ESP寄存器指向的缓冲区,我们需要找到一条指令,例如JMP ESP
,它将把我们带到ESP寄存器指向的地址。
edb
Evans Debugger具有简单的操作码搜索功能。ctrl + o 快捷键搜索操作码
1 |
|
但是经过搜索,没有找到任何有效的跳转地址。怀疑是版本不是最新版,有bug,但是apt-get upgrade edb,报了错。
1 |
|
放弃使用edb来查找跳转指令。
msfelfscan
如果运行msfelfscan提示命令未找到“ command not found”
1 |
|
msfelfscan -j esp -f /usr/games/crossfire/bin/crossfire
1 |
|
exp
1 |
|
这是exp在栈中的执行流程。
debug
经过一些失败的尝试,crossfire程序还是没有成功反弹shell。
SIGSEGV是非法内存访问异常
同样的crossfire程序,同样的exp。在官方的给的虚拟机中可以成功溢出获得shell,但是在自己的x64位linux上不能。
github上有人问了同样的问题,但是没有答案或者解决方案
checksec
1 |
|
运行crossfire的虚拟机
未成功的机器A:
Linux kali 5.4.0-kali3-686-pae #1 SMP Debian 5.4.13-1kali1 (2020-01-20) i686 GNU/Linux
成功的虚拟机B:
B机器检查“地址空间分布随机化”后,发现是开启状态,可以确定运行失败的原因跟这个无关。
1 |
|
在成功弹shell一次后,再次运行机器B的exp,溢出就无法成功了。
重启后,运行exp,就能成功弹shell。
推测是因为溢出改变了某个内存机制?知识的匮乏导致无法继续分析。