plaidctf-2016 Pwn試題小結

Ox9A82發表於2016-11-21

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

 

相關文章