[摘要]★★ 二格式化字符串篇 测试环境 redhat 6.2 glibc 2.1.3 ★ 2.1 演示一 /* fs1.c* * specially ...
★★ 二格式化字符串篇
测试环境 redhat 6.2 glibc 2.1.3
★ 2.1 演示一
/* fs1.c*
* specially crafted to feed your brain by gera@core-sdi.com */
/* Don't forget,*
* more is less,*
* here's a proof */
int main(int argv,char **argc) {
short int zero=0;
int *plen=(int*)malloc(sizeof(int));
char buf[256];
strcpy(buf,argc[1]);
printf("%s%hn\n",buf,plen);
while(zero);
}
利用方法:
这个程序构造的很巧妙,如果我们需要从这个程序中得到控制的话,
我们需要把strcpy和printf都利用起来。
我们的目标:覆盖main函数的返回地址,需要使zero为0,然而,单单strcpy
是不可能实现的,所以我们需要利用后面的
printf("%s%hn\n",buf,plen);
把short int 类型的zero设置为0。所以我们需要精心构造argc[1].
★ 2.2 演示二
/* fs2.c*
* specially crafted to feed your brain by gera@core-sdi.com */
/* Can you tell me what's above the edge? */
int main(int argv,char **argc) {
char buf[256];
snprintf(buf,sizeof buf,"%s%c%c%hn",argc[1]);
snprintf(buf,sizeof buf,"%s%c%c%hn",argc[2]);
}
假如我们现在来覆盖main的返回地址:0xbffffb6c,
假使shellcode地址为:0xbffffc88
开始构造模板
第一次我们构造argc[1]的时候需要使argc[1]长度为0xbfff-2
那使构造argc[1]内容为
aaaa
关键词:非安全编程演示之格式化字符串篇