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, ...);
函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。
通过%n来实现
几种常用的手段:
short write
stack poping
Direct Parameter Access
通过$来实现对第几个参数的选择
所以,target的位置是 0x080496e4,要把这个位置的内容改为64的!
测试位置:
所以,先试一下能不能修改得到:
能的!64-27 = 37
随便加上37个字符就可以了!