当尝试遵循有关C语言中的字符串利用的教程时,我遇到以下问题,但似乎找不到答案。
$(python -c 'print "\x40\x99\x04\x08%238x%10$hn"')
答案 0 :(得分:2)
1)%10$n
未写,它是一种格式说明符。而且它没有输出,只有副作用,它可以将输出到该说明符的字符数 写入printf的第10个参数提供的整数。由于您没有为printf提供10个参数,因此它将从堆栈中获取其他内容并将其用作地址。该教程似乎假设AAAA
位于此处,并被解释为地址0x41414141。
2)%hn
表示不要在给定地址写入整数(通常为4个字节),而仅写入一个短值(通常为2个字节)。用这种方法写入2个2字节的值而不是1个4字节的值会更容易,因为您必须打印最多4M个字符才能写入所需的值。