اکسپلویت ویندوز: تکنیک شکار تخم‌مرغ

اگر با مباحث مربوط به Buffer Overflow آشنا باشید، حتما می دانید که اندازه Payload ها بسیار مهم است زیرا که به علت کمبود فضا امکان مانور دادن بر هر مدلی که می خواهیم، امکان پذیر نیست، به همین منظور امروز به معرفی تکنیک شکار تخم مرغ می پردازیم. در تکنیک شکار تخم‌مرغ از شکارچی تخم‌مرغ برای شکار payload واقعی استفاده می‌کنیم که این payload با یک تخم‌مرغ مشخص می‌شود. خیلی گیج کننده به نظر می رسد، درست است؟ اجازه بدهید این موضوع را به گزاره‌های کوچکتر تبدیل کنیم:

  1. در این تکنیک از دو shellcode استفاده می‌کنیم، یکی شکارچی تخم‌مرغ است و دیگری همان payload ای است که قصد اجرای آن را داریم.
  2. payload با برچسبی منحصربفرد به نام تخم‌مرغ نشانه گذاری می ‌شود. عموما تخم‌مرغی چهار حرفی را انتخاب می‌کنیم و برای ایجاد payload آنرا دوبار تکرار می‌کنیم. چرا؟ در بخش‌های بعدی متوجه خواهید شد که این کار برای بهینه کردن اندازه شکارچی تخم‌مرغ انجام می‌شود. بنابراین اگر تخم‌مرغ nope باشد و payload عبارت \x90\x90\x90\x90 باشد payload نهایی به این شکل خواهد بود:

payload = “nopenope” + “\x90\x90\x90\x90”

  1. شکارچی تخم‌مرغ یک shellcode خاص است که تخم‌مرغ‌ موجود در حافظه را جستجو و پیدا می‌کند و payload‌ی را اجرا می‌کند که توسط این تخم‌مرغ مشخص شده‌است. شکارچی تخم‌مرغ اندازه کوچکی دارد و یک shellcode است که بعد از overflow آنرا اجرا خواهید کرد.

به این ترتیب، در ابتدا در هنگام اجرای سرریز بافر معمولا بافری مانند نمونه زیر داشتیم:

buf = “A”*[offset] + [JMP ESP] + [NOP Sled] + [Shellcode]

اما حالا با شکار کردن تخم‌مرغ رابطه زیر را خواید داشت:

payload = “nopenope” + [Shellcode]buf = “A”*[offset] + [JMP ESP] + [NOP Sled] + [EggHunter(‘nope’)]

نکته مهمی که باید به آن توجه داشت این است که وقتی این برنامه EggHunter را اجرا خواهد کرد، در واقع payload باید از قبل در حافظه موجود باشد، در غیر اینصورت شکارچی تخم‌مرغ به جستجو در حافظه ادامه می‌دهد و CPU‌ را تا 100% از کار می‌اندازد.

حالا زمان خوبی است که جالبترین منبع شکار تخم‌مرغ یعنی مقاله Skape را بخوانید. از آنجائیکه در این مقاله فقط به ویندوز می‌پردازیم، تنها روی تکنیک‌های مربوط به ویندوز تمرکز خواهم کرد.

مقاله Skape بیشتر به دو روش اصلی می‌پردازد:

  1. استفاده از SEH: از طریق ثبت handler موارد استثنایی خودمان که شکار را انجام می‌دهد و 60 بایت است.
  2. استفاده از syscallها: عملکردهای IsBadReadPtr یا NtDisplayString برای شکار کردن استفاده می‌شوند. IsBadReadPtr و NtDisplayString به ترتیب 37 و 32 بایت هستند.

 

💀 مشاهده آموزش اکسپلویت ویندوز: تکنیک شکار تخم‌مرغ 

💀 مشاهده نسخه PDF آموزش اکسپلویت ویندوز: تکنیک شکار تخم‌مرغ