20145221《网络对抗》PC平台逆向破解
2017-02-28 21:38
183 查看
20145221《网络对抗》PC平台逆向破解
实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
实践要求
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分)掌握反汇编与十六进制编程器 (1分)
能正确修改机器指令改变程序执行流程(1分)
能正确构造payload进行bof攻击(2分)
Optional:进阶,shellcode编程与注入
实践两种方法
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
其实我们还可以做的更多,比如说注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标
运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。
基础知识
NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)JNE:条件转移指令,如果不相等则跳转。(机器码:75)
JE:条件转移指令,如果相等则跳转。(机器码:74)
JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
策略1:直接修改程序机器指令,改变程序执行流程
反汇编,了解程序的基本功能
键入指令:objdump -d 20145221 | more
找到该程序的关键函数(暂不考虑其余库函数),如下图
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213156579-1457542581.jpg)
根据上图易知,程序通过main函数入口开始执行代码,然后main函数会调用foo函数(功能为:将用户输入的字符回显在屏幕上),其中还有一个没有调用的getshell函数(功能为:打开一个可用Shell),显然如果程序正常执行,是不会运行getshell函数部分的,而我们就是要通过修改程序机器指令,达到改变程序执行流程的目的。
直接修改机器码
所以,最基本的思路就是让main函数不再调用foo函数,转而调用getshell函数。观察如下代码:root@KaliYL:~# objdump -d pwn1 | more 0804847d <getShell>: 804847d: 55 push %ebp ... 08048491 <foo>: 8048491: 55 push %ebp ... 080484af <main>: ... 80484b5: e8 d7 ff ff ff call 8048491 <foo> 80484ba: b8 00 00 00 00 mov $0x0,%eax ...
首先我们要找到call指令机器码与汇编代码的关系如下:
0x80484ba + 0xd7ffffff = 0x8048491,其中机器码e8表示call
将上述计算式抽象出来可得:
call机器码 = 跳转地址 - call指令的下一个eip
由此我们计算调用getshell函数的机器码为:
e8 c3 ff ff ff
接下来我们只需要修改机器码即可:
Step1:
vi 20145221,用vim编辑器查看可执行文件20145221;
Step2:
%! xxd,进入vi编辑模式后,发现乱码,键入前述指令查看其16进制表示;
Step3:
/e8 d7,查询需要改动的机器码的位置,锁定后,按
i进入文本编辑模式,将其改为
e8 c3
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213418688-1401275271.jpg)
Step4:
%! xxd -r,退出16进制模式(注意:此处如果直接以16进制形式保存退出,运行该文件会报错)
Step5:
:wq!,保存并退出。
此时,我们可以再用反汇编指令查看其机器码,不难发现此时已经改变了原代码。
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213432141-1205879896.jpg)
退出到终端,执行指令:
./20145221,结果如下:
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213440641-1499706833.jpg)
策略2:通过构造输入参数,造成BOF攻击,改变程序执行流
反汇编,了解程序的基本功能
同上,不赘述。确认输入字符串哪几个字符会覆盖到返回地址
通过观察foo函数的汇编代码,不难发现其存在BOF漏洞,那我们需要输入多少字符才会造成BOF呢?在此,我们采用每个字节的进行输入,观察程序什么时候崩溃。经试发现,当输入达到28字节产生溢出
Segmentation fault。
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213450860-882078461.jpg)
现在能明确该程序有BOF了,接下来我们接着往后输入,观察什么时候可以覆盖其返回地址,让程序调用完foo函数后走向getshell函数,就能达到目的了。在此,我们使用用GDB调试工具。
GDB调试,确认用什么值来覆盖返回地址
gdb 20145221,进入调试,并输入一串可让其溢出的字符;
info r,查看溢出时寄存器状态如下:
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213504423-1966768266.jpg)
不难发现,此时“1234”覆盖了其新的eip,所以我们只需要将getshell的内存地址替换这4个字符,就可以达到程序向getshell函数转移的目的。
构造一串特殊的输入,由于getShell的内存地址是
0x0804847d,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值。
perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input
注意:kali系统采用的是大端法,所以构造内存地址时注意顺序,末尾的
\0a表示回车换行。
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213515501-1214039024.jpg)
(cat input; cat) | ./20145221,将input文件作为输入,结果如下:
![](https://images2015.cnblogs.com/blog/877163/201702/877163-20170228213524298-244092392.jpg)
实践总结
本次实践是我第一次体会到BOF攻击的效果,之前都是理论的学习,知道有这么一个漏洞,但缺少实践的训练。此次通过特殊构造的“20145221”文件,利用2种不同的方法,达到了获取shell的目的,还是很有趣的。但老师结束时也提到,这个只是简单的训练,真正的BOF是结合了shellcode编程与注入,这一点还有待加强,需要继续努力学习。
相关文章推荐
- 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验
- 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验
- 20145219《网络对抗》PC平台逆向破解
- 20155326刘美岑 《网络对抗》Exp1 PC平台逆向破解
- 20155227《网络对抗》Exp1 PC平台逆向破解(5)M
- 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解
- 20145240《网络对抗》PC平台逆向破解_advanced
- 20145201李子璇《网络对抗》PC平台逆向破解
- 20145221高其_PC平台逆向破解_advanced
- 2017-2018-2 《网络对抗技术》 20155322 第二周 Exp1 PC平台逆向破解(5)M
- 2017-2018-2 20155315《网络对抗技术》Exp1:PC平台逆向破解
- 20145219《网络对抗技术》PC平台逆向破解之逆向与Bof基础
- 20155321 《网络攻防》 Exp1 PC平台逆向破解(5)M
- 20155301PC平台逆向破解
- 20145302张薇《网络对抗技术》PC平台逆向破解
- 20145234黄斐《网络对抗技术》PC平台逆向破解
- 20145336张子扬 《网络对抗技术》 PC平台逆向破解
- 2017-2018-2 《网络对抗技术》 20155302 第二周 Exp1 PC平台逆向破解(5)M
- 20145218PC平台逆向破解
- 20145333 《网络对抗技术》 PC平台逆向破解