ZCTF-2015_pwn
看了ctf特训营的pwn堆,里面有zctf-2015的题目那就写一下吧。
ZCTF-2015-note1
题目链接:https://github.com/z1r00/zctf-2015/blob/main/attach.zip
没开PIE,可以改GOT。
进IDA里面分析一下吧。漏洞点是下面这个红色框里,输入content时可以有512个字节。但是在创建时只有256个大小(溢出太大了。)分析得出结构体
1 | QWORD Link1; //8byte前向指针 |
因为有堆溢出先创建三个chunk。接下来修改第一个chunk进行溢出,只要伪造一个前向指针和后向指针就可以了。给他指向atoi_got - 0x80,再show一下就可以看到malloc的地址了。libc_base出来之后修改伪造的地方为system,将atoi修改成system,接下来menu之后写入/bin/sh就可以执行system(‘/bin/sh’);
1 | from pwn import * |
ZCTF-2015-note2
看一下保护吧。
可以改got表,pie没有开。
进IDA分析一下吧。
1 | unsigned __int64 edit() |
漏洞点出在了edit这个函数。在edit时,选择append的时候就会产生越界。如果size开始为0.则size-strlen(dest)+14 <=14了,所以在执行strncat时可以无限附加覆盖下一个堆块。所以我们申请fastbin,因为可以覆盖后面的堆块,可以在name中伪装为假堆块,然后对其进行释放这样再申请时就会得到其地址,从而改写指针。
exp
1 | from pwn import * |
zctf-2015-note3
漏洞点上和一个note2有一相同之处,-1就可以覆盖堆。这题没有泄露函数,所以可以将puts给弄进去。unlink attack 将puts和free和atoi放到2020c0里。因为6020c0里面存放的是指向content的地址,先替换掉delete函数改为puts,执行puts(puts_got)搞定libc_base。接着改atoi_got为system_addr输入/bin/sh进行getshell。
exp
1 | from pwn import * |