ru
Feedback
ReverseEngineering

ReverseEngineering

Открыть в Telegram
1 265
Подписчики
Нет данных24 часа
-37 дней
+730 дней
Архив постов
قطعه کد زیر استفاده از فراخوان سیستمی sys_exit رو نشون میده
mov eax,1 int 0x80
کد فراخوان سیستمی sys_write
mov ebx,4 mov ecx,msg mov ebx,1 mov eax,4 int 0x80


فراخوان های سیستمی Systsem Calls ها چین ؟ فراخوان های سیســتمی API هایی برای برقرار کردن رابطه بین فضای کاربر و فضای هسته (core) هستن فراخوان های سیستمیCalls System در لینوکس می توانید در برنامه های اســمبلی خود از فراخوان های سیستمی لینوکس استفاده کنید

ثبات های سگمنت Registers Segment سگمنت ها قسمت های خاصی هستند که در یک برنامه برای محتوی داده، کد و پشته تعریف میشن سه نوع سگمنت اصلی وجود داره ســگمنت کد Segment Code شامل کلیه دستورالعمل هایی است که باید اجرا شــه یک ثبات 16 Segment Code بیتی یــا ثبات CS آدرس آغازین سگمنت کد رو ذخیره میکنه سگمنت داده segment Data شامل داده ها، ثابت ها هستن یک رجیســتری 16 Segment Data بیتی یا ثبات DS آدرس شــروع data segment رو ذخیره میکنه. سگمنت پشته segment Stack این شامل داده ها و آدرس های بازگشت رویه ها یا زیر برنامه هاست. این به عنوان یک ساختار داده ”stack ”پیاده سازی شده ثبات Segment Stack یا SS آدرس شروع پشته رو ذخیره میکنه جدای از رجیســترهای DS، CS و SS، ثبات های اضافی دیگری نیز وجود دارن segment Extra سگمنت اضافه FS و GS، که سگمنت های دیگری را برای ذخیره داده ها ارائه میدن رجیسترهای سگمنت آدرس های شروع یک سگمنت رو ذخیره میکنه. برای به دست آوردن مکان دقیق داده ها یا دستورالعمل ها در یک سگمنت، مقدار offset مورد نیازه برای ارجاع هر مکان حافظه در یک سگمنت پردازنده آدرس سگمنت در ثبات بخش را با مقدار offset مکان ترکیب میکنه

ثبات کنترلی Register Control ثبات اشــاره گر دستورالعمل 32 بیتی و ثبات flag 32 بیتی در کنار هم به عنوان ثبات کنترلی در نظر گرفته میشن بسیاری از دستورها مقایسه و محاسبات ریاضی و تغییر وضعیت flag ها و برخی دیگر از دستورالعمل های شرطی مقدار این flag ها را برای انتقال جریان به بقیه مکان ها بررسی میکند میخایم در مورد فلگ ها حرف بزنیم خب اصن فلگ چیه ؟ برای کنترل جریان اجرای برنامه استفاده میشه این مقادیر در حقیقت نشون دهنده ی وضعیت خاصی که برنامه به ما میگه که چه کاری باید انجام‌ بدیم میخایم چند تا فلگ مهم رو نام ببریم و این که بگیم کارایی شون چیه Overflow flag نشان دهنده ی یک بیت پر ارزش سر ریز چپ ترین بیت از داده ها بعد از یک‌ عملیات محاسباتی هست Direction flag جهت چپ یا راســت را برای حرکت یا مقایسه داده های رشته تعیین میکنه وقتی مقدار DF 0 باشد عملیات رشته ای از چپ به راست و وقتی مقدار 1 باشه عملیات رشته ها از راست به چپ انجام میشه Interupt flag تعییــن میکند کــه آیا وقفه های خارج از برنامه مثل ورودی صفحه کلید رو باید نادیده گرفت یا پردازش کرد وقتی مقدار 0 باشه وقفه خارجــی را غیرفعال میکنه و اگر روی 1 تنظیم باشه وقفه خارجی را فعال میکنه Flag Trap این امکان را میده که عملکرد پردازنده را به حالت پلکانی تنظیم کنیم و برای debug کردن برنامه ها استفاده میشه Sign flag این علامت توسط چپ ترین بیت نشان داده میشه اگر SF صفر باشه نتیجه مثبت است و اگر یک باشد نتیجه منفیه Zero flag نشــان دهنده نتیجه یک عملیات ریاضی است در نتیجه غیر صفر flag با صفر تنظیم میشه و نتیجه اگر صفر شد 1 میشه Auxiliary flag انتقال بیت 3 به 4 است وقتی تنظیم میشه که در یک عملیات حسابی 1 بایت باعث انتقال از بیت 3 به بیت 4 شه Partiy flag به تعداد کل 1 های موجود در نتیجه ی به دســت اومده از یک عملیات محاســباتی تنظیم میشه در صورتی که تعداد زوج بشه صفر اگر تعداد فرد باشه یک Cary flag مقدار نقلی از بیت پر ارزش تر (چپ ترین بیت) هست

