CTF[Pwn] i春秋學習筆記


buffer overflow

堆溢出、棧溢出、bss溢出、data溢出

例題:wellpwn\AliCtf 2016 vss\Hitcon 2015 readable\stkof\zerostorage

整數溢出

  • 無符號數和有符號的轉換(MIMA 2016 shadow)
  • 整數加減乘除法,malloc(size*2)(pwnhbu.cn calc)
  • 整數溢出通常會進一步轉換為緩沖區溢出、邏輯漏洞等其他漏洞

格式化字符串

  • printf sprintf fprintf 任意地址讀寫
  • 用來leak

釋放后使用(Use-After-Free)

  • 釋放掉的內存可能會被重新分配,釋放后使用會導致重新分配的內存被舊的使用所改寫
  • Double free就是一種特殊的UAF
  • 例題: Defcon 2014 Qual shitsco,AliCTF 2016 router,0CTF2016 freenote(double free),HCTF 2016 fheap(double free)

邏輯漏洞

  • 訪問控制
  • 協議漏洞
  • 多線程競態條件等(fakefuzz)

還原結構體、接口、類

理清程序的執行邏輯

熟悉常見的數據結構 鏈表、樹、堆、圖等各種加密算法



了解各個寄存器的作用

rsp/esp pc rbp/ebp rax/eax rdi rsi rdx rcx

棧用於保存函數的調用信息和局部變量


函數調用:call,rer

調用約定:

__stdcall,__cdecl,__fastcall,__thiscall,__nakecall,__pasccal

參數傳遞:取決於調用約定,默認如下

  • X86從右向左入棧
  • X64優先寄存器,參數過多才入棧

函數調用的過程

call func: push pc,jmp func

Leave : mov esp,ebp ,pop ebp

Ret :pop pc

棧溢出的保護機制

棧上的數據無法被當成指令來執行

  • 數據執行保護(NX/DEP)
  • 繞過方法:ROP

讓攻擊者難以找到shellcode地址 #不知道返回地址

  • 地址空間布局隨機化(ASLR)
  • 繞過方法: infolleak,ret2dlresolve,ROP

檢測Stack Overflow

  • Stack Canary/Cookie(Cookie泄露)
  • 繞過方法 infoleak

棧溢出的利用方法

現代棧溢出的技術基礎:ROP(繞過NX和ASLR)

利用signal機制的ROP技術:SROP

沒有binary怎么辦: BROP(不是很常見)

劫持棧指針 :stack pivot #將棧指針劫持到其他區域

利用動態鏈接繞過ASLR:ret2dlresolve、fake linkmap

利用地址低12bit繞過ASLR:Partial Overwrite(低12位不會被隨機化)

繞過Stack canary:改寫指針與局部白能量、leak canary、overwrite canary

溢出位數不夠怎么辦:覆蓋ebp,Partial Overwrite

現代棧溢出的利用技術ROP 代碼復用技術

google關鍵字 Ret2libc,ROP

CTF中ROP常規套路

  • 第一次觸發漏洞,通過ROP泄露libc的address(如puts_got),計算system地址 然后返回到一個可以重現觸發漏洞的地方(main)再次觸發漏洞。通過ROP調用system(‘/bin/sh’)
  • 直接execve(“/bin/sh”,[“/bin/sh”],NULL) 這個通常在靜態鏈接比較常用

例題:Defcon 2015 Qual:R0pbaby AliCTF 2016:vss PlaidCTF  2013:ropasaurusrex


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM