本人也是在自学过程,主要目的也是记录学习过程,有些地方做的不太好,都是按照自己理解进行讲解的(不专业),欢迎大家指出问题
此处我将文件命名为pwn
checksec pwn 查看一下保护机制

可以看到这是一个64-bit的文件,NX保护开启
将文件拖入ida64,按F5将汇编代码转换成c语言代码,得到

可以看到存在printf(&s)格式化字符串漏洞,并且经计算得到:当judge=2时if语句成立,得到shell。所以我们可以利用格式化字符串漏洞来将judge的值改写成2
双击judge
![]()
得到judge_addr = 0x60105c
返回虚拟机
./pwn
aaaaaa.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p

可以看到第一个a在第7个参数里,剩余的五个a在第8个参数里,所以我们在输入judge_addr之前需要先输入一个a来占位。
并且这是一个64位的格式化字符串漏洞,我们需要将地址写在payload的最后。在地址前先输入9字节的内容,占据第七个参数的一部分和第八个参数,那么地址就在第9个参数。讲的有点乱,直接看exp,就懂了。
nano exp.py

两个a是让judge等于2,三个A是用来占位的,aa%9$nAAA总共9字节
保存退出
python3 exp.py
cat flag

此题完




