22 KiB
Tersine Mühendislik Araçları ve Temel Yöntemler
Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!
HackTricks'ı desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklamını görmek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız [ABONELİK PLANLARI]'na göz atın (https://github.com/sponsors/carlospolop)!
- [Resmi PEASS & HackTricks ürünleri]'ni alın (https://peass.creator-spring.com)
- [PEASS Ailesi]'ni keşfedin (https://opensea.io/collection/the-peass-family), özel [NFT'lerimiz]'in bulunduğu koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm'da takip edin.
- Hacking püf noktalarınızı paylaşarak PR göndererek [HackTricks]'e (https://github.com/carlospolop/hacktricks) ve [HackTricks Cloud]'a (https://github.com/carlospolop/hacktricks-cloud) destek olun.
Try Hard Güvenlik Grubu
{% embed url="https://discord.gg/tryhardsecurity" %}
ImGui Tabanlı Tersine Mühendislik Araçları
Yazılım:
- ReverseKit: https://github.com/zer0condition/ReverseKit
Wasm decompiler / Wat derleyici
Çevrimiçi:
- Wasm (ikili) dosyasından wat (açık metin) dosyasına çözümleme yapmak için https://webassembly.github.io/wabt/demo/wasm2wat/index.html kullanın
- Wat dosyasından wasm dosyasına derleme yapmak için https://webassembly.github.io/wabt/demo/wat2wasm/ kullanın
- Ayrıca https://wwwg.github.io/web-wasmdec/ kullanarak çözümleme yapabilirsiniz
Yazılım:
.NET çözümleyici
dotPeek
dotPeek, kütüphaneler (.dll), Windows meta veri dosyaları (.winmd) ve yürütülebilir dosyalar (.exe) dahil olmak üzere çeşitli formatları çözümleyen ve inceleyen bir çözümleyicidir. Çözümlendikten sonra bir derleme, bir Visual Studio projesi (.csproj) olarak kaydedilebilir.
Buradaki avantaj, kaybolmuş bir kaynak kodunun eski bir derlemeden geri yüklenmesi gerekiyorsa, bu işlem zaman kazandırabilir. Ayrıca, dotPeek, çözümlenen kod boyunca kullanışlı gezinme sağlayarak, Xamarin algoritma analizi için mükemmel araçlardan biri haline getirir.
.NET Reflector
Kapsamlı bir eklenti modeli ve aracı tam olarak ihtiyaçlarınıza uyacak şekilde genişleten bir API ile .NET Reflector, zaman kazandırır ve geliştirmeyi basitleştirir. Bu aracın sağladığı birçok tersine mühendislik hizmetine bir göz atalım:
- Verilerin bir kütüphane veya bileşen üzerinden nasıl aktığına dair bir bakış açısı sağlar
- .NET dilleri ve çerçevelerinin uygulanışı ve kullanımı hakkında bilgi sağlar
- Kullanılan API'ler ve teknolojilerden daha fazla veri almak için belgelenmemiş ve açığa çıkarılmamış işlevsellikleri bulur
- Bağımlılıkları ve farklı derlemeleri bulur
- Kodunuzdaki hataların, üçüncü taraf bileşenlerin ve kütüphanelerin tam konumunu belirler
- Çalıştığınız tüm .NET kodunun kaynağına hata ayıklar.
ILSpy & dnSpy
Visual Studio Code için ILSpy eklentisi: Herhangi bir işletim sisteminde kullanabilirsiniz (doğrudan VSCode'dan yükleyebilirsiniz, git'i indirmenize gerek yok. Uzantılar'a tıklayın ve ILSpy'ı arayın).
Eğer çözümlemek, değiştirmek ve yeniden derlemek gerekiyorsanız [dnSpy]'ı (https://github.com/dnSpy/dnSpy/releases) veya aktif olarak bakımı yapılan bir çatalını, [dnSpyEx]'i (https://github.com/dnSpyEx/dnSpy/releases) kullanabilirsiniz. (Bir işlev içinde bir şey değiştirmek için Sağ Tıkla -> Yöntemi Değiştir).
DNSpy Günlüğü
DNSpy'nin bazı bilgileri bir dosyaya kaydetmesi için bu kod parçacığını kullanabilirsiniz:
using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");
DNSpy Hata Ayıklama
DNSpy kullanarak kodları hata ayıklamak için şunları yapmanız gerekmektedir:
İlk olarak, hata ayıklama ile ilgili Derleme özniteliklerini değiştirin:
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
Temel Tersine Mühendislik Araçları ve Yöntemleri
Bu bölümde, tersine mühendislik işlemlerinde kullanılan temel araçlar ve yöntemler hakkında bilgi bulacaksınız. Tersine mühendislik, yazılımın veya donanımın çalışma prensiplerini anlamak için kullanılan bir tekniktir. Bu teknik, yazılım güvenliği testlerinde ve kötü amaçlı yazılımların analizinde sıkça kullanılır. Tersine mühendislik araçları ve yöntemleri, yazılımın iç yapısını anlamak ve değiştirmek için önemli bir rol oynar.
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
Ve derle'ye tıklayın:
Ardından yeni dosyayı Dosya >> Modülü Kaydet... yolunu izleyerek kaydedin:
Bunu yapmanız gereklidir çünkü bunu yapmazsanız, çalışma zamanında kod üzerine birçok optimizasyon uygulanabilir ve hata ayıklarken bir kesme noktasına ulaşılamayabilir veya bazı değişkenler mevcut olmayabilir.
Ardından, .NET uygulamanız IIS tarafından çalıştırılıyorsa, onu yeniden başlatabilirsiniz:
iisreset /noforce
Ardından, hata ayıklamaya başlamak için tüm açık dosyaları kapatmalı ve Debug Sekmesi içinde Attach to Process...'i seçmelisiniz:
Daha sonra w3wp.exe'yi seçerek IIS sunucusuna bağlanın ve attach'e tıklayın:
Şimdi süreci hata ayıklıyoruz, durdurma ve tüm modülleri yükleme zamanı. İlk olarak Debug >> Break All üzerine tıklayın ve ardından Debug >> Windows >> Modules üzerine tıklayın:
Modüller üzerinde herhangi bir modüle tıklayın ve Open All Modules'i seçin:
Assembly Explorer içinde herhangi bir modüle sağ tıklayın ve Sort Assemblies'i tıklayın:
Java decompiler
https://github.com/skylot/jadx
https://github.com/java-decompiler/jd-gui/releases
DLL'leri Hata Ayıklama
IDA Kullanarak
- rundll32'yi yükleyin (64 bitlik sürüm C:\Windows\System32\rundll32.exe ve 32 bitlik sürüm C:\Windows\SysWOW64\rundll32.exe)
- Windbg hata ayıklayıcıyı seçin
- "Suspend on library load/unload" seçin
- DLL'nin yolunu ve çağırmak istediğiniz işlevi belirterek yürütme parametrelerini yapılandırın:
Ardından, hata ayıklamaya başladığınızda her DLL yüklendiğinde yürütme durdurulur, sonra, rundll32 DLL'nizi yüklediğinde yürütme durdurulur.
Ancak, yüklenen DLL'nin koduna nasıl ulaşabilirsiniz? Bu yöntemi kullanarak, bunu bilmiyorum.
x64dbg/x32dbg Kullanarak
- rundll32'yi yükleyin (64 bitlik sürüm C:\Windows\System32\rundll32.exe ve 32 bitlik sürüm C:\Windows\SysWOW64\rundll32.exe)
- Komut Satırını Değiştirin ( File --> Change Command Line ) ve dll'nin yolunu ve çağırmak istediğiniz işlevi belirleyin, örneğin: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
- Options --> Settings değiştirin ve "DLL Entry" seçin.
- Ardından yürütmeyi başlatın, hata ayıklayıcı her dll ana noktasında duracak, bir noktada dll'nin girişinde duracaksınız. Oradan, kırılma noktalarını koymak istediğiniz noktaları arayın.
Yürütme herhangi bir nedenle durduğunda win64dbg'de hangi kodda olduğunuzu görebilirsiniz, win64dbg penceresinin üst kısmına bakarak:
Dolayısıyla, dll'yi hata ayıklamak istediğinizde yürütmenin hangi kodda durduğunu görebilirsiniz.
GUI Uygulamaları / Video Oyunları
Cheat Engine çalışan bir oyunun belleğinde önemli değerlerin nerede saklandığını bulmanıza ve değiştirmenize olanak tanıyan faydalı bir programdır. Daha fazla bilgi için:
{% content-ref url="cheat-engine.md" %} cheat-engine.md {% endcontent-ref %}
ARM & MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
Shellcode'lar
Blobrunner ile bir shellcode'u hata ayıklama
Blobrunner shellcode'u bir bellek alanına ayırır, size shellcode'un ayrıldığı bellek adresini gösterir ve yürütmeyi durdurur.
Daha sonra, bir hata ayıklayıcıyı (Ida veya x64dbg) sürece bağlamanız ve belirtilen bellek adresine bir kırılma noktası koymalısınız ve yürütmeyi devam ettirmelisiniz. Bu şekilde shellcode'u hata ayıklıyorsunuz.
Yayınlar github sayfası derlenmiş sürümleri içeren zip dosyalarını içerir: https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5
Blobrunner'ın hafif değiştirilmiş bir sürümünü aşağıdaki bağlantıda bulabilirsiniz. Derlemek için sadece Visual Studio Code'da bir C/C++ projesi oluşturun, kodu kopyalayıp yapıştırın ve derleyin.
{% content-ref url="blobrunner.md" %} blobrunner.md {% endcontent-ref %}
jmp2it ile bir shellcode'u hata ayıklama
jmp2it blobrunner'a çok benzer. Shellcode'u bir bellek alanına ayırır ve bir sonsuz döngü başlatır. Ardından, hata ayıklayıcıyı sürece bağlamanız, başlatmanız, 2-5 saniye beklemeniz ve durdurmanız ve kendinizi sonsuz döngü içinde bulmanız gerekir. Sonsuz döngünün bir sonraki talimatına atlayın çünkü bu shellcode'a bir çağrı olacaktır ve sonunda shellcode'u yürütürken bulacaksınız.
Derlenmiş bir sürümünü yayınlar sayfasından jmp2it'i indirebilirsiniz.
Cutter kullanarak bir shellcode'u hata ayıklama
Cutter radare'nin GUI'sudur. Cutter kullanarak shellcode'u emüle edebilir ve dinamik olarak inceleyebilirsiniz.
Cutter'ın "Dosya Aç" ve "Shellcode Aç" seçeneklerine izin verdiğini unutmayın. Benim durumumda, shellcode'u bir dosya olarak açtığımda doğru şekilde decompile etti, ancak shellcode olarak açtığımda yapamadı:
İstediğiniz yere emülasyona başlamak için bir bp ayarlayın ve görünüşe göre cutter otomatik olarak oradan emülasyona başlayacaktır:
Örneğin, bir hex dump içinde yığını görebilirsiniz:
Shellcode'u deobfuscate etme ve yürütülen işlevleri almak
scdbg'yi denemelisiniz.
Shellcode'un hangi işlevleri kullandığını ve shellcode'un bellekte kendini çözüp çözmediğini size söyleyecektir.
scdbg.exe -f shellcode # Get info
scdbg.exe -f shellcode -r #show analysis report at end of run
scdbg.exe -f shellcode -i -r #enable interactive hooks (file and network) and show analysis report at end of run
scdbg.exe -f shellcode -d #Dump decoded shellcode
scdbg.exe -f shellcode /findsc #Find offset where starts
scdbg.exe -f shellcode /foff 0x0000004D #Start the executing in that offset
scDbg ayrıca, istediğiniz seçenekleri seçebileceğiniz ve shellcode'yi yürütebileceğiniz grafiksel bir başlatıcıya sahiptir
Dump Oluştur seçeneği, bellekte shellcode dinamik olarak değiştirilirse son shellcode'u döker (çözülmüş shellcode'u indirmek için kullanışlıdır). Başlangıç ofseti, shellcode'u belirli bir ofsette başlatmak için kullanışlı olabilir. Debug Shell seçeneği, shellcode'u scDbg terminalini kullanarak hata ayıklamak için kullanışlıdır (ancak bu konuda açıklanan seçeneklerden herhangi birini daha iyi buluyorum çünkü Ida veya x64dbg kullanabileceksiniz).
CyberChef Kullanarak Disassembling
Shellcode dosyanızı giriş olarak yükleyin ve aşağıdaki tarifi kullanarak derleyin: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Movfuscator
Bu obfuscator, tüm mov
komutlarını değiştirir(evet, gerçekten harika). Ayrıca, yürütme akışlarını değiştirmek için kesmeler kullanır. Nasıl çalıştığı hakkında daha fazla bilgi için:
- https://www.youtube.com/watch?v=2VF_wPkiBJY
- https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf
Şanslıysanız demovfuscator ikili dosyayı açığa çıkaracaktır. Çeşitli bağımlılıkları bulunmaktadır
apt-get install libcapstone-dev
apt-get install libz3-dev
Ve keystone'ı yükle (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Eğer bir CTF oyununda, bayrağı bulmak için bu çözüm çok faydalı olabilir: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Rust
Giriş noktasını bulmak için ::main
ile fonksiyonlara bakın:
Bu durumda ikili dosya authenticator olarak adlandırıldığı için ilginç ana fonksiyon olduğu oldukça açıktır.
Çağrılan fonksiyonların isimlerine sahip olarak, bunları İnternet üzerinde arayarak girdileri ve çıktıları hakkında bilgi edinin.
Delphi
Delphi derlenmiş ikili dosyalar için https://github.com/crypto2011/IDR kullanabilirsiniz
Bir Delphi ikili dosyasını tersine çevirmeniz gerekiyorsa, IDA eklentisini kullanmanızı öneririm https://github.com/Coldzer0/IDA-For-Delphi
Sadece ATL+f7 tuşlarına basın (IDA'da python eklentisini içe aktarın) ve python eklentisini seçin.
Bu eklenti, ikili dosyayı yürütür ve hata ayıklamanın başında fonksiyon isimlerini dinamik olarak çözecektir. Hata ayıklamayı başlattıktan sonra Start düğmesine tekrar basın (yeşil olan veya f9) ve bir kesme noktası gerçek kodun başında tetiklenecektir.
Ayrıca, grafik uygulamasında bir düğmeye bastığınızda hata ayıklayıcı, o düğme tarafından yürütülen fonksiyonda duracaktır.
Golang
Bir Golang ikili dosyasını tersine çevirmeniz gerekiyorsa, IDA eklentisini kullanmanızı öneririm https://github.com/sibears/IDAGolangHelper
Sadece ATL+f7 tuşlarına basın (IDA'da python eklentisini içe aktarın) ve python eklentisini seçin.
Bu, fonksiyonların isimlerini çözecektir.
Derlenmiş Python
Bu sayfada, bir ELF/EXE python derlenmiş ikili dosyasından python kodunu nasıl alacağınızı bulabilirsiniz:
{% content-ref url="../../generic-methodologies-and-resources/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %} .pyc.md {% endcontent-ref %}
GBA - Game Body Advance
Bir GBA oyununun ikili dosyasını aldıysanız, onu emüle etmek ve hata ayıklamak için farklı araçlar kullanabilirsiniz:
- no$gba (Hata ayıklama sürümünü indirin) - Arayüz ile bir hata ayıklayıcı içerir
- mgba - Bir CLI hata ayıklayıcı içerir
- gba-ghidra-loader - Ghidra eklentisi
- GhidraGBA - Ghidra eklentisi
no$gba'da Options --> Emulation Setup --> Controls** ** bölümünde Game Boy Advance düğmelerini nasıl basacağınızı görebilirsiniz
Basıldığında, her tuşun bir değeri vardır ve bunu tanımlamak için:
A = 1
B = 2
SELECT = 4
START = 8
RIGHT = 16
LEFT = 32
UP = 64
DOWN = 128
R = 256
L = 256
Bu tür programlarda, ilginç olan kısım programın kullanıcı girdisini nasıl işlediği olacaktır. Adreste 0x4000130 sıkça bulunan KEYINPUT fonksiyonunu bulacaksınız.
Önceki görüntüde, fonksiyonun FUN_080015a8'den çağrıldığını görebilirsiniz (adresler: 0x080015fa ve 0x080017ac).
O fonksiyonda, bazı başlatma işlemlerinden sonra (önemsiz):
void FUN_080015a8(void)
{
ushort uVar1;
undefined4 uVar2;
undefined4 uVar3;
ushort uVar4;
int iVar5;
ushort *puVar6;
undefined *local_2c;
DISPCNT = 0x1140;
FUN_08000a74();
FUN_08000ce4(1);
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02009584,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
Bu kod bulundu:
do {
DAT_030004da = uVar4; //This is the last key pressed
DAT_030004d8 = KEYINPUT | 0xfc00;
puVar6 = &DAT_0200b03c;
uVar4 = DAT_030004d8;
do {
uVar2 = DAT_030004dc;
uVar1 = *puVar6;
if ((uVar1 & DAT_030004da & ~uVar4) != 0) {
Son if, uVar4
'ün son tuşlar içinde olup olmadığını kontrol ediyor ve mevcut tuş değilse, yani bir düğmeye bırakılıyor (mevcut tuş uVar1
içinde saklanır).
if (uVar1 == 4) {
DAT_030000d4 = 0;
uVar3 = FUN_08001c24(DAT_030004dc);
FUN_08001868(uVar2,0,uVar3);
DAT_05000000 = 0x1483;
FUN_08001844(&DAT_0200ba18);
FUN_08001844(&DAT_0200ba20,&DAT_0200ba40);
DAT_030000d8 = 0;
uVar4 = DAT_030004d8;
}
else {
if (uVar1 == 8) {
if (DAT_030000d8 == 0xf3) {
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02008aac,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
}
}
else {
if (DAT_030000d4 < 8) {
DAT_030000d4 = DAT_030000d4 + 1;
FUN_08000864();
if (uVar1 == 0x10) {
DAT_030000d8 = DAT_030000d8 + 0x3a;
Önceki kodda, uVar1 (basılan düğmenin değerinin bulunduğu yer) bazı değerlerle karşılaştırıldığını görebilirsiniz:
- İlk olarak, değer 4 (SEÇ düğmesi) ile karşılaştırılır: Bu düğme meydan okumada ekrani temizler.
- Ardından, değer 8 (BAŞLAT düğmesi) ile karşılaştırılır: Bu meydan okumada kodun bayrağı almak için geçerli olup olmadığını kontrol eder.
- Bu durumda,
DAT_030000d8
değişkeni 0xf3 ile karşılaştırılır ve değer aynıysa bazı kodlar çalıştırılır. - Diğer durumlarda, bazı
cont
(DAT_030000d4
) kontrol edilir. Bu bircont
çünkü kod girdikten hemen sonra 1 ekler.
Eğer 8'den küçükse,DAT_030000d8
değişkenine değerler ekleyen bir şey yapılır (temelde,cont
8'den küçük olduğu sürece bu değişkene basılan tuşların değerlerini ekler).
Bu meydan okumada, düğmelerin değerlerini bilerek, sonucu 0xf3 olan 8'den küçük bir uzunluktaki bir kombinasyonu basmanız gerekiyordu.
Bu öğretici için referans: https://exp.codes/Nostalgia/
Game Boy
{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}
Kurslar
- https://github.com/0xZ0F/Z0FCourse_ReverseEngineering
- https://github.com/malrev/ABD (Binary deobfuscation)
Try Hard Security Group
{% embed url="https://discord.gg/tryhardsecurity" %}
Sıfırdan kahraman olmak için AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert)!
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te tanıtmak veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- Özel NFT'lerimiz olan The PEASS Family'yi keşfedin
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter'da 🐦 @carlospolopm'de takip edin.
- Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek katkıda bulunun.