Ollydbg - Исчезновение стека main thread'а

Тема в разделе "WASM.BEGINNERS", создана пользователем Tihon, 22 июл 2010.

  1. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    В стек main thread'а динамически заливаются значения, источник которых надо узнать.
    Пошаговое исполнение вывело на следующий код:
    Код (Text):
    1. 01194BEA   .  8D35 509F2001 LEA ESI,DWORD PTR DS:[1209F50]
    2. 01194BF0   .  EB 05         JMP SHORT GWSrv32.01194BF7
    3. 01194BF2   $  E8 0D000000   CALL GWSrv32.01194C04
    4. 01194BF7   >  B9 30000000   MOV ECX,30
    5. 01194BFC   .  57            PUSH EDI
    6. 01194BFD   .  FC            CLD
    7. 01194BFE   >  AD            LODS DWORD PTR DS:[ESI]
    8. 01194BFF   .  E8 2C000000   CALL GWSrv32.01194C30
    9. 01194C04   $  5B            POP EBX
    10. 01194C05   .  5A            POP EDX
    11. 01194C06   .  83C4 04       ADD ESP,4
    12. 01194C09   .  51            PUSH ECX
    13. 01194C0A   .  50            PUSH EAX
    14. 01194C0B   >  8A03          MOV AL,BYTE PTR DS:[EBX]
    15. 01194C0D   .  32C8          XOR CL,AL
    16. 01194C0F   .  C1C1 04       ROL ECX,4
    17. 01194C12   .  02C8          ADD CL,AL
    18. 01194C14   .  C1C1 04       ROL ECX,4
    19. 01194C17   .  2AC8          SUB CL,AL
    20. 01194C19   .  C1C1 04       ROL ECX,4
    21. 01194C1C   .  43            INC EBX
    22. 01194C1D   .  3BDA          CMP EBX,EDX
    23. 01194C1F   .  72 EA         JB SHORT GWSrv32.01194C0B
    24. 01194C21   .  58            POP EAX
    25. 01194C22   .  33C1          XOR EAX,ECX
    26. 01194C24   .  59            POP ECX
    27. 01194C25   .  AB            STOS DWORD PTR ES:[EDI]
    28. 01194C26   .  E2 D6         LOOPD SHORT GWSrv32.01194BFE
    29. 01194C28   .  5F            POP EDI
    30. 01194C29   .  FFD7          CALL EDI
    К этому моменту область стека заполнена нулями.
    Регистры выглядят так:
    После CALL EDI по адресу 001296В0 находится значение 00000FAB, соседние ячейки также заполнены константами.
    Функция по адресу 00129258 выглядит довольно странно... и странно выполняется:
    Код (Text):
    1. 00129258    55              PUSH EBP
    2. 00129259    88FC            MOV AH,BH
    3. 0012925B    81EC 79980300   SUB ESP,39879
    4. 00129261    4C              DEC ESP
    5. 00129262    CC              INT3
    6. 00129263    54              PUSH ESP
    7. 00129264    EB 14           JMP SHORT 0012927A
    8. 00129266  ^ 73 91           JNB SHORT 001291F9
    9. 00129268    0003            ADD BYTE PTR DS:[EBX],AL
    10. 0012926A    9A 5456C813 760>CALL FAR 0C76:13C85654                   ; Far call
    11. 00129271    BA 3B03FD1E     MOV EDX,1EFD033B
    12. 00129276    ED              IN EAX,DX                                ; I/O command
    13. 00129277    AC              LODS BYTE PTR DS:[ESI]
    14. 00129278    0FB552 C2       LGS EDX,FWORD PTR DS:[EDX-3E]            ; Modification of segment register
    15. 0012927C    E1 0D           LOOPDE SHORT 0012928B
    16. 0012927E    2103            AND DWORD PTR DS:[EBX],EAX
    17. 00129280    00AF 98FF57AD   ADD BYTE PTR DS:[EDI+AD57FF98],CH
    18. 00129286    CC              INT3
    19. 00129287    53              PUSH EBX
    20. 00129288    53              PUSH EBX
    21. 00129289    52              PUSH EDX
    22. 0012928A    11C0            ADC EAX,EAX
    23. 0012928C    E8 CC65FCFF     CALL 000EF85D
    24. 00129291    2D 11F08BCB     SUB EAX,CB8BF011
    25. 00129296    B1 C8           MOV CL,0C8
    26. 00129298    E8 1E9A0300     CALL 00162CBB
    27. 0012929D    F1              INT1
    28. 0012929E   /7D 00           JGE SHORT 001292A0
    29. 001292A0   \00FF            ADD BH,BH
    30. 001292A2    025B 58         ADD BL,BYTE PTR DS:[EBX+58]
    31. 001292A5    2F              DAS
    32. 001292A6    12C2            ADC AL,DL
    33. 001292A8    AA              STOS BYTE PTR ES:[EDI]
    34. 001292A9    40              INC EAX
    35. 001292AA    BC D958A0C5     MOV ESP,C5A058D9
    36. 001292AF    5C              POP ESP
    37. 001292B0    FF62 93         JMP DWORD PTR DS:[EDX-6D]
    38. 001292B3    FC              CLD
    39. 001292B4    D0A2 4107EB44   SHL BYTE PTR DS:[EDX+44EB0741],1
    40. 001292BA    2120            AND DWORD PTR DS:[EAX],ESP
    41. 001292BC    90              NOP
    42. 001292BD    A2 F386C09B     MOV BYTE PTR DS:[9BC086F3],AL
    43. 001292C2    94              XCHG EAX,ESP
    44. 001292C3    55              PUSH EBP
    45. 001292C4    51              PUSH ECX
    46. 001292C5    8AD4            MOV DL,AH
    47. 001292C7    2BF0            SUB ESI,EAX
    48. 001292C9    88C2            MOV DL,AL
    49. 001292CB    E8 03395E00     CALL 0070CBD3
    50. 001292D0    59              POP ECX
    51. 001292D1    49              DEC ECX
    52. 001292D2    98              CWDE
    53. 001292D3    AC              LODS BYTE PTR DS:[ESI]
    54. 001292D4    32C3            XOR AL,BL
    55. 001292D6    09E8            OR EAX,EBP
    56. 001292D8    0903            OR DWORD PTR DS:[EBX],EAX
    57. 001292DA    5E              POP ESI
    58. 001292DB    005A F8         ADD BYTE PTR DS:[EDX-8],BL
    59. 001292DE    6C              INS BYTE PTR ES:[EDI],DX                 ; I/O command
    60. 001292DF    0B33            OR ESI,DWORD PTR DS:[EBX]
    61. 001292E1    CF              IRETD
    62. 001292E2    61              POPAD
    63. 001292E3    EC              IN AL,DX                                 ; I/O command
    64. 001292E4    C3              RETN
    После третьего шага - SUB ESP,39879 - окно стека Ollydbg просто очищается и попытка затолкать в стек ESP на пятом шаге - приводит к завершению приложения.
    Я не понимаю, как с этим бороться... Помогите, пожалуйста.
     
  2. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Tihon
    Смотри внимательнее.
    и
    0D7h это xlatb
     
  3. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Извини, я не так опытен, как ты...
    Пожалуйста, объясни подробней!
    xlatb я нашел в инете, почитал про команду.
    Как это связано с моей проблемой?! Не вижу в своем тексте 0D7h :dntknw:

    ***********
    Если снять останов с CALL EDI - с предущего останова исполнение пролетает этот main thread до следущего в GWSrv32. А при пошаговом рубится.
    Подозреваю, что это что-то типа антиоладки...
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Tihon
    Инвалидация стека происходит. Всякое исключение при не валидном стеке приводит к завершению ядром процесса.
     
  5. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Спасибо, это я понимаю. Но почему стек становится инвалидным только при пошаговом режиме??!
     
  6. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Вопрос все еще актуален. Причем обнаружились пикантные поробности...

    1. Бряков нет... Исполняется без проблем.
    2. Бряк на 01194C29 CALL EDI (см. 1-й пост!) Майн тред дизассемблируется так, как приведено в первом посте...
    3. Но... Если бряк установлен на 01194C28 - далее два раза F7. Дизассемблер мейн треда по адресу 00129258 имеет вид:
    Код (Text):
    1. 00129258    40              INC EAX
    2. 00129259    8B1C24          MOV EBX,DWORD PTR SS:[ESP]
    3. 0012925C    F9              STC
    4. 0012925D    00F3            ADD BL,DH
    5. 0012925F    A5              MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
    6. 00129260    15 53A6F2FE     ADC EAX,FEF2A653
    7. 00129265    05 18371500     ADD EAX,153718
    8. 0012926A    F0:F2:          LOCK PREFIX REPNE:                       ; LOCK prefix is not allowed
    9. 0012926C    43              INC EBX
    10. 0012926D    51              PUSH ECX
    11. 0012926E    7B D0           JPO SHORT 00129240
    12. 00129270    198D 4DA5E8FF   SBB DWORD PTR SS:[EBP+FFE8A54D],ECX
    13. 00129276    AF              SCAS DWORD PTR ES:[EDI]
    14. 00129277    7E 1A           JLE SHORT 00129293
    15. 00129279    B6 38           MOV DH,38
    16. 0012927B    64:F4           HLT                                      ; Privileged command
    17. 0012927D    04 4B           ADD AL,4B
    18. 0012927F    A5              MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES>
    19. 00129280    15 00F05942     ADC EAX,4259F000
    20. 00129285    AC              LODS BYTE PTR DS:[ESI]
    21. 00129286    A6              CMPS BYTE PTR DS:[ESI],BYTE PTR ES:[EDI]
    22. 00129287    F5              CMC
    23. 00129288    46              INC ESI
    24. 00129289    51              PUSH ECX
    25. 0012928A    7B 66           JPO SHORT 001292F2
    26. 0012928C    FD              STD
    27. 0012928D    D5 0F           AAD 0F
    28. 0012928F    5A              POP EDX
    29. 00129290    EA 5A7B569E CAD>JMP FAR DBCA:9E567B5A                    ; Far jump
    30. 00129297    6E              OUTS DX,BYTE PTR ES:[EDI]                ; I/O command
    31. 00129298    FD              STD
    32. 00129299    1D F0A515E8     SBB EAX,E815A5F0
    33. 0012929E    81D2 15000989   ADC EDX,89090015
    34. 001292A4    4D              DEC EBP
    35. 001292A5    5E              POP ESI
    36. 001292A6    F2:67:          PREFIX REPNE:                            ; Superfluous prefix
    37. 001292A8    BF 43B20B4D     MOV EDI,4D0BB243
    38. 001292AD    59              POP ECX
    39. 001292AE    AE              SCAS BYTE PTR ES:[EDI]
    40. 001292AF    FA              CLI
    41. 001292B0    EA 75F85AC5 833>JMP FAR 3483:C55AF875                    ; Far jump
    42. 001292B7    A1 FE474A86     MOV EAX,DWORD PTR DS:[864A47FE]
    43. 001292BC    85AB 8520D574   TEST DWORD PTR DS:[EBX+74D52085],EBP
    44. 001292C2    FFF3            PUSH EBX
    45. 001292C4    44              INC ESP
    46. 001292C5    8BA7 F9E58BB8   MOV ESP,DWORD PTR DS:[EDI+B88BE5F9]
    47. 001292CB    3A16            CMP DL,BYTE PTR DS:[ESI]
    48. 001292CD    0050 D2         ADD BYTE PTR DS:[EAX-2E],DL
    49. 001292D0    4C              DEC ESP
    50. 001292D1    5E              POP ESI
    51. 001292D2    93              XCHG EAX,EBX
    52. 001292D3    7E 27           JLE SHORT 001292FC
    53. 001292D5    C2 023A         RETN 3A02
    В этом коде встречаются не менее бессмысленные "конструкции" вроде
    Код (Text):
    1. 0012926A    F0:F2:          LOCK PREFIX REPNE:                       ; LOCK prefix is not allowed
    , на которых трассировка тоже падает.
    Объясните мне, бога ради, если это ваще поддается объяснению, как установка точки бряка влияет на дезассемблирование кода?! И как с этим быть?
     
  7. Clerk

    Clerk Забанен

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

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Исследую приложение с OllyDbg.
    При работе приложения область стека начиная с адреса 0х00129258 динамически заполняется двойными словами, после чего на 0х00129258 передается управление.
    Во время работы этой функции по адресу 0х001296D0 заносится константа 0x00000FB9.
    Моя проблема - установить условное прерывание, чтобы выяснить, где именно это происходит.
    Трассировка не помогает. Вероятно, срабатывает антиотладка, и либо приложение падает в исключение и завершение процесса, либо дезассемблер "лепит горбатого"... Все, что завязано на INT3 - не проходит...
    Как правильно написать выражение для условия прерывания?
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Если я правильно понял, то в этом случае можно попробовать аппаратную точку останова на запись в эту область памяти.
     
  10. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Это стек.
    Если ставить hardware на write на блок в стеке, - фиг я доберусь до места. Имхо прерываться станет постоянно. Хотя, если считать, что трассировка этой функции невозможна - это уже можно считать решением... Завтра попробую, спасибо!
    Но я-то хотел обычное условие типа "[1296D0] == FB9"... Пробовал уже - нет прерывания.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Tihon
    Стек это особая область памяти, которая активно юзается ядром. Есть множество событий, при которых ядро пишет в стек. А в ядре хардварные регистры имеют ядерные брейки, эта регистровая часть состояния задачи переключается при трап-процессинге, поэтому пользовательский брейк при доступе к памяти из ядра не сработает. Также менеджер памяти не позволит использовать сторожевые страницы, так как сам использует этот механизм для расширения стека.
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Clerk
    Вряд ли речь про ядро идет, т.к. в вопросе есть слово "OllyDbg".
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Mika0x65
    Имелся ввиду пользовательский стек.
     
  14. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Еще раз спасибо... Сегодня поставил хардверное прерывание на запись в стек.
    В самом деле, - обычной трассировкой ничего путного не получается - я говорил.
    А с хардверным прерыванием просто замечательно имитируется трассировка стековой области.
    Правда, ничего конкретного не достиг, потому как пройти бесконечные вложенные циклы просто не хватило времени. Но метод в самом деле хорош!
     
  15. Tihon

    Tihon New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2007
    Сообщения:
    59
    Поставил я хардверное прерывание на стек, - и сижу, тупо "жмя" на F9,
    и наблюдая за статусной строкой OllyDbg... И так вот часами :dntknw:

    Но в принципе процесс можно автоматизировать.
    Вот как это может выглядеть.
    Поверх запущенной Ольки работает приложение, которое считывает текст из ее "статусной" строки (серое окно в нижней части).
    Задаем адрес в стеке, который нужно поймать.
    Приложение симулирует нажатие кнопки F9, и считывает из статусной строки адрес бряка.
    Пока не достигнуто контрольное значение адреса - процесс повторяется...

    Казалось, ничего серьезного, просто API.
    Но сама Олька при рассмотрении ее окон оказалась совсем не проста.
    Главная проблема - что "статусное окно", которое надо контролировать, - нижняя часть общего большого окна класса OllyDbg (?!). И как из него брать текст - не имею понятия.

    Помогите советом, - расскажите про Ольку. Как подступиться к этому нижнему серому окну через API?