实验目的
本次实践的对象是一个名为 pwn1 的 linux 可执行文件
该程序正常执行流程是: main 调用 foo 函数, foo 函数会简单回显任何用户输入的字符串
该程序同时包含另一个代码片段, getShell, 会返回一个可用 Shell 正常情况下这个代码是不会被运行的我们实践的目标就是想办法运行这个代码片段我们将学习两种方法运行这个代码片段, 然后学习如何注入运行任何 Shellcode
实验内容
手工修改可执行文件, 改变程序执行流程, 直接跳转到 getShell 函数
利用 foo 函数的 Bof 漏洞, 构造一个攻击输入字符串, 覆盖返回地址, 触发 getShell 函数
注入一个自己制作的 shellcode 并运行这段 shellcode
实验要求
熟悉 Linux 基本操作
理解 Bof 的原理
实验步骤
(一) 直接修改程序机器指令, 改变程序执行流程
知识要求: Call 指令, EIP 寄存器, 指令跳转的偏移计算, 补码, 反汇编指令 objdump, 十六进制编辑工具
学习目标: 理解可执行文件与机器指令
进阶: 掌握 ELF 文件格式, 掌握动态技术
思路
一个程序的可执行文件可通过 objdump 命令对其进行反汇编, 通过对汇编语言的学习可以看出程序读取数据的过程
从反汇编的文件来看, main 函数中调用 foo 函数, 使用 call 指令通过分析发现 foo 函数与 getShell 函数的首地址之间
存在偏移, 两者之间相差了 14 系统调用 foo 函数对应机器指令为 e8 d7ffffff, 则如果想调用 getShell 函数, 就要对 e8 d7ffffff 进行修改
已经知道电脑是小端模式, 即数据的高字节保存在内存的高地址中, 而数据的低字节保存在内存的低地址中因此, 如果要修改, 就要将 "d7" 改为 "c3"
具体操作过程:
将 pwn1 进行备份, 修改备份文件
用 vi 打开备份文件, 用:%!xxd 将显示模式切换为 16 进制模式
用 / d7 查找要修改的内容, 定位后将 d7 改为 c3
用:%!xxd -r 将转换 16 进制为原格式, 保存退出
再次反汇编之后, 确定已经将程序修改为调用 getShell 函数, 接下来就是运行程序了
运行时发现无法找到目录或文件, 按照老师提供的教程进行操作就可以了
运行截图
思考
运行成功之后就完成了实验的第一个部分, 按照老师的指导一步步操作还算顺利遇到的问题是, 第一次在 16 进制模式修改完数据后出现操作失误, 先保存后转换, 在运行的时候导致文件损坏不可用这是因为一开始保存的时候就改变了文件的格式, 使得它不再是一个可执行文件的格式查找资料后没有找到能将其再次转换的方法, 只好重新进行实验
参考资料
kali 国内更新源
objdump 的用法
64 位 Kali 无法顺利执行 pwn1 问题的解决方案
来源: http://www.bubuko.com/infodetail-2520805.html