20192204-exp1-逆向与Bof基础

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虚拟机上

20192204-exp1-逆向与Bof基础

在桌面右键点击在这里打开终端,输入命令objdump -d pwn1 | more进行反汇编

可以看到指令地址、机器指令及汇编指令

20192204-exp1-逆向与Bof基础

在地址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

20192204-exp1-逆向与Bof基础

将0804847d减去80484ba得到补码c3ffffff,使其替换d7ffffff即可。

复制PWN1到PWN2,在终端使用vi打开PWN2进行机器指令的修改,修改步骤如下:

1.按esc键之后输入%!xxd将显示模式改为16进制

2.输入/f0e8查找到机器指令e8 d7 ff ff ff

20192204-exp1-逆向与Bof基础

3.输入i进入insert模式,将d7改为c3

20192204-exp1-逆向与Bof基础

4.输入指令%!xxd -r转换显示格式16进制为原格式,这样保存修改后程序才能正常运行。

20192204-exp1-逆向与Bof基础

5.输入WQ存盘退出。

在修改完毕之后再次对PWN2使用反汇编指令可以看到主函数的call指令函数调用确实由之前的调用foo函数变为了调用getshell函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjwgg.html