ثبات ایندکس Register Index ثبات ایندکس 32 بیتی ESI و EDI و بخش های راســت 16 بیتی SI و DI برای آدرس دهی ایندکس شده استفاده میشن و بعضی وقت ها داخل جمع و تفریق استفاده میشه. دو مجموعه ثبات ایندکس Register Index وجود دارد
Source index شاخص مبدا برای عملیات روی رشته ها انجام میشه Destination index شاخص مقصد برای عملیات روی رشته ها انجام میشه

ثبات های اشاره گر Registers Pointer رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP، هستن IP,BP سه دسته اشاره گر داریم: اشاره گر دستورالعمل (IP) instruction pointer ثبات 16 بیتی IP آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه ثبات های اشاره گر Registers Pointer) رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP، هستن IP,BP سه دسته اشاره گر داریم: 1 اشاره گر دستورالعمل (IP) instruction pointer ثبات 16 بیتی IP آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه جمع IP با ثبات CS (به عنوان CS:IP) ادرس کاملی از دستور فعلی در سگمنت کد به ما میده 2 اشــاره گر پشــته یا Pointer Stack ثبات 16 بیتی SP مقدار افســت موجود در پشته برنامه رو میده اجتماع SP و SS به شکل SS:SP به موقعیت فعلی داده یا ادرس پشته در برنامه اشاره میکنه 3 اشاره گر پایه BP Pointer Base ثبات 16 بیتی BP به طور زیاد در اجرا متغیرهای پارامتری انتقال داده شده به زیر مجموعه ها کمک میکنه در رجیستری SS با offset در BP برای به دست آوردن محل پارامتر ترکیب میشــن BP همچنین میتونه با DI و SI به عنوان ثبات های پایه برای آدرس دهی های ویژه استفاده شه.

ثبات AX انباشــتگر اصلی accumulator primary در ورودی خروجی و بیش تر دستور های محاسباتی استفاده میشه به عنوان مثال عملیات ضرب یک operands با اســتفاده از رجیستر EAX یا AX یا AL با توجه به اندازه عملوند ذخیره میشه ثبات BX به عنوان ثبات پایه Register Base شناخته میشه چون داخل ادرس دهی استفاده میشه ثبات CX به عنوان ثبات شمارنده Register Count شناخته میشه ثبات های ECX، CX تعداد تکرار حلقه ها را داخل عملیات های تکراری ذخیره میکنن ثبات DX به عنوان ثبات داده Register Data شــناخته میشــه در عملیات ورودی خروجی هم اســتفاده میشه همچنین با استفاده از ثبات AX به همراه DX برای ضرب و تقسیم مقدار های بزرگ هم کاربرد داره

برا درک مطلب بالا کمکتون میکنه خوب بفهمیدش جلوتر مطلب رو خوب براتون باز میکنم
برا درک مطلب بالا کمکتون میکنه خوب بفهمیدش جلوتر مطلب رو خوب براتون باز میکنم

