格式化字符的漏洞利用
1.%n,%hn,%hhn
这个格式化字符串的是格式化字符串漏洞利用的核心所在,%n的作用就是把已经成功输出的字符个数写入对应的整形指针参数所指的变量。%n(一次写入四个字节),%hn(一次写入两个字节),%hhn(一次写入一个字节)。
%hh的作用是限定输出格式为8位,即一个字节;
%h的作用是限定输出格式为16位,即两个字节;
%l的作用是限定输出格式为32位,即四个字节;
%ll的作用是限定输出格式为64位,即八个字节;
2.%a
%a是以double型的16进制格式输出栈中变量,当程序开启了FORTIFY机制后(gcc -D_FORTIFY_SOURCE=2 -01),程序在编译时所有的printf函数都被_printf_chk替换了,__printf_chk和printf有两点不同:(1)不能使用%n$p不连续的打印,比如要使用%3$p,那么%1&p和%2&p需要同时使用;(2)在使用%n的时候会做一些检查。由于printf_chk无法单独使用%n&p来泄露地址,如果可输入的字符数量有限,要通过连续多个%p泄露地址就会很困难,这种情况就可以使用%a了,%a会输出栈上方的数据。
3.look_printf(来实现任意地址的任意写)
存在格式化字符漏洞
首先需要通过改printf的返回地址为read的地址以达到格式化字符串重复利用的目的,(一般不该为main函数的地址,因为会重置栈空间)其次就是需要两个指针一个指针用来修改你要写入的内容,还有一个指针用来控制你想要写的内容的地址即:
通过b可以修改c的值,而通过c可以修改d的值;我们通过b修改c所指向的地址,然后通过c修改任意值,如此就实现了任意地址的任意写。
格式化字符的漏洞利用
http://ak0er.github.io/2024/05/04/格式化字符的漏洞利用/