graywolf's lair

Inhuman being's diary…

Driver code WTF

| 2 Comments

Вчора наш драйверщик шукаючи одну багу в коді драйвера знайшов іншу, непримітну, залишену колишнім розробником цього драйвера. Знайдіть її і ви. Це гарна вправа на знання деяких хитрих програмістських методик.

Сирці я трохи підравив, повикидавши згадки назви драйверу та більшу частину несуттєвого до баги коду і додавши своє визначення SecurityCookie (це, до речі, теж підказка 😉 ).

ULONG SecurityCookie = 0xDEADBEEF;

[ ... skipped ... ]

pUserNotificationMap->MappedSize = 
    FloatingUnitSize
    + sizeof(NOTIFICATION_MAP)
    + sizeof(SecurityCookie);

pUserNotificationMap->MappedUnits = 1;

RtlCopyBytes( 
    &pUserNotificationMap->NotificationUnit[0].NotificationInfo, 
    &NotifInfo,
    sizeof(NotifInfo) );

*((PULONG)((PCHAR)pUserNotificationMap+pUserNotificationMap->MappedSize)) = SecurityCookie;

status = CommitNotificationUnit(
    pContext,
    pInternalPolicyRule,
    pCtxString,
    pCtxThread,
    &pUserNotificationMap->NotificationUnit[0],
    sizeof(NOTIFICATION_UNIT) + FloatingUnitSize );

//
// Overflowed? Check out!
//
if( *((PULONG)((PCHAR)pUserNotificationMap+pUserNotificationMap->MappedSize)) 
        != SecurityCookie ) 
{
    status = STATUS_HEAP_CORRUPTION;
    ReportDesignError_Leave( "Memory corruption detected!" );
}

P.S. Підказка: “за що боролись, на те й напоролись” 😉

2 Comments

  1. Хоч я в цих ієрогліфах не розуміюся, проте очевидно, що автор сам наступив собі на п’ятку, записуючи байти SecurityCookie. У зміщенні MappedSize є зайвий доданок — довжина “коржика безпеки”. Пильнуймо!
    P.S.: Учора помилився при відправці…

  2. Фактично так 🙂 Єдине що MappedSize таким і має бути, бо цей елемент структури використовується для виділення області пам’яті (просто цей фрагмент не увійшов в шматок коду вище), а от при простановці “коржика” його розмір вже потрібно віднімати. А в поточному коді при перевірці на heap corruption самі її корраптили 😀

Залишити відповідь

Required fields are marked *.