LOCK_ADDRESS_SPACE.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Clerk, 25 окт 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Здрасте.
    Это макро захватывает мьютекс при работе с ап. В XP это ExAcquireFastMutex(AddressCreationLock). Если счётчик захватов не равен одному, то вызывающий поток ждёт сигнализацию мьютекса, которая произойдёт при освобождении ресурса.

    Сервис NtAreMappedFilesTheSame в начале захватывает этот мьютекс:
    Код (Text):
    1. $   NtAreMappedFilesTheSame:
    2. $+2     push ebp
    3. $+3     mov ebp,esp
    4. $+5     push ecx
    5. $+6     push esi
    6. $+7     push edi
    7. $+8     mov eax,dword ptr fs:[124]  ; KPRCB.CurrentThread
    8. $+E     mov eax,dword ptr ds:[eax+44]   ; KTHREAD.ApcState.Process
    9. $+11        lea edi,dword ptr ds:[eax+F0]   ; EPROCESS.AddressCreationLock
    10. $+17        mov ecx,edi
    11. $+19        call ExAcquireFastMutex
    Если остановить поток вызвавший NtAreMappedFilesTheSame, то мьютекс останется захваченным и другой поток вызвавший этот сервис должен ждать освобождение мьютекса, тоесть это деадлок при рк атаке. Реально такого не происходит, кажется что на мьютексе не происходит ожидания:
    Код (Text):
    1. LOCK_RESOURCE macro
    2.     Call $ + 5
    3.     Call $ + 5
    4.     Call NtAreMappedFilesTheSame
    5. endm
    6.  
    7. .data
    8. WaitThreadId        HANDLE ?
    9. LockThreadId        HANDLE ?
    10.  
    11. LockThreadHandle    HANDLE ?
    12. WaitThreadHandle    HANDLE ?
    13.  
    14. SynchLock           BOOLEAN FALSE
    15. RaiseLock           BOOLEAN FALSE
    16. TryLocks            ULONG ?
    17. .code
    18. LockRoutine proc UserData:PVOID
    19. @@:
    20.     cmp RaiseLock,FALSE
    21.     je @b
    22.     LOCK_RESOURCE
    23.     mov RaiseLock,FALSE
    24.     jmp @b
    25.     ret
    26. LockRoutine endp
    27.  
    28. WaitRoutine proc UserData:PVOID
    29. @@:
    30.     cmp SynchLock,FALSE
    31.     je @b
    32.     LOCK_RESOURCE
    33.     mov SynchLock,FALSE
    34.     jmp @b
    35.     ret
    36. WaitRoutine endp
    37.  
    38. Entry proc
    39.     invoke CreateThread, NULL, 0, addr WaitRoutine, 123, 0, addr WaitThreadId
    40.     mov WaitThreadHandle,eax
    41.     %APIERR
    42.     invoke CreateThread, NULL, 0, addr LockRoutine, 123, 0, addr LockThreadId
    43.     mov LockThreadHandle,eax
    44.     %APIERR
    45. Freeze:
    46.     mov RaiseLock,TRUE
    47.     invoke ZwSuspendThread, LockThreadHandle, NULL
    48.     %NTERR
    49.  
    50.     inc TryLocks
    51.    
    52.     mov SynchLock,TRUE
    53.     invoke Sleep, 50    ; ms
    54.     cmp SynchLock,FALSE
    55.     jne Raised
    56.  
    57. UnFreeze:
    58.     invoke ZwResumeThread, LockThreadHandle, NULL
    59.     %NTERR
    60.     invoke ZwYieldExecution
    61.     jmp Freeze
    62. Raised:
    63.     Int 3
    64.     ret
    65. Entry endp
    Как это возможно ?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    А затем освобождает его:
    Код (Text):
    1. PAGE:004D91DA                 xor     esi, esi
    2. PAGE:004D91DC                 jmp     loc_510D94
    3. ...
    4. PAGE:00510D94 loc_510D94:                             ; CODE XREF: NtAreMappedFilesTheSame(x,x)-37B12j
    5. PAGE:00510D94                                         ; NtAreMappedFilesTheSame(x,x)-37AFEj ...
    6. PAGE:00510D94                 mov     ecx, edi
    7. PAGE:00510D96                 call    ds:__imp_@ExReleaseFastMutex@4 ; ExReleaseFastMutex(x)
    8. PAGE:00510D9C                 pop     edi
    9. PAGE:00510D9D                 mov     eax, esi
    10. PAGE:00510D9F                 pop     esi
    11. PAGE:00510DA0                 leave
    12. PAGE:00510DA1                 retn    8
    13. PAGE:00510DA1 _NtAreMappedFilesTheSame@8 endp
    Видимо нужно очень постараться, чтобы остановить выполнение потока внутри NtAreMappedFilesTheSame
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Это обычная атака типо rc. Проблема в том, что не блокируется вызывающий поток.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Возможно мне станет понятно, почему должен происходить лок, если объясните что такое рк атака
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    KeSqueer
    наверно рейс кондишен
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Если под
    не подразумевается изменение контекста потока и других хитрых действий, которых нет в приведённом выше сэмпле, то мне не ясно почему должен быть лок. NtAreMappedFilesTheSame в начале своего выполнения захватывает мъютекс, а в конце его освобождает. Соответственно, как минимум, неправильно называть макрос LOCK_RESOURCE, а хотя бы LOCK_AND_UNLOCK_RESOURCE.
    Т.е. по приведённому выше сэмплу:
    останавливает поток LockThread уже после выхода потока LockThread из выполнения NtAreMappedFilesTheSame, т.е. когда мъютекс уже освобождён, а, следовательно, после
    Код (Text):
    1.     mov SynchLock,TRUE
    поток WaitThread успешно выполнит NtAreMappedFilesTheSame без дэдлока.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Поток должен быть остановлен после захвата мьютекса.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Разобрался, это изза повышения IRQL в ExAcquireFastMutex().
     
  9. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Clerk
    Вопрос не много не потеме, каким образом происходит остановка потока?(простой интерес)
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Доставка kernel APC PspSuspendThread или как-то так, которая ждет на спецсобытии из KPROCESS.
    PsResumeThread() соотв. сигналит событие.
    Все просто
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. VOID
    2. KiSuspendThread (
    3.     IN PVOID NormalContext,
    4.     IN PVOID SystemArgument1,
    5.     IN PVOID SystemArgument2
    6.     )
    7.  
    8. /*++
    9.  
    10. Routine Description:
    11.  
    12.     This function is the kernel routine for the builtin suspend APC of a
    13.     thread. It is executed as the result of queuing the builtin suspend
    14.     APC and suspends thread execution by waiting nonalerable on the thread's
    15.     builtin suspend semaphore. When the thread is resumed, execution of
    16.     thread is continued by simply returning.
    17.  
    18. Arguments:
    19.  
    20.     NormalContext - Not used.
    21.  
    22.     SystemArgument1 - Not used.
    23.  
    24.     SystemArgument2 - Not used.
    25.  
    26. Return Value:
    27.  
    28.     None.
    29.  
    30. --*/
    31.  
    32. {
    33.  
    34.     PKTHREAD Thread;
    35.  
    36.     UNREFERENCED_PARAMETER(NormalContext);
    37.     UNREFERENCED_PARAMETER(SystemArgument1);
    38.     UNREFERENCED_PARAMETER(SystemArgument2);
    39.  
    40.     //
    41.     // Get the address of the current thread object and Wait nonalertable on
    42.     // the thread's builtin suspend semaphore.
    43.     //
    44.  
    45.     Thread = KeGetCurrentThread();
    46.     KeWaitForSingleObject(&Thread->SuspendSemaphore,
    47.                           Suspended,
    48.                           KernelMode,
    49.                           FALSE,
    50.                           NULL);
    51.  
    52.     return;
    53. }
     
  12. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Great
    n0name
    Не понятно смысловая нагрузка, имея ядро, делать попытку остановить тред, притом что нужно, всего лишь сделать запрос с не валидным указателем и перехватить исключения , захватив тем самым обработчик для текущего треда ...
    Раскажите почему? ((:)
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    n0name
    Да, спасибо за пруфкод)

    IceCrashLdr
    Ой, не виноватая я, он сам пришел... я просто написал как останавливалиется тред, остальной топик читал, но не вникал и уж тем более отвечать не собираюсь
     
  14. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Ну это одобрительно, просто тогда я не понимаю задачу, наверное тупею .... :)
     
  15. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Clerk
    Можно подробнее?
     
  16. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    IceCrashLdr
    А что не понятного, сказано же - попытка атаки типо рк для блокирования ап.
     
  18. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    Тогда вопрос каким образом будет останавливатся в нужный момент тред(точнее по идеи)? Или брутом?
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    типа рандом, да.
     
  20. IceCrashLdr

    IceCrashLdr New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2010
    Сообщения:
    193
    n0name
    понятно ...