Skip to content

angrop automatic ROP

angrop'u — angr tabanlı bir ROP-chain builder'ı — kullanarak gadget'ları symbolic execution ile keşfet ve register-setting / memory-writing / function-call chain'lerini otomatik olarak sentezle.

Mechanism

Note

angrop, angr'ın symbolic execution engine'i üzerine kuruludur. Gadget'ları opcode'a göre pattern-match etmek yerine, find_gadgets() aday gadget'ları enumerate eder ve her gadget'ın etkisini symbolic olarak modeller (hangi register'ları/memory'yi set ettiği, stack delta'sı, side effect'leri). "rdi=X, rsi=Y set et, sonra f'i çağır" gibi bir hedefi karşılamak için angrop modellenen gadget graph'ında arama yapar ve constraint solver'ı kullanarak istenen machine state'i oluşturmak üzere kompoze olan gadget'ları ve stack value'larını seçer. Akıl yürütme symbolic ve büyük ölçüde architecture-agnostic olduğu için angrop, angr'ın desteklediği birden çok mimariyi hedefleyebilir — README x86/x64, ARM, AArch64, MIPS ve RISC-V (64-bit) desteğini listeler. Ancak synthesis olgunluğu mimariden mimariye değişebilir; güncel destek durumu ve daha az yaygın hedeflerdeki (MIPS, RISC-V) sınırlamalar için README'ye bak.

Walkthrough

import angr, angrop

proj = angr.Project("./target", auto_load_libs=False)
rop  = proj.analyses.ROP()
rop.find_gadgets()            # symbolic gadget discovery (cache with find_gadgets_single_threaded for debugging)

# set registers
chain = rop.set_regs(rax=0x3b, rdi=0)
print(chain.payload_str())    # raw bytes
chain.print_payload_code()    # python source for the chain

# write data into memory, then call a function
chain2 = rop.write_to_mem(0x61b000, b"/bin/sh\x00")
chain3 = rop.func_call("system", [0x61b000])

Tipik akış:

  1. find_gadgets() bir kez (pahalı; sonuçlar analysis object'inde cache'lenir).
  2. Hedefleri set_regs(...), write_to_mem(...), func_call(...) ya da add_to_mem(...) ile kompoze et; angrop concatenate edebileceğin bir RopChain döndürür.
  3. payload_str() (bytes) ya da print_payload_code() (pwntools'a hazır source) ile çıktı al.

Warning

Gadget discovery büyük binary'lerde yavaştır ve basic-block sınırlarını aşan ya da olağandışı stack pivot'lar gerektiren gadget'ları kaçırabilir; README, gadget'ların "self-contained" olup olmadıklarına göre sınıflandırıldığını belirtir. Üretilen chain'i gerçek binary'ye karşı doğrula — symbolic side effect'ler (flag'ler, clobber edilen register'lar) varsayımları bozabilir.

Detection

  • Target içi bir teknik değil; bu offensive tooling'dir. Savunma ilgisi, shadow stack'ler (CET), CFI ve ASLR tarafından yakalanan ortaya çıkan ROP chain'lerindedir.

Mitigation

  • CET shadow stack / IBT, fine-grained CFI ve güçlü ASLR, angrop'un ürettiği herhangi bir chain için çıtayı yükseltir.

References