hacktricks/reversing-and-exploiting/reversing-tools-basic-methods/README.md
2024-04-06 18:32:19 +00:00

30 KiB

Reversing Tools & Basic Methods

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


ImGui आधारित Reversing टूल्स

सॉफ़्टवेयर:

Wasm डिकंपाइलर / Wat कंपाइलर

ऑनलाइन:

सॉफ़्टवेयर:

.NET डिकंपाइलर

dotPeek

dotPeek एक डिकंपाइलर है जो पुस्तकालय (.dll), Windows मेटाडेटा फ़ाइल (.winmd) और एक्जीक्यूटेबल्स (.exe) सहित कई प्रारूपों को डिकंपाइल और जांचता है। एक बार डिकंपाइल करने के बाद, एक असेम्बली को एक विजुअल स्टूडियो परियोजना (.csproj) के रूप में सहेजा जा सकता है।

यहाँ महत्व है कि यदि एक खो गई स्रोत कोड को पुरानी असेम्बली से पुनर्स्थापित करने की आवश्यकता होती है, तो यह कार्रवाई समय बचा सकती है। इसके अतिरिक्त, dotPeek डिकंपाइल कोड के माध्यम से हाथ में उपयुक्त नेविगेशन प्रदान करता है, जिससे यह Xamarin एल्गोरिदम विश्लेषण के लिए सबसे उत्तम टूलों में से एक बन जाता है।

.NET Reflector

एक व्यापक एड-इन मॉडल और एपीआई के साथ जो आपकी विशेष आवश्यकताओं को पूरा करने के लिए उपकरण को विस्तारित करता है, .NET रिफ्लेक्टर समय बचाता है और विकास को सरल बनाता है। चलिए इस उपकरण द्वारा प्रदान की जाने वाली पूरी पलटाव की सेवाओं की ओर एक नज़र डालते हैं:

  • पुस्तकालय या कॉम्पोनेंट के माध्यम से डेटा कैसे फ्लो करता है का अंदाजा देता है
  • .NET भाषाओं और फ़्रेमवर्क के अनुसरण और उपयोग का अंदाजा देता है
  • उपयोग किए जाने वाले एपीआई और प्रौद्योगिकियों से अधिक प्राप्त करने के लिए अनदोक्यूमेंटेड और अनएक्सपोज़्ड फ़ंक्शनैलिटी खोजता है।
  • विभिन्न एसेम्ब्लियों और विभिन्न एसेम्ब्लियों का पता लगाता है
  • आपके कोड, थर्ड-पार्टी कॉम्पोनेंट्स और पुस्तकालयों में त्रुटियों के सटीक स्थान का पता लगाता है।
  • आपके साथ काम करने वाले सभी .NET कोड के स्रोत में डीबग करता है।

ILSpy & dnSpy

ILSpy plugin for Visual Studio Code: आप इसे किसी भी ओएस में रख सकते हैं (आप इसे वीएसकोड से सीधे इंस्टॉल कर सकते हैं, गिट को डाउनलोड करने की आवश्यकता नहीं है। एक्सटेंशन्स पर क्लिक करें और ILSpy खोजें)।
यदि आपको डिकंपाइल, संशोधित और फिर से कंपाइल करने की आवश्यकता है तो आप dnSpy या इसके सक्रिय रूप से रखरखावित फोर्क, dnSpyEx का उपयोग कर सकते हैं। (राइट क्लिक -> फ़ंक्शन के भीतर कुछ बदलने के लिए मॉडिफाई मेथड).

DNSpy Logging

DNSpy में कुछ जानकारी एक फ़ाइल में लॉग करने के लिए, आप इस स्निपेट का उपयोग कर सकते हैं:

using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");

DNSpy डीबगिंग

कोड को DNSpy का उपयोग करके डीबग करने के लिए आपको करना होगा:

पहले, डीबगिंग से संबंधित असेंबली गुण बदलें:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

To: के लिए:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]

