https://medium.com/@ibnuilham/dodging-the-debugger-winantidbg0x300-picoctf-2024-writeup-0d913ad398ba
Medium
Dodging the Debugger: WinAntiDbg0x300 (picoCTF 2024 Writeup)
Hey everyone! I just wrapped up a fun little reverse engineering challenge from picoCTF 2024 called “WinAntiDbg0x300,” and thought I’d…
👍4🍓1
گرفتن Dump از حافظه
وقتی به OEP رسیدید:
از ابزار Scylla یا x64dbg استفاده کنید برای گرفتن Memory Dump
آدرسهای سکشنها و Import Table رو ذخیره کنید
وقتی به OEP رسیدید:
از ابزار Scylla یا x64dbg استفاده کنید برای گرفتن Memory Dump
آدرسهای سکشنها و Import Table رو ذخیره کنید
❤4🔥1
بازسازی Import Table
در بیشتر موارد Import Table فایل pack شده موقع dump خراب یا ناقصه
Scylla یا Import Reconstructor برای بازسازی IAT کمک میکنه
این مرحله باعث میشه فایل dump شده بعد از ذخیره درست اجرا بشه
در بیشتر موارد Import Table فایل pack شده موقع dump خراب یا ناقصه
Scylla یا Import Reconstructor برای بازسازی IAT کمک میکنه
این مرحله باعث میشه فایل dump شده بعد از ذخیره درست اجرا بشه
❤3🔥1
ذخیره فایل آنپک شده
ذخیره فایل با IAT بازسازی شده
اجرای تست برای اطمینان از سلامت فایل نهایی
ذخیره فایل با IAT بازسازی شده
اجرای تست برای اطمینان از سلامت فایل نهایی
👏3
نمونه کد آنپکر ساده با پایتون برای UPX
در فایلهای pack شده با UPX گاهی فقط نیاز به اجرای ابزار UPX به صورت اتوماتیک داریم:
در فایلهای pack شده با UPX گاهی فقط نیاز به اجرای ابزار UPX به صورت اتوماتیک داریم:
import subprocess
import os
def unpack_upx(file_path):
if not os.path.exists(file_path):
print("فایل پیدا نشد")
return
try:
subprocess.run(['upx', '-d', file_path], check=True)
print("فایل با موفقیت آنپک شد")
except subprocess.CalledProcessError:
print("خطا در آنپک فایل")
unpack_upx('sample.exe')
👏3
ساخت آنپکر اختصاصی برای فایلهای Pack شده
بعد از اینکه فهمیدیم یه فایل pack شدهست (مثلاً با UPX یا پکرهای خاص) وقتشه خودمون بتونیم برای اون یک آنپکر بسازیم و باینری اصلی رو بازیابی کنیم
چرا باید خودمون آنپکر بنویسیم؟
همه فایلها با ابزارهای آماده قابل آنپک نیستن (مثلاً نسخههای دستکاریشده یا سفارشیشدهی UPX)
در بعضی مواقع نیاز به خودکارسازی داریم (مثلاً اسکن دستهای)
این تمرین باعث میشه به درک عمیقتری از ساختار PE و مکانیزم اجرای ویندوز برسید
بعد از اینکه فهمیدیم یه فایل pack شدهست (مثلاً با UPX یا پکرهای خاص) وقتشه خودمون بتونیم برای اون یک آنپکر بسازیم و باینری اصلی رو بازیابی کنیم
چرا باید خودمون آنپکر بنویسیم؟
همه فایلها با ابزارهای آماده قابل آنپک نیستن (مثلاً نسخههای دستکاریشده یا سفارشیشدهی UPX)
در بعضی مواقع نیاز به خودکارسازی داریم (مثلاً اسکن دستهای)
این تمرین باعث میشه به درک عمیقتری از ساختار PE و مکانیزم اجرای ویندوز برسید
👍4👏1
شناسایی پکر
استفاده از ابزارهایی مثل:
PEiD
Detect It Easy
بررسی سکشنها ساختارهای غیرمعمول سایزهای عجیب و نام بخشها
استفاده از ابزارهایی مثل:
PEiD
Detect It Easy
بررسی سکشنها ساختارهای غیرمعمول سایزهای عجیب و نام بخشها
👍4👏1
پیدا کردن OEP (Original Entry Point)
اجرای فایل در دیباگر مثل x64dbg
گذاشتن Breakpoint روی APIهای کلیدی:
VirtualAlloc
WriteProcessMemory
GetProcAddress
یا حتی روی Entry Point خود فایل
دنبال کردن flow تا وقتی وارد کد unpack شده → اونجا OEP واقعی هست
اجرای فایل در دیباگر مثل x64dbg
گذاشتن Breakpoint روی APIهای کلیدی:
VirtualAlloc
WriteProcessMemory
GetProcAddress
یا حتی روی Entry Point خود فایل
دنبال کردن flow تا وقتی وارد کد unpack شده → اونجا OEP واقعی هست
👍4❤1
گرفتن Dump از حافظه
وقتی به OEP رسیدیم:
از ابزار Scylla یا x64dbg استفاده کنیم برای گرفتن Memory Dump
آدرسهای سکشنها و Import Table رو ذخیره کنید
وقتی به OEP رسیدیم:
از ابزار Scylla یا x64dbg استفاده کنیم برای گرفتن Memory Dump
آدرسهای سکشنها و Import Table رو ذخیره کنید
👍4❤1
انواع تکنیکهای رایج Obfuscation
Renaming (تغییر نامها):
تغییر نام تابعها متغیرها کلاسها به اسمهای بیمعنا مثل a, b2, _x1 و غیره
در کد NET. و Java خیلی رایجه
2 Control Flow Obfuscation:
تغییر ساختار طبیعی کدها با اضافه کردن پرشهای بیربط if/elseهای بیمعنا و لوپهای تودرتو
در اسمبلی به شکل JMPهای زیاد، CALL های بیدلیل یا پرشهای به عقب دیده میشه
3 Junk Code Injection:
تزریق دستوراتی که هیچ کاری نمیکنن (NOP، push/popهای بیاثر) فقط برای گمراه کردن دیباگر یا دیساسمبلر
4 Opaque Predicates:
شرط هایی که همیشه درست یا غلط هستن ولی تحلیلگر رو گیج میکنن
مثل:
CMP EAX, EAX
JNE somewhere ; این هیچوقت اجرا نمیشه
5 String Encryption:
رمزنگاری رشتهها (مثل نام توابع، URLها کلیدها) که فقط در زمان اجرا رمزگشایی میشن
6 Anti-Decompiler / Anti-Debug Tricks:
مثل IsDebuggerPresent, CheckRemoteDebuggerPresent و دستوراتی که ابزارهای تحلیل رو crash میکنن
👍4👏1
توضیح کاربردها:بدافزارها برای پنهان کردن رفتار واقعیشون استفاده میکنن
توسعهدهندگان نرمافزارهای پولی برای جلوگیری از کرک
حتی گاهی برای مخفی کردن بخشی از منطق تجاری یا کد لایسنس استفاده میشه
👍4❤1
تحلیل یک باینری با Control Flow Obfuscation
توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
👍3❤2
ReverseEngineering
تحلیل یک باینری با Control Flow Obfuscation توی این قسمت یاد میگیریم چطور کدهایی که عمدا ساختار طبیعیشون بههم ریخته رو شناسایی کنیم و تمیز کنیم
Asm
start:
push ebp
mov ebp, esp
cmp eax, eax
jne fake_branch
nop
nop
call real_function
jmp end
fake_branch:
xor eax, eax
call junk_function
jmp start
real_function:
; کد واقعی برنامه
; ...
ret
junk_function:
nop
nop
ret
end:
mov esp, ebp
pop ebp
ret
👍2👏2
ReverseEngineering
Asm start: push ebp mov ebp, esp cmp eax, eax jne fake_branch nop nop call real_function jmp end fake_branch: xor eax, eax call junk_function jmp start real_function: ; کد واقعی برنامه ; ... ret junk_function: nop nop ret…
تحلیل کد بالا در ابزارهایی مثل Ghidra یا IDA:
cmp eax, eax + jne همیشه falseمیشه، پس مسیر fake_branch عملا مردهست
junk_function هیچ کاری نمیکنه و فقط برای گیج کردن دیساسمبلر استفاده شده
real_function هدف اصلیه ولی وسط یک ساختار غیرخطی پنهان شده
cmp eax, eax + jne همیشه falseمیشه، پس مسیر fake_branch عملا مردهست
junk_function هیچ کاری نمیکنه و فقط برای گیج کردن دیساسمبلر استفاده شده
real_function هدف اصلیه ولی وسط یک ساختار غیرخطی پنهان شده
👍3👏1