Friday, October 01, 2010

GDB, Small Quick Start

به نام دوست

gdb ابزار پایش (debug)  برنامه‌های در لینوکس است. و اصولا برای برنامه‌های نوشته شده به زبان C و C++ استفاده میشود.

مراحل استفاده از gdb:
۱- کامپایل برنامه به آپشن پایش (این option اطلاعات مربوط به پایش برنامه توسط gdb را در فایل اجرایی قرار میدهد)
gcc -ggdb test.cc -o test
۲- اجرای gdb .. برای راحتی کار فایلی که میبایست توسط gdb پایش شود در خط فرمان مشخص میشود:
gdb test
۳- صدور دستورات اجرا
در خط فرمان gdb، دستور help شیوه استفاده از دستورات مختلف را نمایش خواهد داد. دستورات رایج و پرکاربرد به این شرح هستند:
  • l یا list که خطوط جاری(source code) از کد در حال اجرا را نمایش میدهد
  •  run: برنامه را از ابتدا تا انتها اجرا میکند
  • start: برنامه را اجرا میکند و در ابتدای تابع main متوقف میشود 
  • s یا step: برنامه را یک خط اجرا میکند و اگر خط اجرایی تابع باشد به درون آن میرود (step into)
  • n یا next: یک خط از برنامه را اجرا میکند، اما اگر خط اجرایی دارای تابع بود به داخل آن نمیرود.
  • rbreak: که در ادامه آن نام فانکشن به صورت یک regularexpression می‌آید، در مکان تمام توابعی که با آن مطابق باشند یک break point قرار میدهد
  • print: که در ادامه آن نام متغیر می‌آید، مقدار متغیر را نشان میدهد.
  • c یا continue: به معنای ادامه اجرای برنامه

توجه: در اثنای اجرای یک برنامه، با فشردن ctrl+c میتوان اجرا برنامه را متوقف کرد و به شیوه دلخواه اجرا را دامه داد.
توجه: فشردن Enter در خط فرمان خالی gdb، به منزله اجرای آخرین دستور اجرا شده است.

این فایل میتواند راهنمای مناسبی باشد.

پربار و شادمان باشید

Saturday, September 25, 2010

Memory Protection (live with more safety) #2

به نام دوست

در ادامه مباحث مربوط به محافظت حافظه موضوع Position Independent Execution را بررسی میکنیم.
برنامه‌ای که با این روش که اصطلاحا PIE نامیده میشود، کامپایل شده باشد به سیستم‌عامل اجازه میدهد که قسمتهای مختلف process را در مکانهای گوناگون حافظه load کند.
اصل موضوع آن است که حدس زدن قسمتهای یک process کمک شایانی به یک hacker میکند و به صورت معمولی (کامپایل بدون PIE) مکانهای لود قسمتهای یک process‌ در لینوکس ثابت هستند.
شیوه استفاده از این روش در هنگام کامپایل به این شرح است:
gcc -pie   or gcc -fPIE

در هسته(kernel)های جدید امکان لود قسمتهای یک پردازش که به صورت PIE کامپایل نشده باشد به صورت random در حافظه وجود دارد. برای این موضوع باید مقدار پارامتر /proc/sys/kernel/randomize_va_space به شیوه مناسب تنظیم شود.
اگر مقدار آن ۲ باشد stack و heap و درخواستهای mmap را به صورت تصادفی انتخاب خواهد کرد و اگر مقدار آن یک باشد فقط فضای اstack تصادفی خواهد بود.
مقدار صفر نیز به معنای غیر فعال شدن آن است.

PIE تاثیر اندکی بر روی performance دارد که از این منظر معمولا بر روی برنامه‌های مهم فعال است.

منابع:
طبق پست قبلی

Thursday, September 16, 2010

Memory Protection (live with more safety) #1

به نام دوست

مکانیزمهای محافظت حافظه برنامه، شیوه‌هایی جهت محدود کردن فعالیتهای خرابی حافظه مانند Buffer overflow میباشند.
آنچه در ادامه می‌آید کنجکاوی یک غیر‌حرفه‌ای در این زمینه است:


