Pointer Aliasing
تا اینجا فهمیدیم داده میتونه از Register بره داخل Memory و دوباره از طریق Pointer برگرده
حالا یک مشکل مهم تر داریم
ممکنه دو Pointer مختلف به یک قسمت از Memory اشاره کنن
مثلا:
int value = 100;
int *p = &value;
int *q = &value;
اینجا p و q دو Pointer مختلف هستن
ولی هر دو به یک Memory اشاره میکنن
value
|
0x5000
/ \
/ \
p q
پس اگر این کار رو انجام بدیم
*p = 200;
مقدار value تغییر میکنه
و وقتی بعدا این رو بخونیم
printf("%d", *q);
مقدار 200 رو میبینیم
چون p و q در واقع به یک محل اشاره میکنن
به این وضعیت میگیم
Pointer Aliasing
این موضوع برای Reverse Engineering خیلی مهمه
چون ممکنه داخل یک تابع ببینید
mov [rax], 200
و چند خط پایین تر ببینید
mov ecx, [rbx]
در نگاه اول ممکنه فکر کنید این دو دستور هیچ ارتباطی ندارن
ولی اگر
RAX = 0x5000
RBX = 0x5000
باشه
هر دو دارن با یک Memory مشترک کار میکنن
RAX ─────┐
↓
0x5000
↑
|
RBX ─────┘
پس تغییر از طریق RAX میتونه مستقیما روی چیزی که از طریق RBX خونده میشه اثر بذاره
اینجا Data Flow دیگه فقط بین Register ها نیست
باید رابطه Pointer ها و Memory Address ها رو هم دنبال کنید
یک مثال ساده تر
int value = 10;
int *p = &value;
int *q = p;
*p = 50;
int x = *q;
مسیر واقعی داده
value
↓
p
↓
q
↓
Memory
↓
50
↓
x
اما از نظر Address
p ──┐
├──> value
q ──┘
پس p و q دو مسیر متفاوت برای رسیدن به یک داده هستن
در Reverse Engineering
وقتی با Pointerها کار میکنید فقط نپرسد
این Pointer کجاست؟
باید بپرسید
این Pointer به کجا اشاره میکنه؟
چه Pointer های دیگه ای ممکنه به همین Address اشاره کنن؟
چه کسی مقدار اون Memory رو تغییر داده؟
چه کسی بعدا اون مقدار رو خونده؟
این سوالها کمک میکنن ارتباط هایی رو پیدا کنی که از روی Control Flow معمولی مشخص نیستن
تمرین:
این کد رو بررسی کنید
int value = 10;
int *p = &value;
int *q = p;
*p = 100;
int result = *q;
مسیر Data Flow رو رسم کنید
value
↓
p
↓
q
↓
*p = 100
↓
*q
↓
result
بعد مشخص کن چرا result برابر 100 میشه
در مرحله بعد میریم سراغ یک موضوع مهمتر
Memory Aliasing
در توابع مختلف
اونجا دیگه دو Pointer داخل یک تابع نداریم
یک تابع Memory رو تغییر میده و یک تابع دیگه از طریق Pointer متفاوت همون Memory رو میخونه
و دقیقا همینجا تحلیل Data Flow در باینری های واقعی شروع میکنه به دردسر درست کردن
@reverseengine
Post #1866
46