0%

house_of_husk

攻击方式

house_of_husk是针对带格式化字符输出printf函数的一种攻击

可以实现控制rip

适用版本2.23-至今

攻击方法

printf会输出前检查是否有自定义格式化字符

方法是通过两个表:

  • __printf_function_table

  • __printf_arginfo_table

  1. 先将__printf_function_table的值置为非空

Untitled

  1. 然后将__printf_arginfo_table挟持到我们可控的地址

Untitled

往可控的地方写值,这个有讲究(

最终会调用到__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即可

Untitled

其控制流为:

printf→vfprintf→printf_positional→__parse_one_specmb→RIP

攻击原理

printf会检查是否有自定义格式化字符(检查的就是__printf_function_table是否为空,如果不为空,则代表有自定义格式化字符,然后就会放弃默认输出方式,而去找__printf_arginfo_table里面的调用函数

将此两表挟持,即可成功控制RIP