攻击方式
house_of_husk是针对带格式化字符输出printf函数的一种攻击
可以实现控制rip
适用版本2.23-至今
攻击方法
printf会输出前检查是否有自定义格式化字符
方法是通过两个表:
-
__printf_function_table
-
__printf_arginfo_table
-
先将__printf_function_table的值置为非空
-
然后将__printf_arginfo_table挟持到我们可控的地址
往可控的地方写值,这个有讲究(
最终会调用到__printf_arginfo_table[index]
这个index和格式化字符的有关:
比如%d → ord(’d’) → 100
%s → ord(’s’) → 115
所以挟持__printf_arginfo_table的时候,比如格式化字符是%d
那我们就弄成=
1 | __printf_arginfo_table = control_addr - ord('d')*8 |
然后往control_addr里面写入RIP即可
其控制流为:
printf→vfprintf→printf_positional→__parse_one_specmb→RIP
攻击原理
printf会检查是否有自定义格式化字符(检查的就是__printf_function_table是否为空,如果不为空,则代表有自定义格式化字符,然后就会放弃默认输出方式,而去找__printf_arginfo_table里面的调用函数
将此两表挟持,即可成功控制RIP