ReverseEngineering
1.32K subscribers
50 photos
11 videos
106 files
888 links
Download Telegram
بخش بیستم بافر اورفلو


Use After Free
یکی از خطرناک‌ترین باگ‌های حافظه


تا اینجا یاد گرفتیم malloc حافظه میگیره و free اون رو آزاد میکنه حالا میخوایم ببینیم اگر برنامه بعد از free دوباره از همون حافظه استفاده کنه چه اتفاقی میوفته و چطور موقع مهندسی معکوس این باگ رو تشخیص بدیم

Use After Free
یعنی چی

اسمش کاملا مشخصه اول حافظه آزاد میشه
بعد برنامه دوباره از همون حافظه استفاده میکنه یعنی برنامه فکر میکنه حافظه هنوز معتبره در حالی که سیستم عامل یا مدیریت Heap ممکنه اون حافظه رو برای چیز دیگه‌ ای استفاده کرده باشه

یک مثال ساده

#include <stdio.h> #include <stdlib.h> int main() { char *buf = malloc(32); free(buf); puts(buf); return 0; }


مشکل این کجاست؟

اینجا
free(buf);


حافظه آزاد شده ولی چند خط بعد

puts(buf);

از همون اشاره‌گر استفاده شده
این دقیقا یک Use After Free هست

چرا خطرناکه؟

چون بعد از free دیگه هیچ تضمینی وجود نداره که داده‌های قبلی داخل اون حافظه باقی مونده باشن ممکنه داده تغییر کرده باشه حافظه دوباره به بخش دیگه‌ای اختصاص داده شده باشه برنامه کرش کنه

موقع مهندسی معکوس دنبال چی بگردیم؟

اگر الگوی اینجوری دیدید
free(ptr);

و بعد چند خط پایین‌تر

ptr->field

یا
memcpy(ptr,...)

یا
printf("%s", ptr);

یا هر استفاده دیگه از ptr باید بررسی کنید که آیا همون اشاره‌گر بعد از free دوباره استفاده شده یا نه

یک مثال در دیکامپایلر

buf = malloc(64); /* ... */ free(buf); /* ... */ strcpy(buf, input);

همین چند خط برای مشکوک شدن کافیه

چطور از این باگ جلوگیری میکنن؟

یکی از ساده‌ترین روش‌ها اینه که بعد از free
اشاره‌گر رو NULL کنن

free(buf); buf = NULL;

حالا اگر جایی دوباره از buf استفاده بشه
اشکال خیلی زودتر مشخص میشه


free یعنی حافظه آزاد شده

بعد از free نباید از همون اشاره‌گر استفاده کرد
در مهندسی معکوس همیشه مسیر

malloc → free →

استفاده مجدد رو بررسی کنید

این یکی از الگوهای مهم برای پیدا کردن باگ‌های مدیریت حافظه است

تمرین:

یک برنامه ساده که از malloc و free استفاده میکنه داخل Ghidra یا IDA باز کنید و بررسی کنید آیا بعد از free دوباره از همون اشاره‌گر استفاده شده یا نه اگر اینجور الگویی پیدا کردید دلیلش رو تحلیل کنید و مشخص کنید آیا واقعا یک Use After Free است یا فقط ظاهرا این‌طور به نظر میرسه

@reverseengine
❤2
ReverseEngineering
بخش بیستم بافر اورفلو Use After Free یکی از خطرناک‌ترین باگ‌های حافظه تا اینجا یاد گرفتیم malloc حافظه میگیره و free اون رو آزاد میکنه حالا میخوایم ببینیم اگر برنامه بعد از free دوباره از همون حافظه استفاده کنه چه اتفاقی میوفته و چطور موقع مهندسی معکوس…
Part 20 Buffer Overflow


Use After Free One of the most dangerous memory bugs

So far we have learned that malloc takes memory and free frees it. Now we want to see what happens if the program uses the same memory again after free and how to detect this bug when reverse engineering

What does Use After Free
mean? Its name is quite specific. First the memory is freed. Then the program uses the same memory again, meaning the program thinks the memory is still valid, while the operating system or Heap Manager may have used that memory for something else.

A simple example:

