逆向与Bof基础 实践
一 直接修改机器指令,改变程序执行流程
本次实践的对象是一个名为pwn1的linux可执行文件。 显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。
通过修改机器指令是先运行shell代码片段:
将可执行文件zwj反汇编:objdump -d zwj | more
可以看到main函数中call 8048491 对foo函数进行了调用,对应的机器指令e8 d7 ff ff ff ,,e8即跳转之意,使eip(指向下一条指令)为eip + d7ffffff,便会跳过当前指令的下一条指令,执行eip+d7ffffff指向指令。
想调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码c3ffffff。
二 通过构造输入参数,造成BOF攻击,改变程序执行流
反汇编:
用gdb调试来尝试输入确定哪几个字符会覆盖掉返回地址:
尝试输入1,2,3,4,5各十个,结果显示 代码段错误,查看eip的值,确定返回地址的位置在十个4之中。
将4之前的数字不变,十个4变为123456789a,构造新的输入。查看eip寄存器的值,确定返回地址的位置。
构造合适的输入。由于我们没法通过键盘输入\x7d\x84\x04\x08,所以先生成包括这样字符串文件。然后将input通过管道符“|”,作为zwj的入造成缓存区溢出,刚好将shell的地址覆盖到了返回地址上,运行shell。