记录一下新的知识点:栈迁移,之前没有遇到过。
第一步:checksec
32位,开了RELRO和NX
第二步:代码审计,用IDA打开
首先main函数里没什么重要的信息,看一下里面的子函数
可以看到有read,而且有两次,但是s距离ebp的距离是0x28,虽然可以溢出0x30,但是也只可以多溢出ebp和ret。这里肯定能想到基础的ROP是不可以使用的。
接着发现程序里有hack函数
程序中调用了system函数,但是传入的参数echo flag,这里就开始没思路了。
所以看了大佬的博客,看到了之前没有见过的攻击手法。
第三步:栈迁移利用
首先栈迁移的关键是知道ebp的地址,由于有read函数还有printf函数,如果我们将ebp之前的地址全覆盖并且不加"\x00"的话,就可以将ebp的地址打印出来,这样就可以得到ebp的地址了。在send的时候,不能用sendline。
然后gdb,查看read函数读入的地址
栈的构造大概是这样将ret的地址中填入leave_ret的地址将其返回到AAAA,接着ret到system,接着执行。
第四步:构造exp