首先,查看程序的保护机制

然后拖入IDA分析
知识点1
在linux shell中,假如有如下语句,这就是shell注入方面
echo ‘’;ls;cat 1.txt;/bin/sh;’’
则ls、cat 1.txt、/bin/sh这三个命令会依次执行,这也就是本题突破的关键
知识点2
C语言或C++ 申请内存后,用free或delete释放堆后,指针的值还在,如果不手动设置为NULL,就可以被我们利用。
堆内存的分配有规律,我们用如下的代码做试验
本题,用checksec检查二进制,发现开启了CANARY、NX、以及RELRO保护,CANARY是用来检测栈溢出的,canary是一个随机数,存储在栈里。程序通过对比栈里的canary值和读取到的实际canary值进行对比,如果不相等,则抛出异常。因此,为了绕过canary机制,我们需要先想泄露canary的值,然后利用栈溢出,把这个值放到payload中对应的位置里,这样,程序发现canary的值没变,我们就成功绕过。
我们知道 x86都是靠栈来传递参数的 而x64换了 它顺序是rdi, rsi, rdx, rcx, r8, r9, 如果多于6个参数 才会用栈 我们要先知道这个特性
这题,里面既没有现成的system也没有/bin/sh字符串,也没有提供libc.so给我们,那么我们要做的就是想办法泄露libc地址,拿到system函数和/bin/sh字符串,这题呢,我们可以利用put来泄露read函数的地址,然后再利用LibcSearcher查询可能的libc。
这题ROP,我们先构造payload来执行puts函数泄露read的地址
popedi是pop edi这条指令所在的地址,我们可以在二进制文件里查找,发现了地址0x400763处可以供我们使用,然后我们传入read的got地址,接下来是popedi的返回地址,我们设为putaddr,接下来是puts的返回地址,我们设为mainaddr,这样我们又能重新执行主函数,执行第二次rop
以下payload相当于