1 逆向及Bof基础实践说明 1.1 实践目标 本次实践使用的是kali系统
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。 2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。 3.注入一个自己制作的shellcode并运行这段shellcode。这几种思路,基本代表现实情况中的攻击目标:
1.运行原本不可访问的代码片段 2.强行修改程序执行流 3.以及注入运行任意代码。 1.2 基础知识 熟悉Linux基本操作 能看懂常用指令,如管道(|),输入、输出重定向(>)等。理解Bof的原理。
能看得懂汇编、机器指令、EIP、指令地址。会使用gdb,vi。
当然,如果还不懂,通过这个过程能对以上概念有了更进一步的理解就更好了。--
指令、参数
一些具体的问题可以边做边查,但最重要的思路、想法不能乱。 要时刻知道,我是在做什么?现在在查什么数据?改什么数据?要改成什么样?每步操作都要单独实践验证,再一步步累加为最终结果。 操作成功不重要,照着敲入指令肯定会成功。重要的是理解思路。
看指导理解思路,然后抛开指导自己做。 碰到问题才能学到知识。 具体的指令可以回到指导中查。 2 直接修改程序机器指令,改变程序执行流程知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
学习目标:理解可执行文件与机器指令
进阶:掌握ELF文件格式,掌握动态技术
首先在云班课资源中下载PWN1并将其复制到kali虚拟机上
在桌面右键点击在这里打开终端,输入命令objdump -d pwn1 | more进行反汇编
可以看到指令地址、机器指令及汇编指令
在地址80484b5处可以看到,主函数main执行了一次函数调用,对应的汇编指令为call 8048491 <foo>,意为调用位于地址8048491处的foo函数。
本条call指令前面显示为其对应的机器指令为e8 d7 ff ff ff,e8在机器指令中意为跳转,当本条指令执行时,机器会将后面的相对地址d7 ff ff ff加上eip寄存器中的值,得到的就是下一条应该跳转到的指令的地址,此处的d7 ff ff ff为补码,对应十进制的-41,下一条应该跳转的地址为EIP+d7ffffff=80484ba-0x29=8048491,正对应上面汇编指令call中的物理地址8048491处的foo函数。
实践中要求通过直接修改机器指令使得getshell函数被调用,在这里我们可以通过修改主函数通过call指令调用foo函数处的机器指令e8 d7 ff ff ff为getShell函数所在地址减去80484ba对应的补码就可以将主函数调用foo函数改为调用etshell函数。
在反汇编页面继续下滑,可以看到getshell函数对应的地址为0804847d
将0804847d减去80484ba得到补码c3ffffff,使其替换d7ffffff即可。
复制PWN1到PWN2,在终端使用vi打开PWN2进行机器指令的修改,修改步骤如下:
1.按esc键之后输入%!xxd将显示模式改为16进制
2.输入/f0e8查找到机器指令e8 d7 ff ff ff
3.输入i进入insert模式,将d7改为c3
4.输入指令%!xxd -r转换显示格式16进制为原格式,这样保存修改后程序才能正常运行。
5.输入WQ存盘退出。
在修改完毕之后再次对PWN2使用反汇编指令可以看到主函数的call指令函数调用确实由之前的调用foo函数变为了调用getshell函数。