ثبات ها (Registeres) در زبان اسمبلی عملیات انجام شــده توسط پردازنده بیشتر شامل پردازش داده هاست این داده ها میتوانند داخل حافظه ذخیره شن و از اون جا به اونا دسترسی داشت خوندن داده و ذخیره داده ها داخل حافظه فرایند پردازنده را کند میکنه چون این کار فرآیندهای پیچیده ای برای ارسال درخواست داده از طریق باس کنترل و به واحد ذخیره سازی حافظه و گرفتن اطلاعات از طریق همون کاناله برای سرعت بخشیدن به عملیات پردازنده، پردازنده شامل برخی از مکان های ذخیره سازی داخلی به نام ثبات یا رجیستر هست رجیسترها عناصر داده را برای پردازش بدون نیاز به دسترسی به حافظه اصلی، ذخیره میکنن تعداد ثبات ها در تراشه پردازنده محدوده ده معماری 32 بیتی و 6 پردازنده 16 بیتی در معماری IA32- وجود دارد. ریجستر ها به سه دسته تقسیم میشن: 1- ثبات های عمومی Registers General 2- ثبات های کنترل Registers Control 3- ثبات های سمگنت Registers Segment حالا خود ریجستر های عمومی به سه دسته تقسیم میشن ثبات داده Registers Data ثبات های اشاره گر Registers Pointer ثبات های ایندکس Registers Index Registers Data ثبات داده چهار رجیستر داده 32 بیتی برای عملیات محاسباتی، منطقی و سایر موارد استفاده میشه این رجیسترهای 32 بیتی به سه روش قابل استفاده ان به عنوان ثبات 32 بیتی کامل EAX، EBX، ECX، EDX بخش کم ارزش از رجیسترهای 32 بیتی میتوانند به عنوان چهار رجیستر داده 16 بیتی استفاده شن AX، BX، CX و DX. بخــش کم ارزش و پر ارزش از چهــار ثبات 16 بیتی به عنوان هشت ثبات داده 8 بیتی استفاده شود: AH، AL، BH، BL، CH، CL، DH و DL.

بخش های مختلف حافظه (memory) را به سه بخش تقسیم میکنیم: * ســگمنت داده ( data segment) با ســگمنت data. و .bss نمایش داده میشــه از سگمنت data. برای اعلام منطقه حافظه که عناصر داده برای برنامه ذخیره میشن استفاده میشه این سگمنت بعد از اعلام عناصر داده قابل گسترش نیست و در طول برنامه مون ایستا میمونه یعنی نمیشه تغییرش داد ثابته * سگمنت bss. یک سگمنت حافظه استاتیکه که شامل بافر برای داده ها در برنامه است که بعدا اعلام میشه * ســگمنت کد(code segment) توسط سگمنت text. اعلام میشه این یک فضا از حافظه را تعریف میکنه که کدهای دستورالعمل را ذخیره میکنه این بخش ثابته * سگمنت پشــته یا Stack – این سگمنت شامل مقادیر داده هست که به توابع و رویه های درون برنامه منتقل میشه


سینتکس در‌ زبان اسمبلی: یک برنامه اسمبلی می تونه به سه بخش زیر تقسیم شه: بخش data این بخش برای اعلام داده ها های اولیه یا ثابت استفاده میشه این داده در زمان اجرا تغییر نمیکنه سینتکس به صورت زیره section.data بخش bss این بخش برای اعلام متغیر ها استفاده میشه سینتکس به سورت زیره section.bss بخش tetx این بخش برای نگه داشتن کد اصلی استفاده میشه این بخش با اعلام متغیر سراسری _start شروع میشه که به هسته (core ) میگه که اجرای برنامه از کجا باید شروع بشه سینتکس به صورت زیره section.text section_start :start_ کامنت ها در زبان اسمبلی با (;) شروع میشن مثال This program a good; برنامه های نوشته شده با زبان اسمبلی به سه دستور تقسیم میشن: دستورالعمل اجرایی: یا دستور العمل های ساده به پردازنده (CPU) میگن چه کاری انجام بده هر دستورالعمل شامل یک نوع کد عملیاتیه که بهش میگن opcode هر دستورالعمل اجرایی یک دستورالعمل زبان ماشین تولید میکنه دستورالعمل های اسمبلر: در مورد جنبه ها مختلف روند مونتاژ به اسمبلر میگن که این دستورات غیر قابل اجران و دستورالعمل زبان ماشین تولید نمی کنن ماکروها: ماکروها اساسا مکانیسم جایگزینی متن هستن هر کدام از دســتورات زبان اســمبلی در یک سطر جدا نوشته میشن همه ی اون ها از قالب زیر استفاده میکنن [lable] mnemonic operands [comment] یک‌ دستورالعمل شامل دو بخش هست یکی قسمت اول نام دستورالعمل mnemonic که قراره اجرا بشه و دومی ان عملوند ها operands یا پارامتر های دستور هستن

