Skip to content

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"
Ef það er munur þá er hægt að finna restina af fánanum með því að vinna sig staf fyrir staf.


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!)