من در آزمایشگاه Overwrite Lab از دوره Exploits 2 توسط Corey Kallenberg از آموزش امنیتی باز استفاده کردم.
محیطی است که 32 بیتی ویندوز ایکس پی SP3 است و برنامه های Visual C ++ 2008 Express Edition بدون DEP و ASLR
لطفا کد زیر را در نظر داشته باشید:
#include
#include
#include
جایزه خالی () {
printf ("جایزه !!! n")؛
}
int unsigned int FileErrorExceptionHandler () {
printf ("FileErrorExceptionHandler () نامیده می شود ")؛
printf ("فرآیند کشتن n")؛
ExitProcess (1)؛
بازگشت 0؛
}
void read_file (char * file، int * bytes_read) {
FILE * fp؛
کاراکتر امضا نشده [1024]؛
memset (buf، 0x00،1024)؛
printf ("آدرس buf: 0x٪ 08x n"، & buf [0])؛
fp = fopen (فایل، rb)؛
اگر (fp == NULL) {
printf ("فایل را نمی توان باز کرد n")؛
برگشت؛
}
* bytes_read = fread (buf، 1،2048، fp)؛
fclose (fp)؛
}
int main (int argc، char ** argv) {
HMODULE hFlash؛
hFlash = LoadLibrary ("Flash6.ocx")؛
اگر (hFlash)
printf ("فلش بارگیری شده با موفقیت n")؛
چیز دیگری
printf ("فلش بارگیری نشد n")؛
int n؛
printf ("آدرس جایزه: 0x٪ 08x n"، جایزه)؛
printf ("آدرس n است:٪ x n"، & n)؛
n = 0x11223344؛
اگر (argc! = 2) {
printf ("استفاده:٪ s نام پرونده n"، argv [0])؛
بازگشت -1؛
}
read_file (argv [1]، & n)؛
printf ("read_file گزارش خواندن٪ d بایت n"، n)؛
بازگشت 0؛
}
به یاد آوردن ساختار زنجیره ای SEH:
سوءاستفاده من به شرح زیر است:
2 bytes 2 bytes 4 bytes
... <jmp به > <jmp به >
از کجا
اشاره گر به استدلال استثنا
را لغو می کند. این در واقع نشانی است که برنامه به زمانی که یک استثنا اتفاق می افتد (یک استثنا درست پس از تماس fread وجود دارد).
ما انتخاب می کنیم که به pop، pop، ret
کد در بخش متن به دلیل غیر ممکن است برای پرش به یک کد در پشته (برخی از مکانیسم دفاعی SEH پایه). چرا پاپ، پاپ، رت
؟ از آنجایی که در زمانیکه دستیار استثنائی شروع به کار می کند، ESP 8 بایت از آدرس اشاره گر به رکورد بعدی SEH
است که ما نیز کنترل می کنیم:
0: 000> مبادله
* 0012ffb0 *: seh_overflow! ILT + 85 (__ except_handler4) +0 (0041105a)
0012ffe0: kernel32! ValidateLocale + 2b0 (7c839ac0)
پشته اشتباه اشتباه در ffffffff
0: 000> گرم
(614.f68): نقض دسترسی - کد c0000005 (شانس اول)
استثناهایی که در اولین فرصت وجود دارد قبل از هرگونه استثناء گزارش شده است.
این استثنا ممکن است مورد انتظار و مورد استفاده قرار گیرد.
:
0: 000> dd esp L4
0012f6f8 7c9032a8 0012f7e0 * 0012ffb0 * 0012f7fc
<jmp به
(2 NOP به دلیل اینکه اندازه jmp کوتاه 2 بایت است) از اشاره گر به رکورد بعدی SEH
(در آدرس 0012ffb0
) و پرش به <jmp به
. بنابراین، هنگامی که ما پرش و اجرا پاپ، پاپ، ret
ما به پرش کوتاه برسد. از <jmp به
به شل کد کد تزریق می رسد
.
آدرس ها و مکان های خود را با WinDBG تایید کردم و مطمئن شدم که shellcode کار می کند. من حتی موفق به دریافت برنامه برای پرش به جایزه، اما نمی تواند اجرا شل کد کد تزریق (اجرا calc.exe)، من نیز شل کد متفاوت را امتحان کردم. من در windbg می بینم که من به ابتدای shellcode می روم اما به هر دلیلی shellcode بدون اجرا calc.exe پایان می یابد و من پیام را می بینم:
0: 000> g
eax = 00000000 ebx = 00000000 ecx = 7c800000 edx = 00340608 esi = 7c90de50 edi = 0012f890
eip = 7c90e4f4 esp = 0012f680 ebp = 0012f77c iopl = 0 nv تا ei pl zr na pe nc
cs = 001b ss = 0023 ds = 0023 es = 0023 fs = 003b gs = 0000 efl = 00000246
ntdll! KiFastSystemCallRet:
7c90e4f4 c3 ret
آیا کسی میتواند توضیح دهد که چرا من نمیتوانم شل کد را اجرا کنم؟
خیلی ممنون از قبل.
توجه: خصوصیات پیکربندی را پیوست میکنم تا مطمئن شوم هیچ چیزی را که ممکن است با سوءاستفاده دخالت نکرده باشد: