20145336张子扬 《网络对抗》逆向及bof基础
20145336张子扬 《网络对抗》逆向及bof基础
学习知识点
缓冲区溢出
缓冲区溢出
一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。
缓冲区溢出原理
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
实践内容
实践背景
本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
实践一
- 首先我们需要了解这个文件,所以我们对pwn1进行反汇编操作
- 上图主要有三列内容,首先第一列是指代码段在内存中的地址,第二列指的是及其指令,第三列是指汇编指令。我们主要阅读第三列来了解这段代码是有何作用。第一张图主函数右下角的"call 8048491 ",这是一条汇编指令,是说这条指令将调用位于地址8048491处的foo函数,我们此次实验的主要目的就是将这里调用的foo函数的地址用缓冲区溢出的方法将地址改为get shell函数的地址从而进行攻击。
- 然后我们用vim文本编辑器打开文件,之后将会显示一大堆乱码,这是显示的ASCII码。想要查看内容输入“:%!xxd”,将显示模式显示为16进制模式。
- 查看需要修改内容的地方,这里我们需要更改e8d7的位置,然后输入“/e8 d7”,查找要修改的内容,注意中间有空格,不然会出错。将d7改为c3。
- 用“:%!xxd -r”将16进制转换为原格式,再用“:wq”存盘退出vim。
- 最后一步验证一下这个代码。用反汇编再看看这个及其指令是否发生变化。下面两张图很清楚的显示了call返回地址的变化。
- 运行一下,查看结果。
实践二
- 首先和实践一相同,反汇编了解程序的基本功能。
- 然后我们需要确定那几位缓冲区溢出的字符会覆盖返回地址。之后使用gdb调试来测试程序,我选择使用1111122222333334444455555666667777788888来进行测试。
- 观察寄存器eip的值,后面显示0x38373737,这里显示的ASCII码转换为数字就是7778,很容易就能找到这几位字符所在的位置。
- 然后构造输入字符传,我们需要生成包括一个字符串的文件来让系统输入\x7d\x84\x04\x08这样的16进制值,如下图。
- 这样我们使用管道符“|”作为pwn1的输入。下面是实验结果。