#include <stdio.h> #include <stdlib.h>
int main() { char *buf = malloc(32); free(buf); puts(buf); return 0; }
Where is the problem with this?

Here

free(buf);


The memory is freed, but a few lines later

puts(buf);


The same pointer is used. This is exactly a Use After Free

Why is it dangerous?

Because after free there is no guarantee that the previous data will remain in that memory. The data may have changed, the memory may have been reallocated, the program may crash

What should we look for when reverse engineering?

If you see a pattern like this

free(ptr);


and then a few lines down

ptr->field


or

memcpy(ptr,...)


or

printf("%s", ptr);


or any other use of ptr, you should check whether the same pointer is reused after free

An example in the decompiler

buf = malloc(64); /* ... */ free(buf); /* ... */ strcpy(buf, input);


These few lines are enough to be suspicious

How do you prevent this bug?

One of the easiest ways is to NULL the pointer after free

free(buf); buf = NULL;


Now if buf is used again somewhere
The problem will be identified much earlier

free means memory has been freed

You should not use the same pointer after free

In reverse engineering, always follow the path

malloc → free →

Check for reuse

This is one of the important patterns for finding memory management bugs

Exercise:

Open a simple program that uses malloc and free in Ghidra or IDA and check if the same pointer is used again after free or not. If you find such a pattern, analyze the reason and determine if it is really a Use After Free or it just looks like it.

@reverseengine
❤4
اینجا به یکی از مهم‌ترین مفاهیم Binary Exploitation میرسیم

Info Leak

چرا اولین هدف یک اکسپلویت مدرنه؟


تا اینجا چند تا مکانیزم امنیتی رو شناختیم:

Stack Canary

NX

ASLR
Information Leak
یا Info Leak یعنی چی؟

Info Leak
یعنی برنامه بدون اینکه قرار بوده بخشی از اطلاعات حافظه رو در اختیار کاربر قرار بده

این اطلاعات ممکنه شامل مواردی مثل:

آدرس یک تابع

آدرس یک متغیر

آدرس heap

آدرس stack

آدرس libc


یا حتی داده‌ های حساس داخل حافظه
باشه در ظاهر شاید این اطلاعات مهم به نظر نرسن اما برای یک اکسپلویتر میتونن حکم نقشه‌ ی یک ساختمون رو داشته باشن

چرا اینقدر مهمه؟

فرض کنید ASLR فعاله

یعنی آدرس‌ها در هر بار اجرای برنامه تغییر میکنن
اگر هیچ آدرسی رو ندونید ساختن یک اکسپلویت قابل‌ اعتماد خیلی سخت میشه
اما اگر برنامه فقط یک آدرس رو ناخواسته لو بده مهاجم میتونه از همون آدرس موقعیت بقیه بخش‌ های حافظه رو هم محاسبه کنه
در این حالت بخش بزرگی از مزیت ASLR از بین میره

گاهی اوقات Info Leak خودش یک آسیب‌پذیری مستقل محسوب میشه و گاهی هم نتیجه‌ ی یک باگ دیگه است

مثلا ممکنه:

برنامه بیشتر از حد لازم داده چاپ کنه
یک اشاره‌گر (Pointer) رو مستقیم نمایش بده

بخشی از حافظه رو بدون پاک کردن برگردونه

یا یک خطای منطقی باعث افشای اطلاعات بشه

چرا بیشتر اکسپلویت‌های امروزی دو مرحله‌ای هستند؟

خیلی از حملات مدرن این شکلی‌اند:

مرحله اول پیدا کردن یک Info Leak

مرحله دوم استفاده از اطلاعات به‌دست‌ اومده برای دور زدن مکانیزم‌ هایی مثل ASLR و ادامه‌ ی حمله

به همین دلیل تعداد زیادی از تحلیل‌های امنیتی که میبینید که اولین هدف نه اجرای کد بلکه پیدا کردن یک راه برای دیدن حافظه است

یک شبیه سازی ساده:

فرض کنید وارد یک شهر ناشناس شدید
اگر هیچ نقشه‌ ای نداشته باشید پیدا کردن یک ساختمون خاص خیلی سخت میشه
اما اگر فقط آدرس یک خیابون رو بهتون بدن کم‌ کم میتونید کل نقشه شهر رو پیدا کنید

