ELF binary statik analiz — file, strings, objdump, readelf, nm, Ghidra workflow
Scanned 9/8/2026
Install to Claude Code
npx -y skills add MustafaKemal0146/fetih --skill elf-static-analysis --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Elf Static Analysis?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/mustafakemal0146-elf-static-analysis)More formats (shields.io, HTML) on the badges page.
---
name: elf-static-analysis
description: ELF binary statik analiz — file, strings, objdump, readelf, nm, Ghidra workflow
tags: [ctf, rev, elf, static-analysis, strings, objdump, ghidra, ida, binary-analysis]
triggers:
- "ELF binary"
- "binary analiz"
- "tersine mühendislik"
- "reverse engineering"
- "./binary çalıştır"
- "stripped binary"
- "strings komutu"
- "disassembly"
difficulty: medium
category: rev
solved_challenges:
- "HTB Cyber Apocalypse 2024 - PackedAway (UPX detect + strings)"
- "LACTF 2024 - glottem (polyglot POSIX/Node.js)"
adapted_for: fetih
---
# ELF Binary Statik Analiz
Bu skill bir ELF binary aldığında ilk yapılacakları ve derinlemesine analiz metodolojisini kapsar.
Hızlı triage'dan Ghidra decompile akışına kadar adım adım yol gösterir.
---
## 1. İlk Triage (file → strings → checksec → ltrace/strace)
Yeni bir binary geldiğinde HEMEN şunları çalıştır:
```bash
# 1. Dosya tipi
file ./binary
# Örnek çıktı: ELF 64-bit LSB executable, x86-64, dynamically linked, stripped
# 2. Temel string taraması
strings ./binary | grep -i flag
strings ./binary | grep -E 'HTB{|CTF{|flag{|picoCTF{'
strings ./binary | head -60 # ilk 60 satır genel bağlamı verir
# 3. Güvenlik flag'leri
checksec --file=./binary
# PIE, RELRO, Canary, NX kontrol et
# 4. Dinamik bağımlılıklar
ldd ./binary
file ./binary | grep -o "interpreter.*"
# 5. Hızlı çalıştırma (sandbox'ta)
strace ./binary 2>&1 | head -30 # syscall akışı
ltrace ./binary 2>&1 | head -30 # kütüphane çağrıları
```
### Triage Sonucu Yorum Tablosu
| Çıktı | Anlam | Sonraki Adım |
|---|---|---|
| `UPX compressed` | Packer var | upx -d ./binary |
| `stripped` | Sembol yok | Ghidra/IDA + manual rename |
| `statically linked` | ldd çalışmaz | readelf -d, strings daha önemli |
| `PIE enabled` | Rastgele adres | GDB set offset |
| string içinde flag | Çok kolay | Direkt teslim et |
---
## 2. objdump / readelf Cheat Sheet
```bash
# Tüm section header'ları listele
readelf -S ./binary
# Sembol tablosu (stripped değilse)
nm ./binary
nm ./binary | grep -i main
nm ./binary | grep -i ' T ' # text (kod) sembolleri
# Disassembly — main fonksiyonu
objdump -d ./binary | grep -A 100 '<main>:'
# Belirli section'ı disassemble et
objdump -d -j .text ./binary | less
# Tüm binary disassembly (büyük dosyalarda dikkatli)
objdump -M intel -d ./binary > /tmp/binary_asm.txt
# Header bilgileri
readelf -h ./binary # ELF header
readelf -l ./binary # Program headers (segment'lar)
readelf -d ./binary # Dinamik bölüm
# GOT/PLT adresleri (dinamik bağlantılı)
objdump -d -j .plt ./binary
objdump -R ./binary # relocation tablosu
# .rodata içindeki stringler (sabit veri)
objdump -s -j .rodata ./binary
# Hex dump — belirli section
readelf -x .rodata ./binary
readelf -x .data ./binary
```
---
## 3. HTB PackedAway: UPX Tespiti ve Çözme
**Challenge Özeti:** Binary çalışmıyor, strings boş, şüpheli.
```bash
# Adım 1: Packer var mı?
file ./packed_binary
# "UPX compressed" görürsen veya:
strings ./packed_binary | grep -i upx
# "UPX!" magic bytes ara
# Adım 2: Entropy analizi (packer'ı doğrula)
python3 -c "
import math
data = open('./packed_binary','rb').read()
freq = {}
for b in data:
freq[b] = freq.get(b,0) + 1
entropy = -sum((c/len(data))*math.log2(c/len(data)) for c in freq.values())
print(f'Entropy: {entropy:.2f}')
print('Packer şüphesi: YÜksek' if entropy > 7.0 else 'Normal')
"
# Adım 3: UPX çöz
upx -d ./packed_binary -o ./unpacked_binary
# veya
upx -d ./packed_binary # yerinde çözer
# Adım 4: Çözülmüş binary'ye tekrar triage
file ./unpacked_binary
strings ./unpacked_binary | grep -i flag
# HTB PackedAway çözümü:
# strings sonrası doğrudan flag görünüyordu → HTB{...}
```
**UPX magic bytes bozuksa (CTF trick):**
```bash
# Binary'yi hex editor ile aç
xxd ./packed_binary | head -5
# "UPX!" yerine değiştirilmiş magic → elle düzelt
python3 -c "
data = bytearray(open('./packed_binary','rb').read())
# UPX magic restore
idx = data.find(b'UPX') # veya manuel offset
# data[idx:idx+4] = b'UPX!'
open('./fixed.bin','wb').write(bytes(data))
"
upx -d ./fixed.bin
```
---
## 4. LACTF glottem: Polyglot Script Analizi
**Challenge Özeti:** Dosya hem shell script hem Node.js olarak çalışıyordu.
```bash
# Adım 1: Dosyayı gerçekten incele (file komutu yanıltabilir)
file ./glottem
head -10 ./glottem # ilk satırlar kritik
# Adım 2: Polyglot tespiti — aynı anda iki dil
# POSIX shell'de geçerli + Node.js'te geçerli bloklar ara
grep -n "eval\|require\|#!/" ./glottem
# LACTF glottem yapısı:
# #!/bin/sh
# # Node.js bu kısmı yorum sayar ama sh çalıştırır
# ...
# js kodu buraya (sh yorum satırlarının arkasında)
# Adım 3: Her yorumlayıcıda ayrı ayrı çalıştır
bash ./glottem
node ./glottem
# Adım 4: Validator mantığını izole et
# Node.js katmanını çıkar
node -e "$(tail -n +5 ./glottem)" 2>&1
# LACTF çözümü: z3 ile validator bypass → bkz. z3-constraint-solving SKILL.md
```
---
## 5. Ghidra Temel Workflow
```
1. Ghidra aç → New Project → Import File → Binary seç
2. Auto Analysis → Tümünü kabul et (özellikle "Decompiler Parameter ID")
3. Symbol Tree → Functions → main'i bul
4. Decompiler penceresinde C kodu oku
5. Şüpheli fonksiyon isimlerini ara: check, validate, compare, strcmp
Kritik kısayollar:
L → Rename (sembol adlandır)
; → Comment ekle
Ctrl+E → Edit Function Signature
G → Go to address
Ctrl+F → String/symbol ara
Space → Listing ↔ Decompiler geçiş
String'den geriye git:
.rodata içindeki string'e çift tıkla
→ References → Show References to Address
→ Kullanan fonksiyonu bul
```
---
## 6. Otomatik Triage Bash One-Liner
```bash
#!/bin/bash
# Kullanım: ./elf-triage.sh ./binary_dosyası
BINARY="$1"
echo "=== ELF TRIAGE: $BINARY ==="
echo ""
echo "[*] Dosya tipi:"
file "$BINARY"
echo ""
echo "[*] Checksec:"
checksec --file="$BINARY" 2>/dev/null || python3 -c "
import struct, sys
data = open('$BINARY','rb').read()
print('Manuel kontrol — checksec yok')
"
echo ""
echo "[*] String flag taraması:"
strings "$BINARY" | grep -iE 'flag\{|HTB\{|CTF\{|picoCTF\{|FLAG\{' || echo " Direkt flag yok"
echo ""
echo "[*] UPX/Packer tespiti:"
strings "$BINARY" | grep -i 'upx\|packed\|compressed' || echo " Belirgin packer yok"
echo ""
echo "[*] Import tablosu:"
nm -D "$BINARY" 2>/dev/null | grep ' U ' | head -20
echo ""
echo "[*] İlginç stringler:"
strings "$BINARY" | grep -iE 'password|secret|key|token|admin|auth|crack|solve|answer' | head -15
echo ""
echo "[*] Ldd (dinamik bağımlılıklar):"
ldd "$BINARY" 2>/dev/null || echo " Statik bağlantılı"
echo ""
echo "=== TRIAGE TAMAMLANDI ==="
echo "Sonraki adım: Ghidra veya objdump -d için yukarıdaki cheat sheet'e bak"
```
---
## Notlar ve Tuzaklar
- **Stripped binary** → `nm` boş döner, Ghidra'da fonksiyon isimlerini elle koy
- **Anti-debug** → bkz. anti-debug-obfuscation SKILL.md
- **Constraint/validator** → bkz. z3-constraint-solving SKILL.md
- Binary çalışmıyorsa: doğru mimariye bak (ARM? MIPS?), `qemu-user-static` dene
- `strings -n 6` ile minimum uzunluğu artır (kısa sahte stringleri filtreler)
<!--
⚔ Bu skill FETIH AI Agent icin gelistirilmistir — https://github.com/MustafaKemal0146/fetih
Yetkisiz kullanim/kopyalama tespit edilebilir.
hash: 79bbc85129defcb9
-->
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!