回顾了一下今年plaidctf Pwn部分的题目,感觉还是蛮有意思的,值得研究一下。
1.unix_time_formatter-76
最简单的一道题,考点是UAF。说是UAF但是其实根本就不算是真正的UAF利用,无非就是对释放的内存块进行同大小的占位。因为程序中会把内存块的内容作为system函数的参数,所以只要重新占位并写入/bin/sh就可以了,这道题还是相当简单的。
2.butterfly-150
这道题比较有趣。详细的看了一下。
int __cdecl main(int argc, const char **argv, const char **envp) { setbuf(_bss_start, 0LL); puts("THOU ART GOD, WHITHER CASTEST THY COSMIC RAY?"); if ( fgets(&buf, 50, stdin) ) { v4 = strtol(&buf, 0LL, 0); v5 = v4; v6 = v4 >> 3; bianhuan = (v4 >> 3) & 0xFFFFFFFFFFFFF000LL; if ( mprotect((void *)bianhuan, 4096uLL, 7) ) { perror("mprotect1"); } else { v3 = 1; *(_BYTE *)v6 ^= 1 << (v5 & 7); if ( mprotect((void *)bianhuan, 0x1000uLL, 5) ) { perror("mprotect2"); } else { puts("WAS IT WORTH IT???"); v3 = 0; } } } }
这道题的所有代码就只有这么多,并不存在我们通常认识的漏洞,此题的考点是位翻转的利用
buf是栈上空间,简单的来说就是获取一个整数,然后把这个数作为地址去做一个位运算。有趣的是在位运算之前对地址增加w权限,运算之后又关闭w权限。
由这个权限变化我首先想到的就是对指令进行写操作,因为一般来说没有写权限的地址太少了,题目特意给了写权限就是让我们去写指令。其中对EIP的劫持也很有趣,需要对opcode有比较深入的了解。
具体的利用步骤参见:http://r0p.club/2016/butterfly/