Info Leak
دقیقا همین نقش رو در حافظه برنامه‌ها داره

مکانیزم‌ هایی مثل ASLR آدرس‌ ها رو مخفی میکنن اما اگر برنامه حتی مقدار کمی از اطلاعات حافظه رو افشا کنه این محافظت تا حد زیادی بی‌ اثر میشه به همین دلیل پیدا کردن Info Leak یکی از مهم‌ ترین مراحل در تحلیل و درک اکسپلویت‌ های مدرنه
@reverseengine
ReverseEngineering
اینجا به یکی از مهم‌ترین مفاهیم Binary Exploitation میرسیم Info Leak چرا اولین هدف یک اکسپلویت مدرنه؟ تا اینجا چند تا مکانیزم امنیتی رو شناختیم: Stack Canary NX ASLR Information Leak یا Info Leak یعنی چی؟ Info Leak یعنی برنامه بدون اینکه قرار بوده…
Here we come to one of the most important concepts of Binary Exploitation

Info Leak

Why is it the first target of a modern exploit?

So far we have recognized several security mechanisms:

Stack Canary

NX

ASLR
What is Information Leak or Info Leak?

Info Leak
means that the program provides some memory information to the user without being supposed to

This information may include things like:

The address of a function

The address of a variable

The heap address

The stack address

The libc address


Or even sensitive data in memory

On the surface, this information may not seem important, but for an exploiter, it can be like a blueprint of a building

Why is it so important?

Let's say ASLR is enabled

This means that the addresses change every time the program is run

If you don't know any addresses, it's very difficult to create a reliable exploit

But if the program accidentally leaks just one address, the attacker can calculate the location of other memory locations from that address

In this case, a large part of the benefit of ASLR is lost

Sometimes an Info Leak is a standalone vulnerability, and sometimes it's the result of another bug

For example, it's possible to:

The program prints more data than necessary

Display a pointer directly

Return a portion of memory without clearing

Or a logical error causes information to be leaked

Why are most exploits today two-step?

Many modern attacks look like this:

The first step is to find an Info Leak

The second step is to use the information obtained to bypass mechanisms such as ASLR and continue the attack

That is why a lot of security analysis that you see the first goal is not to execute code but to find a way to see the memory

A simple simulation:

Suppose you enter an unknown city

If you have no map, it will be very difficult to find a specific building

But if you are only given the address of a street, you can gradually find the entire map of the city

Info Leak

It plays exactly the same role in the memory of programs

Mechanisms such as ASLR hide addresses, but if the program reveals even a small amount of memory information, this protection becomes largely ineffective. This is why finding Info Leak is one of the most important steps in analyzing and understanding modern exploits
@reverseengine
Virtual Register رجیستر های مجازی

تا اینجا فهمیدیم Dispatcher تصمیم میگیره کدوم Handler اجرا بشه و Handler هم کار اصلی رو انجام میده


Handler
ها داده‌ ها رو کجا نگه میدارن؟

روی رجیستر های واقعی CPU مثل RAX و RBX؟ معمولا نه

بیشتر ماشین‌های مجازی از چیزی به اسم Virtual Register استفاده میکنن

Virtual Register
یه فضای حافظه‌ ست که نقش رجیستر های CPU رو بازی میکنه

مثلا فرض کنید ماشین مجازی 8 تا رجیستر داره:

V0 V1 V2 V3 V4 V5 V6 V7


وقتی Opcode زیر اجرا میشه:

LOAD V0, 10

مقدار 10 داخل V0 قرار میگیره

بعد Opcode بعدی:

LOAD V1, 20

عدد 20 داخل V1 ذخیره میشه

حالا Opcode بعدی:

ADD V0, V1


ماشین مجازی مقدار V0 و V1 رو جمع میکنه

نتیجه دوباره داخل V0 ذخیره میشه

اگر بعدش این Opcode اجرا بشه:

PRINT V0

عدد 30 چاپ میشه

اینجا هیچکدوم از رجیسترهای واقعی CPU مستقیما دیده نمیشن

ممکنه داخل Handlerه ا فقط چند دستور مثل این ببینید:

mov rax, [rdi+18h]

mov rcx, [rdi+20h]

add rax, rcx

mov [rdi+18h], rax


