Reversing Tools & Basic Methods
Try Hard Güvenlik Grubu
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ını wat (açık metin) biçimine çözümlemek için https://webassembly.github.io/wabt/demo/wasm2wat/index.html kullanın
Wat dosyasını wasm biçimine derlemek 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 decompiler
dotPeek, kütüphaneler (.dll), Windows meta veri dosyaları (.winmd) ve yürütülebilir dosyalar (.exe) dahil olmak üzere çeşitli biçimleri çözümleyen bir dekompilerdir. Çö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.
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 verir
Belgelenmemiş ve açığa çıkarılmamış işlevselliği bulur ve kullanılan API'lerden ve teknolojilerden daha fazla veri alır.
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.
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 üzerine 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 şeyi 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:
DNSpy Hata Ayıklama
DNSpy kullanarak kodu hata ayıklamak için şunları yapmanız gerekmektedir:
İlk olarak, hata ayıklama ile ilgili Derleme özniteliklerini değiştirin:
To:
Temel Yöntemler ve Araçlar
Bu bölümde, tersine mühendislik işlemlerinde kullanılan temel yöntemler ve araçlar hakkında genel bir bakış sunulmaktadır. Tersine mühendislik, bir yazılımın veya sistem bileşeninin çalışma prensiplerini anlamak için kullanılan bir tekniktir. Bu süreç genellikle bir yazılımın nasıl çalıştığını, hangi işlevlere sahip olduğunu ve nasıl korunduğunu anlamak amacıyla gerçekleştirilir. Tersine mühendislik, siber güvenlik uzmanları tarafından kötü amaçlı yazılımları analiz etmek, güvenlik açıklarını keşfetmek ve yasal olmayan yazılımların tespit edilmesine yardımcı olmak için sıkça kullanılan bir tekniktir. Bu bölümde, tersine mühendislik işlemlerinde kullanılan temel araçlar ve yöntemler hakkında bilgi edineceksiniz.
Ve sonra derlemeye tıklayın:
Daha sonra yeni dosyayı Dosya >> Modülü Kaydet... yolunu izleyerek kaydedin:
Bunu yapmanız gerekiyor çünkü bunu yapmazsanız, çalışma zamanında kod üzerine birkaç optimizasyon uygulanacak 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 şu şekilde yeniden başlatabilirsiniz:
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 işlemi 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:
Modules üzerinde herhangi bir modüle tıklayın ve Open All Modules'ı 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ükle (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ç
"Suspend on library load/unload" seçeneğini işaretle
Yürütmenin parametrelerini yapılandırarak DLL'nin yolunu ve çağırmak istediğiniz işlevi belirtin:
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ükle (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ştir (File --> Change Command Line) ve dll'nin yolunu ve çağırmak istediğiniz işlevi belirtin, ö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çeneğini işaretleyin.
Ardından yürütmeyi başlatın, hata ayıklayıcı her dll ana noktasında duracak, bir noktada dll'nin Girişine duracaksınız. Oradan, kırılma noktalarını koymak istediğiniz yerleri 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:
Sonra, yürütmenin durduğu dll'yi hata ayıklamak istediğiniz yere baktığınızı görebilirsiniz.
GUI Uygulamaları / Video Oyunları
Cheat Engine, çalışan bir oyunun hafızasında önemli değerlerin nerede saklandığını bulmanıza ve değiştirmenize olanak tanıyan faydalı bir programdır. Daha fazla bilgi için:
pageCheat EnginePiNCE, GNU Project Debugger (GDB) için bir ön uç/tersine mühendislik aracı olup oyunlara odaklanmaktadır. Bununla birlikte, herhangi bir tersine mühendislikle ilgili şeyler için kullanılabilir.
Decompiler Explorer, bir dizi decompiler için bir web ön ucu sağlar. Bu web hizmeti, farklı decompiler'ların çıktılarını karşılaştırmanıza olanak tanır.
ARM ve MIPS
Shellcode'lar
Blobrunner ile bir shellcode'u hata ayıklama
Blobrunner, shellcode'u bir bellek alanına ayıracak, size shellcode'un ayrıldığı bellek adresini gösterecek ve yürütmeyi durduracak. Daha sonra, bir hata ayıklayıcıyı (Ida veya x64dbg) işleme bağlamanız ve belirtilen bellek adresine bir kırılma noktası koymanız ve yürütmeyi devam ettirmeniz gerekir. Böylece 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ın ve yapıştırın ve derleyin.
pageBlobrunnerjmp2it ile bir shellcode'u hata ayıklama
jmp2it, blobrunner'a çok benzerdir. Shellcode'u bir bellek alanına ayıracak ve bir sonsuz döngü başlatacaktır. Daha sonra, hata ayıklayıcıyı işleme bağlamanız, başlatmanız, 2-5 saniye beklemeniz ve durdur tuşuna basmanız ve kendinizi sonsuz döngü içinde bulacaksınız. 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 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ı:
Başlamak istediğiniz yerde emülasyonu başlatmak için oraya 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. Bu, shellcode'un hangi işlevleri kullandığını ve shellcode'un bellekte kendini çözüp çözmediğini size söyleyecektir.
scDbg ayrıca grafiksel bir başlatıcıya sahiptir, burada istediğiniz seçenekleri seçebilir ve shellcode'u yürütebilirsiniz
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 belirli bir ofsette shellcode'u 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)
Bu obfuscator, tüm mov
komutları için talimatları 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:
Şanslıysanız demovfuscator ikili dosyayı açıklayabilir. Birkaç bağımlılığı vardır
Ve keystone'ı yükle (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Eğer bir CTF oyunu oynuyorsanız, bayrağı bulmak için bu yöntem çok faydalı olabilir: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Rust
Giriş noktasını bulmak için ::main
gibi fonksiyonlara bakın:
Bu durumda ikili dosya authenticator olarak adlandırıldığı için bu 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, hata ayıklamanın başlangıcında işlev adlarını dinamik olarak çözecek ve ikili dosyayı yürütecektir. Hata ayıklamayı başlattıktan sonra tekrar Başlat düğmesine basın (yeşil olan veya f9) ve bir kesme noktası gerçek kodun başında olacaktır.
Ayrıca, grafik uygulamasında bir düğmeye bastığınızda hata ayıklayıcı, o düğme tarafından yürütülen işlevde 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, işlevlerin adlarını çözecektir.
Derlenmiş Python
Bu sayfada, bir ELF/EXE python derlenmiş ikili dosyasından python kodunu nasıl alacağınızı bulabilirsiniz:
pageDecompile compiled python binaries (exe, elf) - Retreive from .pycGBA - 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üğmelerine nasıl basılacağını görebilirsiniz
Basıldığında, her tuşun bir değeri vardır ve bunu tanımlamak için:
Bu tür programlarda, ilginç olan kısım, programın kullanıcı girdisini nasıl işlediğidir. Adreste 0x4000130 sıkça rastlanan 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 olanlar):
Bu kod bulundu:
Son if, uVar4
'ün son tuşlar içinde olup olmadığını kontrol ediyor ve mevcut tuş değil, yani bir düğmeyi bırakma işlemi (mevcut tuş uVar1
içinde saklanır) olarak adlandırılır.
Ö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 ekranı 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 içine girdikten hemen sonra 1 ekler.8'den azsa,
DAT_030000d8
değişkenine değerlerin eklenmesiyle ilgili 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 ekliyor).
Bu meydan okumada, düğmelerin değerlerini bilerek, sonucunda eklemenin 0xf3 olduğu 8'den küçük bir uzunlukta bir kombinasyonu basmanız gerekiyordu.
Bu öğretici için referans: https://exp.codes/Nostalgia/
Game Boy
Kurslar
https://github.com/malrev/ABD (Binary deobfuscation)
Try Hard Security Group
Last updated