type
status
date
slug
summary
tags
category
icon
password
在缓冲区溢出漏洞利用基础上,理解如何进行格式化字符 串漏洞利用。 C语言中的printf()函数用于根据格式打印出字符串,使用由printf()函数的%字符标记的占位符,在打印期间填充数据。格式化字符串的使用不仅限于 printf() 函数;其他函数,例如sprintf()、fprintf()、scanf(),也使用格式字符串。某些程序允许用户以格式字符串提供全部或部分内容。
本实验涵盖以下方面:
- 程序崩溃
- 读取程序内存
- 修改程序内存
- 恶意代码注入和执行
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
:查看到目标地址为
bfffed44
,构造字符串如下:其中,
\x44\xed\xff\xbf
是低端两字节的地址,而\x46\xed\xff\xbf
是高端两字节的地址,运行:原理解释:解释参考任务2.2
2:改变var
与1同理:
原理解释:解释参考任务2.2
任务2:prog2漏洞
先编译好,准备使用:
1:Inject Shell Code
构造输入,打印栈中内容:
在结果的第17个双字处是val地址:
运行
prog2a.out
:EBP的地址是0xBFFFECB8
,目标地址是0xBFFFECD4
,需要修改的地方已经加粗(共两处),用了一下前几届的脚本:运行,请把生成的badfile拿去当输入文件input:
这一步如果做成功的话,返回地址和之前脚本中改的target值是一样的(我这里不一样是因为第一次做忘记截图了)
2:通过ret2lib获得shell
运行
prog2b.out
:EBP的地址是0xBFFFECD8查看引用libc相关地址:
结合以上结果我们可以得到信息:
- 引用库/lib/i386-linux-gnu/libc.so.6的基地址0xb7d6a000
- system函数偏移:0x0003ada0
- bin/sh offset: 0x0015b82b。
gdb查看:可知libc的加载基址:
libc的加载基址为0xb7d6a000。
在利用ret2libc攻击时,我们需要以下几个关键地址:
- system函数的地址
可以计算system函数地址为(这是我们要return的地址)
0xb7d6a000+0x0003ada0=0xb7da4da0
- "/bin/sh"字符串的地址
"/bin/sh"的地址为(这是我们在return后传递给system的参数)
0xb7d6a000+0x0015b82b=0xb7ec582b
- 返回地址和参数地址
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
3:通过GOT表劫持,调用win函数
GOT(Global Offset Table)全局偏移表用于记录在 ELF 文件中所用到的共享库中符号的绝对(真实)地址
开启ALSR:
查看got表地址和win地址:
可得GOT地址为
0x804a00c
,win地址为0x0804850b
,修改脚本代码加粗的位置(共两处):把badfile作为输入,运行:
显示了you win
- 作者:jackpai
- 链接:https://www.jackpai.life//technology/system-security-lab1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。