در نگاه اول انگار برنامه فقط داره با حافظه کار میکنه

ولی در واقع:

[rdi+18h] = V0 [rdi+20h] = V1


یعنی این آدرس‌ های حافظه همون رجیستر های مجازی هستن به همین دلیل یکی از اولین کارهای تحلیلگر اینه که محل نگهداری Virtual Register ها رو پیدا کنه
وقتی بفهمید هر Offset مربوط به کدوم Virtual Register هست خوندن Handler ها چند برابر راحت‌ تر میشه

خیلی وقت‌ ها حتی اسم‌گذاری هم میکنن:

[rdi+18h] → V0 [rdi+20h] → V1 [rdi+28h] → V2


از این لحظه به بعد به جای آدرس‌ های حافظه ذهن تحلیلگر با رجیسترهای مجازی کار میکنه این کار باعث میشه منطق ماشین مجازی کم‌ کم شبیه یک CPU معمولی به نظر برسه

تمرین:

فرض کنید یک ماشین مجازی چهار رجیستر داره:

V0 V1 V2 V3


و Opcode های زیر اجرا میشن:

LOAD V0, 15

LOAD V1, 5

SUB V0, V1

PRINT V0


بدون اینکه کدی بنویسید مرحله‌ به‌ مرحله مشخص کنید بعد از اجرای هر Opcode مقدار هر Virtual Register چقدر میشه




Virtual Register So far we have understood that Dispatcher decides which Handler to execute and Handler does the main work

Where do Handlers store data?

On real CPU registers like RAX and RBX? Usually not

Most virtual machines use something called Virtual Register

Virtual Register
is a memory space that acts as CPU registers

For example, suppose the virtual machine has 8 registers:

V0 V1 V2 V3 V4 V5 V6 V7


When the following Opcode is executed:

LOAD V0, 10


10 is placed into V0

Then the next Opcode:

LOAD V1, 20


20 is stored into V1

Now the next Opcode:

ADD V0, V1


The virtual machine adds V0 and V1

The result is stored back into V0

If this Opcode is then executed:

PRINT V0


30 is printed

Here none of the actual CPU registers are directly visible

You may only see a few instructions inside the Handlers like this:

mov rax, [rdi+18h]

mov rcx, [rdi+20h]

add rax, rcx

mov [rdi+18h], rax


At first glance, it seems like the program is only working with memory

But in fact:

[rdi+18h] = V0 [rdi+20h] = V1



That is, these memory addresses are the same virtual registers, which is why one of the first tasks of the analyst is to find the location of the Virtual Registers.

When you understand which Virtual Register each Offset belongs to, reading the Handlers becomes much easier.

Many times they even give them names:

[rdi+18h] → V0 [rdi+20h] → V1 [rdi+28h] → V2


From this moment on, instead of memory addresses, the analyst's mind works with virtual registers. This makes the logic of the virtual machine look a little like a regular CPU.

Exercise:

Suppose a virtual machine It has four registers:

V0 V1 V2 V3


And the following Opcodes are executed:

LOAD V0, 15

LOAD V1, 5

SUB V0, V1

PRINT V0


Without writing any code, determine step by step what the value of each Virtual Register will be after executing each Opcode.


@reverseengine
RustyWater ShellCode Dropper has emerged as a key component in recent Static Kitten (MuddyWater) operations targeting organizations in the Gulf and broader Middle East.

Written in Rust and disguised as a legitimate looking reddit.exe, this implant serves as the main payload and backbone of their attacks. It uses a multi-stage dropper (CertificationKit.ini) that decrypts and deploys the payload at runtime, establishes registry persistence, and injects shellcode into explorer.exe for stealth.

What makes it particularly effective is its robust 8-layer anti-analysis system checking for virtual machines, debuggers, sandboxes, low resources, and analysis tools before execution. This ensures it only activates on real victim systems.

A clear example of how Iranian APT groups continue to evolve their tooling with Rust for better evasion and persistence in the region.

Full project details: https://github.com/S3N4T0R-0X0/RustyWater-ShellCode-Dropper
SSTIC2025_Slides_windows_kernel_shadow_stack_mitigation_aulnette.pdf
2.8 MB
Analyzing the Windows kernel shadow stack mitigation