FORTIFY_SOURCE
ایده کلی: حالتهایی وجود دارد که کامپایلر میتواند میزان حافظه اختصاص داده شده به buffer را تشخیص بدهد ( گرفتن حافظه به صورت static یا با استفاده از malloc) در این صورت، امکان کنترل فانکشنهایی که بر روی آنها کار میکنند وجود دارد تا به این واسطه از بروز overflow جلوگیری شود.
به عبارتی نمونه‌هایی امن از توابع غیر امن به کار گرفته میشوند که کنترلهای ویژه‌ای بر روی فعالیتهای حافظه جهت اطمینان از عدم بروز overflow انجام میدهند.
این شیوه از مجموعه مشخصی از توابع به شرح زیر پشتیبانی میکند:

mem{cpy,pcpy,move,set},
st{r,p,nc}py, str{,n}cat, {,v}s{,n}printf
شیوه استفاده:

gcc -D_FORTIFY_SOURCE=2 -O2
کاربرد این روش تا آنجاست که امکان تشخیص محدوده حافظه وجود داشته باشد.
به مثالهای زیر توجه کنید:
char buf[5];
/* 1) Known correct.
      No runtime checking is needed, memcpy/strcpy
      functions are called (or their equivalents inline).  */
memcpy (buf, foo, 5);
strcpy (buf, "abcd");
/* 2) Not known if correct, but checkable at runtime.
      The compiler knows the number of bytes remaining in object,
      but doesn't know the length of the actual copy that will happen.
      Alternative functions __memcpy_chk or __strcpy_chk are used in
      this case that check whether buffer overflow happened.  If buffer
      overflow is detected, __chk_fail () is called (the normal action
      is to abort () the application, perhaps by writing some message
      to stderr.  */
memcpy (buf, foo, n);
strcpy (buf, bar);
/* 3) Known incorrect.
      The compiler can detect buffer overflows at compile
      time.  It issues warnings and calls the checking alternatives
      at runtime.  */
memcpy (buf, foo, 6);
strcpy (buf, "abcde");
/* 4) Not known if correct, not checkable at runtime.
      The compiler doesn't know the buffer size, no checking
      is done.  Overflows will go undetected in these cases.  */
memcpy (p, q, n);
strcpy (p, q);

 منابع:
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
http://fedoraproject.org/wiki/Security/Features
http://wiki.debian.org/Hardening
و اینجا

Tuesday, September 14, 2010

libguestfs, A tools for fly

به نام دوست

libguestfs ابزار دسترسی به دیسکهای ماشینهای مجازی است. با استفاده از این ابزار امکان انجام تغییرات در ماشینهای مجازی از درون host و همچنین نوشتن scriptهای مناسب جهت انجام تغییرات به صورت اتوماتیک وجود دارد.

استفاده از libguestfs به روشهای گوناگون امکان‌پذیر است.
  1. برنامه‌نویسی(دارای کتابخانه‌ای جهت استفاده در C و C++ میباشد و همچنین امکان اتصال به perl, python‌و ... وجود دارد)
  2. به صورت خط فرمان
    1. virt-rescue که یک rescue shell در اختیار قرار میدهد
    2. guestfish یک interactive shell که تمام قابلیتهای libguestfs را در اختیار میگذارد.
  3. mount کردن دیسکها که توسط دستور guestmount انجام میشود.
 به عنوان نمونه یکی از شیوه‌های استفاده از guestfish به این شرح است:

[root@- -]# guestfish -i VMs/win98.qcow2


Welcome to guestfish, the libguestfs filesystem interactive shell for
editing virtual machine filesystems.

Type: 'help' for help with commands
      'quit' to quit the shell

> ls /
My Documents
Program Files
autoexec.bat

دستور virt-inspector امکان اطلاع از وضعیت دیسک (Mount pointها)، نوع سیستم عامل و ... را فراهم می‌آورد.
شیوه استفاده:
[root@- -]# virt-inspector ../..//VMs/win98.qcow2
windows  on /dev/sda1:
  Mountpoints:
    /dev/sda1                      /
  Filesystems:
    /dev/sda1:
      type: ntfs
      content: windows-root