1. 程式人生 > >ctf pwn 個人經驗記錄

ctf pwn 個人經驗記錄

前言

記錄一下自己在做pwn的過程當中學到的一些東西,以前不知道的東西等等,碰到的坑也會記錄在
這裡,主要目的是幫助自己記錄一下經驗。

其實每一道題基本上能學到的新東西是有限的,記錄下來避免什麼時候想不起來。

順序比較亂,基本上根據我做題的順序定的,比較隨意。

pwn

other place(not from ctf)

  1. 多用gdb除錯,有思路可以先寫出來除錯一下看看效果再說
  2. 遇見pie考慮寫malloc_hook,free_hook等,這些與malloc_state相關,也就是需要main_arena
  3. smallbin, largebin等非fastbin在連結串列為空時指向自己,也就是指向main_arena中,可以用來洩漏main_arena,從而得到libc

hitcon-2016

babyheap

  1. ubuntu 16.04後scanf的緩衝區會使用heap,超過大小的就會放入heap,接下來的scanf會從剛才
    heap中的緩衝區取
  2. 使用read而不是readline的時候很容易因為讀取的內容不夠(比如最多本來可以讀100個,但是我這邊
    只發了20個位元組的時候)導致後面的內容被接上去,也就是兩次send在遠端只進行了一次read,而本來
    想要的是兩次read。方法是通過sleep或者raw_input使得不連起來發,隔開就可以了。
  3. 漏洞也可能位於輸入輸出函式

ichunqiu427-2017

smallest

  1. 使用srop可以用來更改暫存器的值,從而使得能夠控制更多暫存器的值
  2. 環境變數位於棧頂,其中的字串也位於棧中,可以用來獲取大致的棧位置(比如需要可寫地址的時候)

awd-pwn2

  1. awd先補再寫exp

bctf-2017

boj

  1. system函式的引數如果可控,可以通過構造檔名來進行命令注入

babyuse

  1. choice等輸入可能位於棧上,atoi的時候只需要使用空格隔開,可以通過後面的內容控制引數

njctf

vegas

  1. c語言的rand函式是可以預測的,只要和遠端時間相同,1秒內同時開始rand的內容是一樣的

0ctf-2017

EasiestPrintf

  1. IO結構體(stdin, stdout, stderr)在程式關閉的時候會呼叫一些奇怪的函式,雖然不知道是哪個,但是反正可以試出來。。
    那麼就是可以通過修改IO結構體的虛表,來控制執行流,可以作為能拿到那三個特殊IO結構體位置
    的時候,面對PIE的時候的特殊方案。