一般来说,栈上的格式化字符串漏洞利用步骤是先泄露地址,包括ELF程序地址和libc地址;然后将需要改写的GOT表地址直接传到栈上,同时利用%c%n
的方法改写入system或one_gadget
地址,最后就是劫持流程。但是对于BSS段或是堆上格式化字符串,无法直接将想要改写的地址指针放置在栈上,也就没办法实现任意地址写。下面介绍一下常用的非栈上格式化字符串漏洞的利用方法。
上个例题:
首先需要得到当前栈的地址和libc
的基地址,这些地址可以很轻松的在栈上找到,其中esp+0x28
存放了栈地址,esp+0x28
存放了libc
的地址,可以得到分别是第个参数和第个参数,直接传入%45$p%47$p
即可得到栈地址和libc
地址。
这里打印出地址
再次运行write_address
将0x7f38d46e4b01
写上one_gadget
地址
调试完可以看到成功打通