और कंपाइल पर क्लिक करें:

फिर नया फ़ाइल File >> Save module... के माध्यम से सहेजें:

यह आवश्यक है क्योंकि यदि आप ऐसा नहीं करते हैं, तो वर्तमान समय पर कई अनुकूलन को कोड पर लागू किया जाएगा और यह संभावित है कि जब आप डीबगिंग कर रहे हों, तो किसी ब्रेक-पॉइंट पर कभी नहीं पहुंचा जाए या कुछ चर मौजूद न हों।

फिर, यदि आपका .NET एप्लिकेशन IIS द्वारा चलाया जा रहा है, तो आप इसे पुनः आरंभ कर सकते हैं:

iisreset /noforce

फिर, डीबगिंग शुरू करने के लिए आपको सभी खुली फ़ाइलें बंद करनी चाहिए और Debug Tab में जाकर Attach to Process... का चयन करें:

फिर w3wp.exe का चयन करें ताकि IIS सर्वर से जुड़ सके और attach पर क्लिक करें:

अब जब हम प्रक्रिया को डीबग कर रहे हैं, तो समय है कि इसे रोकें और सभी मॉड्यूल लोड करें। पहले Debug >> Break All पर क्लिक करें और फिर Debug >> Windows >> Modules पर क्लिक करें:

Modules पर किसी भी मॉड्यूल पर क्लिक करें और Open All Modules का चयन करें:

Assembly Explorer में किसी भी मॉड्यूल पर दायां क्लिक करें और Sort Assemblies पर क्लिक करें:

जावा डिकंपाइलर

https://github.com/skylot/jadx
https://github.com/java-decompiler/jd-gui/releases

DLLs की डीबगिंग

IDA का उपयोग

  • rundll32 लोड करें (64बिट C:\Windows\System32\rundll32.exe और 32 बिट C:\Windows\SysWOW64\rundll32.exe में)
  • Windbg डीबगर का चयन करें
  • "Suspend on library load/unload" का चयन करें

  • निष्पादन के पैरामीटर को कॉन्फ़िगर करें और DLL के पथ और वह फ़ंक्शन डालें जिसे आप कॉल करना चाहते हैं:

फिर, जब आप निष्पादन की डीबगिंग शुरू करते हैं, हर DLL लोड होने पर निष्पादन रुक जाएगा, फिर, जब rundll32 आपके DLL को लोड करेगा, निष्पादन रुक जाएगा।

लेकिन, जोड़े गए DLL के कोड तक कैसे पहुंचें? इस तरीके का उपयोग करके, मुझे नहीं पता कि कैसे।

x64dbg/x32dbg का उपयोग

  • rundll32 लोड करें (64बिट C:\Windows\System32\rundll32.exe और 32 बिट C:\Windows\SysWOW64\rundll32.exe में)
  • Command Line बदलें ( File --> Change Command Line ) और dll का पथ और वह फ़ंक्शन डालें जिसे आप कॉल करना चाहते हैं, उदाहरण के लिए: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
  • Options --> Settings बदलें और "DLL Entry" का चयन करें।
  • फिर निष्पादन शुरू करें, डीबगर हर dll मेन में रुकेगा, किसी समय आपको अपने dll के dll Entry में रुकना होगा। वहां से, जहां आप ब्रेकपॉइंट लगाना चाहते हैं, वहां खोजें।

ध्यान दें कि जब विजय64dbg में किसी कारण से निष्पादन होता है, तो आप देख सकते हैं कि आप किस कोड में हैं विजय64dbg विंडो के शीर्ष में देख सकते हैं:

फिर, जब आप उस dll में निष्पादन किया गया था, तो आप देख सकते हैं कि निष्पादन किस dll में हुआ था।

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 के पास एक ग्राफिकल लॉन्चर भी है जहाँ आप चुनाव कर सकते हैं और शेलकोड को निष्पादित कर सकते हैं

