前言
比赛隐身,反思结束,从头详细记录一下,每日记录一题,第一题的nc就不用记了,所以直接从第二题rip开始。
保护模式
首先checksec看一下
64位小端序,部分地址随机化
溢出点
放进IDA看一眼
偏移计算
主函数里可以看到gets函数这个注入点,从上面的rbp-Fh判断是距离rbp寄存器还有Fh也就是15个偏移,加上rbp寄存器自身的8个偏移,也就是到返回地址需要23个偏移。
如果对IDA的数据拿不准的话,也可以放到pwndbg调试一下看看:
用cyclic创建200个字符的数据然后运行并输入:
完成后看看rbp寄存器的值:
复制其前四位然后用cyclic计算偏移:
可见确实是15偏移,加上rbp自身的8偏移就是23偏移
后门函数
然后在IDA中,我们很容易可以找到这道题的后门函数
也就是说,只需要将函数跳转到此即可,那么先看一眼fun函数的位置
攻击脚本
from pwn import *
p=remote('IP',PORT)
payload=b'a'*23+p64(0x401187)
p.sendline(payload)
p.interactive()
简单解释一下,这个脚本的作用也就是用无用字符a覆盖掉前面23个偏移地址的空间,然后将返回地址覆盖为0x401187,之所以覆盖为0x401187而不是0x401186,是因为运行的时候发现因为堆栈不平衡而运行失败(堆栈平衡请自行百度吧,要写在这里的话长度得多几倍),刚好0x401186是一个影响栈平衡的push命令,所以跳过这一步,使用0x401187即可。