امروز اومدیم یه کد ساده برسی کنیم و بعدش برسیم به یه آسیب پذیری که ببینیم چطوری موجبش میشه و چی هست اصلا:
#include <stdio.h>
int main() {
char mmd[100];
fgets(mmd, sizeof(mmd), stdin);
printf(mmd);
return 0
برای برسی این کد باید یه آسیب پذیری به اسم Format String آشنا باشیم. زمانی مشهور شد که این آسیب پذیریو توی apache , wu-ftpd اکسپلویتش کردن. در حالت عادی printf میاد از ما یه format میگیره برای اینکه مشخص کنه خروجی ما به چه حالتی هستش مثلا (d,"i%")printf میاد حالا عدد صحیح برا ما پرینت میگیره حالا فکر کن کاربر بیاد ورودی mmd 3 تا %x بزاره اون موقع چی میشه؟
در واقع printf میاد اون رو به عنوان فرمت تفسیر میکنه و به چاپ رشته میاد شروع به خوندن مقادیر stack میکنه و حالا میتونه با p% بیاد ادرس های حافظه ببینه و s% بیاد رشته هایی که توی حافظه هستن رو بخونه و .... خطرناک ترین حرکتی که میتونه پیاده کنه استفاده از GOT رو به RCE دلخواه خودش برسونه. با این حرکت میشه حمله هایی مثل memory leak , arbitrary write و چیزای دیگه پیاده سازی کردش .
یکی از روشایی که میشه ازش محافظت کرد استفاده از checksec هست که وضعیتشو برسی میکنه که در چه حالتی هستش مثل چک کردن stack canary ,Aslr ....
بعدشم میشه از خود کامپایلرمون با ست کردن سویچ های -fstack-protector-strong و -Wformat-security
و ... موقع کامپایل کردنشون هست.
Join channel⚡