همهچیز از یه مقاله شروع شد.
نوجوون بودم، نشسته بودم پای خوندن یه مقاله دربارهی هک و امنیت. توی مقاله، نویسنده با آبوتاب توضیح داده بود که یه هکر چطور یه برنامه رو باز کرده، باگهاش رو پیدا کرده. به لطف «اسمبلی»—بله، همون زبان خشک و سختی که خیلیامون ازش میترسیم—تونسته کار رو تموم کنه. همونجا بود که برای اولین بار با واژهی “assembly” روبهرو شدم. برررررگام این دیگه چیه!!!
اسمش یه حس مرموز داشت. یه چیزی که انگار پشت پردهی نرمافزار، توی مغز خود کامپیوتره.
و این برام کافی بود که کنجکاو بشم.
نزدیکتر از همیشه به فلز
چیزی که بیش از هر چیز دیگهای برای من جذاب بود، این نبود که هکرها ازش استفاده میکردن که مهندسی معکوس کنن.
حقیقتش، من دنبال چیز ترسناکتری بودم:
اینکه بفهمم سختافزار دقیقاً چطور فکر میکنه. بچه بودم و نادان! فکر میکردم کامپیوتر یه روزی به آگاهی میرسه، هرچند که با این مدل های زبانی خب انگار که اشتباه هم نکرده بودم.
وقتی فهمیدم یه حلقهی ساده، یه شرط کوچیک، یا حتی یه return
توی زبانهای سطح بالا، پایینتر که بری تبدیل میشن به کلی دستور mov
، پرشهای شرطی، و عملیات رجیستری، دیگه نتونستم به کدنویسی مثل قبل نگاه کنم.
فهمیدن اینکه یه متغیر هم میتونه بهتنهایی چند میکروثانیه یا نانوثانیه از CPU بگیره، درک اینکه stack واقعاً چطور کار میکنه، و دیدن مستقیم تعامل با حافظه، باعث شد نگاهم به تمام زبانهای برنامهنویسی دیگه عوض بشه.
تنها کدی اسمبلی که نوشتم، با افتخار 😎
اعتراف میکنم: من فقط یهبار یه کد اسمبلی نوشتم. یه Hello World ساده.
نه برای تمرین، نه برای ساخت یه ابزار، بلکه برای یه چیز خیلی خاصتر:
اینکه به دوستم پز بدم! 😂
ولی همینکه بعد از کلی تایپ کردن و اجرا کردن، دیدم برنامه کار میکنه، انگار یه طلسم شکسته شد. حس کردم دارم با ماشین حرف میزنم، مستقیم با خودِ خود CPU. نه از پشت شیشهٔ زبانهای سطح بالا، بلکه بدون واسطه، و انگار دنیا رو بهم داده بودن، و چقدر حس میکردم که دیگه شاخ غول شکستم.
داروغهای در ذهنم
از یه جایی به بعد، نمیدونم دقیقا کی بود اما یهو دیدم گاهی وقتا حتی وقتی هیچوقت دیگهای اسمبلی ننوشتم، یه چیزی تو ذهنم موند.
یه صدا. مثل اون لاشخور توی کارتون رابین هود که میگفت «ساعت ۱۲ شب شده» یا شایدم داروغه.
هر وقت یه کد سنگین، یا یه حلقهی بیخود مینویسم، صدای این داروغه میاد که میگه:
«مطمئنی این کار درسته؟ میدونی تو اسمبلی این چی از آب درمیاد؟ میدونی کش رو چطور هدر میدی؟»
اسمبلی برای من یه زبان نیست. یه یادآوری هست. یه شلاق ذهنی که باعث میشه توی Go یا Java یا Rust، با دقت بیشتری بنویسم (گرچه که توانش رو ندارم). بیشتر فکر کنم. بیشتر دقت کنم که چیکار میکنم.
مهندسی معکوس، برای تفریح
یهبار برای فان توی یه CTF شرکت کردم. چندان تیم موفقی نبودیم، ولی توی یکی از مراحل، یه فایل اجرایی داشتیم که فلگ توش پنهان شده بود. با استفاده از Ghidra و خوندن اسمبلی ساده، تونستیم الگوریتم رمزنگاریش رو مهندسی معکوس کنیم و فلگ رو دربیاریم (به لطف پادکست رادیو گیگ جادی).
توی همون لحظه یود که شاید فهمیدم حتی اگه اسمبلی نویس نباشم، حتی اگه فقط یه بار درگیرش شده باشم، باز هم اسمبلی یه چیز واقعی و ملموس و به درد بخور هستش.
چرا هنوز باید اسمبلی بلد بود؟
این روزها اکثر دولوپرها با زبانهایی کار میکنن که حتی اشارهای به رجیستر نمیکنن.
اما هنوز توی کرنل لینوکس، توی پروژههایی مثل ffmpeg یا libav، بخشهایی هستن که دستی با اسمبلی نوشته شدن. چون گاهی حتی کامپایلرهایی مثل GCC یا Clang هم نمیتونن اونقدر بهینه کد جنریت کنن.
و اونجاست که یه آدم دقیق، یه گیگا گیکِ واقعی، میتونه وارد بشه و تغییری بزرگی ایجاد کنه.
جمعبندی: زبان اسمبلی، صدایی که خاموش نمیشه
اگه بخوام توی یه جمله توصیفش کنم:
زبان اسمبلی برای من یه داروغهی ذهنیه—یه وجدان فنی که وقتی یه کد بد، تنبل، یا بیدقت مینویسم، از ته مغزم صدام میکنه و میگه: «اینم میشه یه سری
mov
وjmp
داغون.»البته که منم کم نمیارم و کد داغونم رو مینویسم 😂
ممکنه هیچوقت از اسمبلی توی پروژههام استفاده نکنم، اما اثرش همیشه هست.
مثل یه معیار یا ترازو ته توی ذهنم.
اسمبلی یادم داد که پشت هر خط کد، یه دنیای پنهان هست و اگه بخوای، میتونی واردش بشی.
اولین باشید که نظر می دهید