به این میگن ادرس متغیر محلی local
به این میگن ادرس متغیر محلی local

برای اموزش و یاد گرفتن کلی مطالب و دانلود کردن ابزار مهندسی معکوس یا دیباگر ها یا هر چی میتونید از این چند تا سایت استفاده کنید https://legend.octopuslabs.io/ https://www.tuts4you.com/ https://www.dr-farfar.com/

اینجا اگه نگاه کنید جایی که قرمز هست وقتی ()f1 متغیر های a,b,c رو اختصاص میده مقدار اونها تو ادرس 0x1FF860 ذخیره میشه اگر خوا
اینجا اگه نگاه کنید جایی که قرمز هست وقتی ()f1 متغیر های a,b,c رو اختصاص میده مقدار اونها تو ادرس 0x1FF860 ذخیره میشه اگر خواستید با برنامه ollydbg کار کنید و خواستید برید روی استپ بعد میتونید از F8 استفاده کنید

پشته stack: یکی از انواع ساختار ها داده است که برای ذخیره و بازیابی داده ها استفاده میشه و در طراحی و پیاده سازی نرم افزار ها کاربرد داره پشته از خارج برعکس عمل میکنه یعنی چی LIFO: یعنی اخرین ورودی اولین خروجی last input first output FIFO: یعنی اولین ورودی اولین خروجی first input first output خب حالا میخایم بریم سراغ مهم ترین عملیات اصلی stack Push: یک عنصر رو به بالای پشته اضافه میکند Pop: عنصر بالای پشته رو حذف میکنه Peek: عنصر بالای پشته رو بازیابی میکنه ولی حذف نمیکنه StackEmpty: خالی بودن پشته رو تست میکنه Clear: تمام عنصر ها element ها رو حذف میکنه Contains: مشخص میکنه که عنصری توی پشته وجود داره یا نه CooyTo: محتویات پشته رو در ارایه از نوع object شی کپی میکند در حقیقت ‌پشته از سه پخش اختصاص داده شده به یک برنامه در حال اجرا در حافظه (RAM ) هست این سه بخش شامل: بخش کد (کد برنامه) پشته (stack) بخش داده(Heap & Bss)

نمونه کد اسمبلی معماری x64 که یک تابع function خالی هست
f: push rbp mov rbp, rsp nop pop rbp ret


ما در مهندسی معکوس نرم افزار چند تا معماری داریم معماری اول Arm یا همون شامل برنامه ها و اپ های اندرویدی میشه و معماری دوم x64 x86 شامل برنامه های ویندوزی یا همون سیستم عامل 64 86 میشه و معماری دیگه هم داریم mips که شامل مجموعه دستور العمل (isa) برای کامپیوتر های کم دستور (risc)هست معماری اول میپس 32 بیتی بود و بعد ها 64 بیتی به اون اضافه شد

دستورالعمل ها برای تعریف عملوند ها (operand) استفاده میشوند انواع دستورالعمل ها و اندازه ی اونها q => quad 64 bit l => long 32 bit w => word 16 bit b => byte 8 bit

اعداد باینری binary number:
هر عدد یا شماره رو با دو رقم نشون میدن مثل 0,1 اعداد باینری در مبنای 2 هستن
اعداد اکتال octal number:
اعداد اکتال بر مبنای 8 هستن و هشت رقم شماره وجود داره برای شمردن 0 1 2 3 4 5 6 7 8 9 10 & ....
اعداد هگزادسیمال hexadecimal number:
اعداد هگزادسیمال بر مبنای16 هستن و در شمارش میگیم هر رقم 4 بیت داره 0 1 2 3 4 5 6 7 8 9 A B C D E F یعنی مثلا وقتی میخایم بگیم 14 نمیگیم 14 میگیم E

معرفی دیس اسمبلرها disassembler: برنامه ای که زبان ماشین رو به زبان اسمبلی تبدیل میکنه چند تا دیس اسمبلر معروف Ida Ollydbg Ghidra Windbg