首页 > 代码库 > plaidctf-2016 Pwn试题小结

plaidctf-2016 Pwn试题小结

回顾了一下今年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/

 

plaidctf-2016 Pwn试题小结