डंप बनाएं विकल्प अंतिम शेलकोड को डंप करेगा अगर किसी भी परिवर्तन किया गया है शेलकोड को डायनामिक रूप से मेमोरी में (डिकोड शेलकोड डाउनलोड करने के लिए उपयोगी है)। स्टार्ट ऑफसेट एक विशिष्ट ऑफसेट पर शेलकोड को शुरू करने के लिए उपयोगी हो सकता है। डीबग शेल विकल्प शेलकोड को scDbg टर्मिनल का उपयोग करके डीबग करने के लिए उपयोगी है (हालांकि मैं इस विषय में पहले विवरणित किए गए किसी भी विकल्प को इस मामले के लिए बेहतर मानता हूँ क्योंकि आप Ida या x64dbg का उपयोग कर सकेंगे)।

CyberChef का उपयोग करके डिसएसेंबलिंग

अपनी शेलकोड फ़ाइल को इनपुट के रूप में अपलोड करें और इसे डिकॉम्पाइल करने के लिए निम्नलिखित रेसिपी का उपयोग करें: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)

Movfuscator

यह ऑबफस्केटर सभी निर्देशिकाओं को mov के लिए संशोधित करता है (हाँ, सचमुच कूल)। यह भी निष्पादन फ्लो को बदलने के लिए बाधाएँ उपयोग करता है। इसके काम करने के बारे में अधिक जानकारी के लिए:

यदि आप भाग्यशाली हैं तो demovfuscator बाइनरी को डीऑफस्केट करेगा। इसमें कई आवश्यकताएँ हैं।

apt-get install libcapstone-dev
apt-get install libz3-dev

और keystone को इंस्टॉल करें (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install)

यदि आप CTF खेल रहे हैं, तो इस workaround का उपयोग करके फ्लैग को खोजना बहुत उपयोगी हो सकता है: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html

Rust

एंट्री पॉइंट खोजने के लिए ::main जैसे फ़ंक्शन्स की खोज करें:

इस मामले में बाइनरी को एथेंटिकेटर कहा गया था, इसलिए यह काफी स्पष्ट है कि यह दिलचस्प मुख्य फ़ंक्शन है।
फ़ंक्शन्स के नाम के पास होने पर, उन्हें इंटरनेट पर खोजें ताकि उनके इनपुट और आउटपुट के बारे में जान सकें।

Delphi

Delphi संकलित बाइनरी के लिए आप https://github.com/crypto2011/IDR का उपयोग कर सकते हैं।

यदि आपको एक Delphi बाइनरी को रिवर्स करना हो, तो मैं आपको IDA प्लगइन https://github.com/Coldzer0/IDA-For-Delphi का उपयोग करने की सलाह दूंगा।

बस ATL+f7 (IDA में पायथन प्लगइन आयात करें) दबाएं और पायथन प्लगइन का चयन करें।

यह प्लगइन बाइनरी को निष्पादित करेगा और डीबगिंग की शुरुआत में फ़ंक्शन नामों को गतिशील रूप से हल करेगा। डीबगिंग शुरू करने के बाद फिर से स्टार्ट बटन (हरा वाला या f9) दबाएं और एक ब्रेकपॉइंट वास्तविक कोड की शुरुआत में हिट करेगा।

यह भी बहुत दिलचस्प है क्योंकि यदि आप ग्राफिक एप्लिकेशन में एक बटन दबाते हैं तो डीबगर उस बटन द्वारा निष्पादित फ़ंक्शन में रुक जाएगा।

Golang

यदि आप एक Golang बाइनरी को रिवर्स करना हो, तो मैं आपको IDA प्लगइन https://github.com/sibears/IDAGolangHelper का उपयोग करने की सलाह दूंगा।

बस ATL+f7 (IDA में पायथन प्लगइन आयात करें) दबाएं और पायथन प्लगइन का चयन करें।

यह फ़ंक्शनों के नामों को हल करेगा।

Compiled Python

