protostar_format2

 
格式化字符串漏洞,出现于2000年左右,格式化字符串漏洞总之就是利用c语言中的printf一类函数的“格式输出”的漏洞。
printf(string); 和 printf("%s",string);是不一样的!
常见的格式函数有:
 
等等。
格式化字符串除了可以用%来表示,也可以通过\x25来表示,因为\是转义字符。
比如:printf ("The magic number is: \x25d\n",23);
然后文中举例,说格式化字符串漏洞和其他很多漏洞一样是“数据”和“控制”的混淆
 
 
format string 首先可以让程序崩溃:
 
这样,程序很容易就崩溃了。
 
format string的另一个用处就是查看内存
查看栈中的内容:
 
定位任何一个位置的内存:
就是我们在format level 1 中进行的操作:
 
然后我们找到AAA0的那个位置,选择%08x的个数,然后
  
 
format string 还可以写任意的内存
 
1. 和缓冲区溢出相似的方式
%数字d,表示以数字那么长的宽度输出一个整数。
如果程序对输出的宽度有限制,我们可以通过向里面加入大量的    %数字d    的方式打破这个限制
然后通过溢出的方式,改变返回地址
 
2. 通过纯的格式化字符串方式
比如通过snprintf函数,

int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);

函数说明:最多从源串中拷贝n1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

通过%n来实现

 

 

几种常用的手段:

 

short write

 

 

stack poping
 
Direct Parameter Access
通过$来实现对第几个参数的选择
 
 
 
 
所以,target的位置是 0x080496e4,要把这个位置的内容改为64的!
测试位置:
所以,先试一下能不能修改得到:
 
能的!64-27 = 37
 
随便加上37个字符就可以了!
 
 
 
 
 
 
 





posted @ 2013-08-08 11:18  二哥拉手网  阅读(264)  评论(0编辑  收藏  举报