Lazy loaded image
技术分享
信息系统安全实验(1/3)
00 分钟
2024-6-21
2024-8-29
type
status
date
slug
summary
tags
category
icon
password
在缓冲区溢出漏洞利用基础上,理解如何进行格式化字符 串漏洞利用。 C语言中的printf()函数用于根据格式打印出字符串,使用由printf()函数的%字符标记的占位符,在打印期间填充数据。格式化字符串的使用不仅限于 printf() 函数;其他函数,例如sprintf()、fprintf()、scanf(),也使用格式字符串。某些程序允许用户以格式字符串提供全部或部分内容。
本实验涵盖以下方面:
  1. 程序崩溃
  1. 读取程序内存
  1. 修改程序内存
  1. 恶意代码注入和执行

lab1

任务1:prog1漏洞

1:改变var

使用环境为SEEDUbuntu 16
关闭地址随机化ALSR,注意不要重启,不然这条命令会失效:
打开prog1.c,使用第一行代码的输入,注释掉第二行,这样回车就能完成字符串输入:
编译:gcc -no-pie -z execstack -o prog1.out prog1.c
先使用格式化字符串漏洞打印堆栈里的内容:%x %x %x %x %x %x %x %x
notion image
查看到目标地址为bfffed44,构造字符串如下:
其中,\x44\xed\xff\xbf是低端两字节的地址,而\x46\xed\xff\xbf是高端两字节的地址,运行:
notion image
原理解释:解释参考任务2.2

2:改变var

与1同理:
notion image
原理解释:解释参考任务2.2

任务2:prog2漏洞

先编译好,准备使用:

1:Inject Shell Code

构造输入,打印栈中内容:
在结果的第17个双字处是val地址:
notion image
运行prog2a.out:EBP的地址是0xBFFFECB8,目标地址是0xBFFFECD4,需要修改的地方已经加粗(共两处),用了一下前几届的脚本:
运行,请把生成的badfile拿去当输入文件input:
notion image
这一步如果做成功的话,返回地址和之前脚本中改的target值是一样的(我这里不一样是因为第一次做忘记截图了)

2:通过ret2lib获得shell

运行prog2b.out:EBP的地址是0xBFFFECD8
查看引用libc相关地址:
notion image
notion image
notion image
结合以上结果我们可以得到信息:
  • 引用库/lib/i386-linux-gnu/libc.so.6的基地址0xb7d6a000
  • system函数偏移:0x0003ada0
  • bin/sh offset: 0x0015b82b。
gdb查看:可知libc的加载基址:
notion image
libc的加载基址为0xb7d6a000。

在利用ret2libc攻击时,我们需要以下几个关键地址:
  1. system函数的地址
可以计算system函数地址为(这是我们要return的地址)
0xb7d6a000+0x0003ada0=0xb7da4da0
  1. "/bin/sh"字符串的地址
"/bin/sh"的地址为(这是我们在return后传递给system的参数)
0xb7d6a000+0x0015b82b=0xb7ec582b
  1. 返回地址和参数地址
ebp=0xbfffecd8
返回位置为ret=ebp+4=0xbfffecdc
参数位置为ebp+12=0xbfffece4

开始构造输入input:
输入字符串部分:四个位置是返回地址和参数地址各自的高端和低端
格式化字符串部分:将想要的地址写入到上面的地址位置
  • %08x:每个占位符用于跳过一个参数(共15个%08x跳过前面的参数和填充值)。
  • %19724x:打印19724个字符,使得当前写入的位置正好为0xb7da(system函数地址的高位)。
  • %hn:将19724写入到目标地址。
  • %2699x:打印2699个字符,使得当前写入的位置正好为0x4da0(system函数地址的低位)。
  • %hn:将2699写入到下一个目标地址。
  • %24495x:打印24495个字符,使得当前写入的位置正好为0xec58("/bin/sh"字符串地址的高位)。
  • %hn:将24495写入到下一个目标地址。
  • %18x:打印18个字符,使得当前写入的位置正好为0x582b("/bin/sh"字符串地址的低位)。
  • %hn:将18写入到最后一个目标地址。
计算过程:以值19724为例:
这个值是怎么得来的:首先需要写入的字节数是19872(4da0),由于19872比47066小,所以最前面要加上十六进制1,新字符数应为47066 + (65536 - 47066) + 19872 = 19724
notion image

3:通过GOT表劫持,调用win函数

GOT(Global Offset Table)全局偏移表用于记录在 ELF 文件中所用到的共享库中符号的绝对(真实)地址
开启ALSR:
查看got表地址和win地址:
notion image
可得GOT地址为0x804a00c,win地址为0x0804850b,修改脚本代码加粗的位置(共两处):
把badfile作为输入,运行:
notion image
显示了you win
上一篇
soot框架:分析apk文件与class文件
下一篇
信息系统安全实验(2/3)