Kvik greiningartól (e. Dynamic Analysis Tools)
Kvik greining þýðir að skoða forrit á meðan það er keyrt.
GDB (GNU Debugger)
GDB er aðal kembiforritið á Linux. Það leyfir þér að:
- Setja rofstaði sem stöðva keyrslu á ákveðnum línum
- Skoða minni og gista á meðan keyrslan stöðvast
- Keyra eina skipun í einu
GDB viðbætur
GDB er kröftugt en gróft í grundvallarútgáfu. Þrjár vinsælar viðbætur bæta sjálfkrafa við skjám með gistum, stafla og kóða:
| Viðbót | Uppsetning |
|---|---|
| pwndbg | https://pwndbg.re/stable/setup/ |
| GEF | https://hugsy.github.io/gef/install/ |
| peda | https://github.com/longld/peda#installation |
Þessar leiðbeiningar gera ráð fyrir pwndbg en skipanirnar eru að mestu leyti þær sömu í öllum þremur.
Grunnskipanir
gdb ./challenge # Opnar forrit í GDB
Innan GDB:
| Skipun | Styttingur | Lýsing |
|---|---|---|
run |
r |
Keyrir forritið |
run < input.txt |
Keyrir með inntaksskrá | |
break main |
b main |
Setur rofstað á main |
break *0x401234 |
b *0x401234 |
Stöðvunarmark á vistfang |
continue |
c |
Heldur áfram eftir stöðvun |
next |
n |
Keyrir eina línu (fer ekki inn í föll) |
step |
s |
Keyrir eina línu (fer inn í föll) |
finish |
Keyrir þar til núverandi fall lýkur | |
attach <pid> |
Tengist keyrandi ferli sem er þegar í gangi | |
set follow-fork-mode child |
Fylgir dóttuferli þegar fork() er kallað |
|
quit |
q |
Hættir úr GDB |
Skoða minni og gista
# Skoða gista
info registers # Sýnir alla gista
print $rax # Sýnir gildi rax
print/x $rax # Sýnir í hex
# Skoða minni með x skipuninni: x/[fjöldi][stærð][snið] [vistfang]
# Stærð: b=1 byte h=2 w=4 g=8
# Snið: x=hex d=decimal s=string i=instructions
x/10gx $rsp # 10 × 8-byte gildi við rsp (hex)
x/s 0x402000 # Strengur á vistfangi
x/20i $rip # Næstu 20 assembly skipanir
# pwndbg sérstakar skipanir
telescope $rsp # (einnig: tele) Sýnir staflinn fallega
disassemble main # Sýnir assembly fyrir fall
# Minniskort forritsins
info proc map # Sýnir hvaða svæði eru hlaðin (stack, heap, libc, ...)
Breyta minni og gistum
set $rax = 0 # Setur rax í 0
set *0x404000 = 0x1234 # Skrifar á vistfang
Dæmi: Greining á lykilorðsathugun
gdb ./challenge
b strcmp # Stöðva þegar strcmp er kallað
r # Keyra
# ... forritið biður um lykilorð, slá inn 'test' ...
# Kembiforritið stöðvast við strcmp
x/s $rdi # Skoða 1. frumgildi (inntakið okkar)
x/s $rsi # Skoða 2. frumgildi (rétta lykilorðið!)
ltrace
Hlerar köll á bókasafnsföll á meðan forritið keyrir.
ltrace ./challenge
Dæmi um úttak:
puts("Sláðu inn lykilorðið: ") = 23
fgets(0x7ffd..., 64, stdin) = 0x7ffd...
strcmp("test\n", "swordfish\n") = -1
puts("Rangt lykilorð") = 15
Tip
ltrace sýnir þér oft lykilorð og samanburðargildi beint! Prófaðu alltaf ltrace ./challenge fyrst.
strace
strace hlerar kerfiskall, þ.e. samskipti forritsins við stýrikerfið.
strace ./challenge
strace -e openat,read,write ./challenge # Sía eftir tegund kalls
Gagnlegt til að sjá:
- Hvaða skrár forritið les
- Net tengingar
- Minniúthlutun
perf: Timing Side Channel
perf getur talið CPU skipanir. Þetta er notað í timing side channel verkefnum, þar sem forritið eyðir lengri tíma í að athuga réttar stafir.
Gefið að þú veist fyrstu stafina í fánanum t.d. FLAG{ þá er hægt að prufa jafn langan streng sem er vitlaus til að athuga hvort það sé mikill munur á fjölda skipana
perf stat -e instructions ./challenge <<< "FLAG{"
perf stat -e instructions ./challenge <<< "AAAAA"
Binary Patching (tvíundaskráarlögun)
Stundum er einfaldast að laga tvíundaskrána beint í stað þess að skilja allt reiknirit.
Dæmi: Breyta hoppi
Ef forritið gerir jne wrong_path þar sem við viljum alltaf fara í correct_path:
# Með radare2
r2 -w ./challenge # -w = write mode
s 0x401234 # Hoppa á vistfang jne skipunarinnar
wx 90 90 # Skrifa NOP NOP (0x90 = NOP = "gerðu ekkert")
# eða breyta í jmp
# Með Python og pwntools
from pwn import *
elf = ELF('./challenge')
elf.asm(0x401234, 'jmp 0x401260') # Breyta skipun á vistfangi
elf.save('./challenge_patched')
Í binary ninja er hægt að hægri smella á línu og velja "Patch" best að gera í assembly view.
TODO ADD GHIDRA/IDA
NOP sled
NOP (No Operation, opcode 0x90) gerir ekkert, keyrir og fer í næstu skipun. Mjög gagnlegt til að "hoppa yfir" athuganir:
Upprunalegt: cmp rax, rbx → jne fail → ...
Patchað: cmp rax, rbx → NOP NOP → ... (alltaf áfram!)