Определить имя файла и последовательность символов для запуска.

Тема в разделе "WASM.RESEARCH", создана пользователем Alastor, 19 ноя 2011.

  1. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Доброго времени всем, сложилась вот такая проблема:
    Собственно, имеется бинарник, который для своего корректного запуска
    как я понял, должен читать какую-то строку из какого-то файла.
    Кусок этого кода привожу тут:
    Код (Text):
    1. .text:00401284 sub_401284 proc near                    ; CODE XREF: sub_40137D+59p
    2. .text:00401284
    3. .text:00401284 File= dword ptr -108h
    4. .text:00401284 Source= byte ptr -104h
    5. .text:00401284 var_E9= byte ptr -0E9h
    6. .text:00401284 var_4= dword ptr -4
    7. .text:00401284
    8. .text:00401284 push    ebp
    9. .text:00401285 mov     ebp, esp
    10. .text:00401287 sub     esp, 108h
    11. .text:0040128D push    esi
    12. .text:0040128E push    edi
    13. .text:0040128F mov     ecx, 6
    14. .text:00401294 mov     esi, offset aAbcdefghijklmn    
    15. .text:00401299 lea     edi, [ebp+Source]
    16. .text:0040129F rep movsd
    17. .text:004012A1 movsw
    18. .text:004012A3 movsb
    19. .text:004012A4 mov     ecx, 39h
    20. .text:004012A9 xor     eax, eax
    21. .text:004012AB lea     edi, [ebp+var_E9]
    22. .text:004012B1 rep stosd
    23. .text:004012B3 stosb
    24. .text:004012B4 push    6                               ; Count
    25. .text:004012B6 lea     eax, [ebp+Source]
    26. .text:004012BC push    eax                            
    27. .text:004012BD push    offset Dest                    
    28. .text:004012C2 call    ds:strncpy
    29. .text:004012C8 add     esp, 0Ch
    30. .text:004012CB push    6                               ; Count
    31. .text:004012CD push    offset Source                
    32. .text:004012D2 push    offset Dest                    
    33. .text:004012D7 call    ds:strncat
    34. .text:004012DD add     esp, 0Ch
    35. .text:004012E0 mov     dword_4052BC, 0
    36. .text:004012EA push    6                               ; Count
    37. .text:004012EC push    offset a_abcdefghijklm        
    38. .text:004012F1 push    offset Dest                    
    39. .text:004012F6 call    ds:strncat
    40. .text:004012FC add     esp, 0Ch
    41. .text:004012FF push    offset a__                      ; ".!."
    42. .text:00401304 push    offset Dest                    
    43. .text:00401309 call    strcat
    44. .text:0040130E add     esp, 8
    45. .text:00401311 mov     [ebp+var_4], offset Dest        
    46. .text:00401318 mov     ecx, [ebp+var_4]
    47. .text:0040131B add     ecx, 1
    48. .text:0040131E mov     [ebp+var_4], ecx
    49. .text:00401321 mov     edx, [ebp+var_4]
    50. .text:00401324 push    edx                          
    51. .text:00401325 push    offset Dest                    
    52. .text:0040132A call    strcpy
    53. .text:0040132F add     esp, 8
    54. .text:00401332 push    offset Mode                     ; "r"
    55. .text:00401337 push    offset Dest        ;в итоге имеем Dest db 'bcdef7890ab'
    56.                      db 63h ;c
    57.                      db 64h ;d
    58.                      db 65h ;e
    59.                      db 66h ;f
    60.                      db 2Eh ;.
    61.                      db 61h ;a
    62.                      db 62h ;b
    63.                      db 63h ;c
    64.                      db 64h ;d
    65.                      db 65h ;e
    66.                      db 2Eh ;.
    67.                      db 21h ;!
    68.                      db 2Eh ;.
    69. .text:0040133C call    ds:fopen
    70. .text:00401342 add     esp, 8
    71. .text:00401345 mov     [ebp+File], eax
    72. .text:0040134B cmp     [ebp+File], 0
    73. .text:00401352 jz      short loc_40136B
    74. .text:00401354 mov     eax, [ebp+File]
    75. .text:0040135A push    eax                            
    76. .text:0040135B call    ds:fclose
    77. .text:00401361 add     esp, 4
    78. .text:00401364 mov     eax, 1
    79. .text:00401369 jmp     short loc_401377
    80. .text:0040136B ; ---------------------------------------------------------------------------
    81. .text:0040136B
    82. .text:0040136B loc_40136B:                             ; CODE XREF: sub_401284+CEj
    83. .text:0040136B mov     dword_4052BC, 1
    84. .text:00401375 xor     eax, eax
    85. .text:00401377
    86. .text:00401377 loc_401377:                             ; CODE XREF: sub_401284+E5j
    87. .text:00401377 pop     edi
    88. .text:00401378 pop     esi
    89. .text:00401379 mov     esp, ebp
    90. .text:0040137B pop     ebp
    91. .text:0040137C retn
    92. .text:0040137C sub_401284 endp
    93. .text:0040137C
    94. .text:0040137D
    происходит последовательная загрузка и объединение строк, результатом которых
    будут в итоге последовательности
    Код (Text):
    1. bcdef7890ab
    2.  
    3. cdef.abcde.!.
    они "складываются" перед вызовом функции открытия файла
    Код (Text):
    1. .text:0040133C call    ds:fopen
    Я не могу разобраться где в этих строках имя файла, его расширение и
    последовательность считываемая бинарником для корректного запуска. Подскажите,
    если есть какие-то соображения.
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Во-первых, имя файла не обязательно должно укладываться в формат FILENAME.EXT, т.е. 8 символов / точка / 3 символа. Так, например, у меня в Arch Linux, при создании файла-«пустышки», система просто спросила имя, не намекая на то, что к нему обязательно нужно дописывать расширение (да и зачем, если определение типа файла автоматическое, по заголовку).

    Во-вторых, никакой «последовательности для запуска» просто не существует. Обратите внимание на 00401352: при успешном открытии мы немедля попадаем на вызов fclose.


    [UPD:] И, да — так оно выглядит в запущенном виде из-под WINE 1.3.31:
     
  3. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    >>во-вторых, никакой «последовательности для запуска» просто не существует. Обратите внимание на 00401352: при успешном открытии мы немедля попадаем на вызов fclose.

    CMP DWORD PTR SS:[EBP-0108h],0
    JE @read_fail
    MOV EAX,DWORD PTR SS:[EBP-0108h]
    PUSH EAX
    CALL fclose
    ADD ESP,04h
    MOV EAX,01h
    JMP 000401377h
    @read_fail:
    MOV DWORD PTR DS:[04052BCh],01h
    XOR EAX,EAX


    все верно, в случае ошибки открытия файла функция возвращает 0, в случае успеха - 1
     
  4. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    а потом смотришь где идет обращение к VA 04052BCh для сравнения его с еденицей (маркер того, что считать файл не удалось), это здесь

    00401C58 |> \833D BC524000>CMP DWORD PTR DS:[4052BC],0
    00401C5F |. 74 08 JE SHORT lab3.00401C69

    патчишь JE на JMP и прога удачно запускается
     
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    loleg
    ящетаю, достаточно заменить
    Код (Text):
    1. .text:0040128F mov     ecx, 6
    на
    Код (Text):
    1. .text:0040128F jmp far loc_401364
    или, побайтно, B9 06 00 00 00 → E9 D0 00 00 00.

    =)
     
  6. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    Спасибо loleg, но замену JE на JMP знаю :)))) Я в первом посте не указал одно из требований - запустить программу без модификации кода. Вот и бьюсь над этим.
     
  7. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    пробовал создавать в директории с бинарником файл (txt и просто без расширения. ), чередуя в его названии и содержимом те самые строки

    bcdef7890ab

    cdef.abcde.!.

    пока не получается. :dntknw:(
     
  8. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Alastor, ну так тогда единственное, что ему для щастья надо — это наличие в папке рядом с ним (ну, или в доступной через $PATH) файла-«пустышки» с именем
     
  9. Alastor

    Alastor Member

    Публикаций:
    0
    Регистрация:
    23 июн 2009
    Сообщения:
    43
    DEEP спасибо :)))) заработало. я почему-то не додумался использовать строки вместе :О а только чередовал их. теперь понимаю, почему IDA показала в строке по адресу
    Код (Text):
    1. .text:00401337 push    offset Dest
    обе строки, одну как объявление
    Код (Text):
    1. db 'bcdef7890ab'
    , а вторую посимвольно - отталкиваясь от этого и думал что одна строка название файла, а вторая содержимое.

    спасибо! :)