0%

本题是一个栈溢出题,难点在于开启了PIE,因此里面的函数地址是随机的。

溢出点在这里

阅读全文 »

首先用IDA查看

发现主函数不能栈溢出,我们看看echo这个函数

阅读全文 »

本题,首先,为了方便调试,我们需要解决alarm clock问题

程序运行几十秒后就会自动退出,所以,为了方便调试,我们需要先修改一下这个二进制

阅读全文 »

Libc2.26以下的解法

使用的是double free的unlink漏洞

unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原来free的堆块在原来的链表中解链,加入新的链表中,但这样的合并是有条件的,向前或向后合并。

阅读全文 »

知识点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相当于

阅读全文 »