20192204-exp1-逆向与Bof基础 (2)

20192204-exp1-逆向与Bof基础

在终端使用./pwn2时提示运行失败,右键点击pwn2文件设置权限为允许作为程序运行

20192204-exp1-逆向与Bof基础

在命令行中重新运行pwn2,输入指令ls,程序pwn2可以正常运行,成功通过直接修改机器指令实现对程序调用函数的改变

20192204-exp1-逆向与Bof基础

3 通过构造输入参数,造成BOF攻击,改变程序执行流 知识要求:堆栈结构,返回地址 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取 进阶:掌握ELF文件格式,掌握动态技术 3.1 反汇编,了解程序的基本功能 首先使用反汇编命令objdump -d pwn1 | more将代码进行反汇编 来到foo函数,通过汇编指令lea -0x1c(%ebp),%eax可以发现foo函数存在缓冲区漏洞,即每次系统只预留28字节的缓冲区空间,此时如果我们想办法输入过长的数据,使得超出部分覆盖了原本的返回地址,并且使得覆盖的新数据恰好为函数getshell的地址,这样就能成功使得程序调用getshell函数。

20192204-exp1-逆向与Bof基础

3.2 确认输入字符串哪几个字符会覆盖到返回地址 运行这步时需检查自己的虚拟机是否有安装gdb,在终端中输入gdb -v即可 输入命令之后提示虚拟机没有安装GDB,在终端中进入管理员模式,输入以下命令进行GDB的安装: sudo chmod a+w /etc/apt/sources.list sudo chmod a-w /etc/apt/sources.list apt-get update apt-get install gdb

输入完毕后稍等片刻完成GDB安装,再次输入gdb -v显示版本号即为安装成功:

20192204-exp1-逆向与Bof基础

接下来开始测试输入一个较长的字符串用于找出输入的哪些部分可以覆盖返回地址:
首先进入root模式,输入gdb pwn1进入调试模式,输入r开始调试:
输入一串长数字1111111122222222333333334444444412345678,输入完毕后输入info r查看eip寄存器的值:

20192204-exp1-逆向与Bof基础

可以看出此时eip的值为0x34333231,正好对应1234的倒序的ASC码,所以输入数字的第24位至28位可以覆盖返回地址,所以令输入的第24位至28位对应函数getshell的地址即可让程序调用函数getshell

通过反汇编可以看到getshell的地址为0804847d,根据之前eip的值是数字1234的逆序的ASC码可以得出,此时输入11111111222222223333333344444444\x7d\x84\x04\x08即可将getshell的地址覆盖到程序的返回地址中。

3.4 构造输入字符串 因为我们无法直接通过键盘输入\x7d\x84\x04\x08这样的十六进制字符串,所以我们需要将字符串11111111222222223333333344444444\x7d\x84\x04\x08作为一个文件,然后将其作为pwn1的输入即可完成十六进制字符串的录入。

首先输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input将字符串存储到文件“input”中:

然后使用命令xxd input以十六进制的形式查看文件input,可以看到成功将十六进制字符串以文件形式存储:

20192204-exp1-逆向与Bof基础

然后将input的输入,通过管道符“|”,作为pwn1的输入。

输入完毕之后程序开始运行,此时输入ls发现成功列出了当前目录下所有文件,说明成功使用输入构造过的过长字符串覆盖返回地址成功使得程序调用函数getshell。

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

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