इस पृष्ठ पर आप एक ELF/EXE python संकलित बाइनरी से पायथन कोड कैसे प्राप्त करें इसे देख सकते हैं:

{% 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

यदि आपके पास एक GBA गेम का बाइनरी है तो आप उसे एम्युलेट और डीबग करने के लिए विभिन्न उपकरणों का उपयोग कर सकते हैं:

  • no$gba (डीबग संस्करण डाउनलोड करें) - इंटरफेस के साथ एक डीबगर शामिल है
  • mgba - एक CLI डीबगर शामिल है
  • gba-ghidra-loader - Ghidra प्लगइन
  • GhidraGBA - Ghidra प्लगइन

no$gba में, Options --> Emulation Setup --> Controls** ** आप देख सकते हैं कि कैसे Game Boy Advance buttons दबाए जाते हैं

जब दबाए जाते हैं, हर कुंजी का मूल्य उसे पहचानने के लिए होता है:

A = 1
B = 2
SELECT = 4
START = 8
RIGHT = 16
LEFT = 32
UP = 64
DOWN = 128
R = 256
L = 256

इस प्रकार के कार्यक्रम में, दिलचस्प हिस्सा कैसे प्रोग्राम उपयोगकर्ता इनपुट को व्यवस्थित करता है यह होगा। पता 0x4000130 पर आपको आमतौर पर पाए जाने वाला फ़ंक्शन मिलेगा: KEYINPUT

पिछली छवि में आप देख सकते हैं कि फ़ंक्शन को FUN_080015a8 से बुलाया गया है (पते: 0x080015fa और 0x080017ac)।

उस फ़ंक्शन में, कुछ आरंभिक कार्य (किसी भी महत्व के बिना):

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;

यह कोड मिला है:

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

आखिरी if uVar4 की जांच कर रहा है कि यह आखिरी कुंजी में है और वर्तमान कुंजी में नहीं है, जिसे छोड़ दिया गया बटन कहा जाता है (वर्तमान कुंजी uVar1 में संग्रहीत है)।

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;

पिछले कोड में आप देख सकते हैं कि हम uVar1 (जहां दबाए गए बटन का मान है) को कुछ मानों के साथ तुलना कर रहे हैं:

  • पहले, इसे मान 4 (SELECT बटन) के साथ तुलना की गई है: इस चैलेंज में यह बटन स्क्रीन को साफ करता है
  • फिर, इसे मान 8 (START बटन) के साथ तुलना की गई है: इस चैलेंज में यह जांचता है कि क्या कोड फ्लैग प्राप्त करने के लिए वैध है।
  • इस मामले में वेर DAT_030000d8 को 0xf3 के साथ तुलना की गई है और अगर मान समान है तो कुछ कोड कार्यान्वित होता है।
  • किसी भी अन्य मामलों में, कुछ cont (DAT_030000d4) की जांच की जाती है। यह एक cont है क्योंकि इसे कोड में प्रवेश करने के बाद एक जोड़ा जाता है।
    अगर 8 से कम कुछ है जो जोड़ना में शामिल है तो **DAT_030000d8 ** में मानों को जोड़ा जाता है (मूल रूप से इस वेरिएबल में दबाए गए कुंजियों के मानों को जोड़ता है जब तक cont 8 से कम है)।

तो, इस चैलेंज में, बटनों के मानों को जानकर, आपको 8 से छोटी लंबाई की एक कॉम्बिनेशन दबानी थी जिसका परिणामस्वरूप जोड़ 0xf3 होता है।

इस ट्यूटोरियल के लिए संदर्भ: https://exp.codes/Nostalgia/

गेम बॉय

{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}

कोर्सेस

ट्राई हार्ड सिक्योरिटी ग्रुप

{% embed url="https://discord.gg/tryhardsecurity" %}

htARTE (HackTricks AWS Red Team Expert) के साथ जीरो से हीरो तक AWS हैकिंग सीखें

हैकट्रिक्स का समर्थन करने के अन्य तरीके: