+ Reply to Thread
Results 1 to 1 of 1

Thread: Ручная декомпиляция ("Курс молодого исследователя", по мотивам "The Binary Auditor". Свободный перевод: Heroin, Prosper-H)

  1. #1
    root's Avatar

    Default Ручная декомпиляция ("Курс молодого исследователя", по мотивам "The Binary Auditor". Свободный перевод: Heroin, Prosper-H)

    Ручная декомпиляция - это искусство превращения двоичного фрагмента программы в фрагмент на языке высокого уровня (как правило, С/С++) или псевдокод. В этом комплексе упражнений вам следует восстановить исходный код бинарного фрагмента в код на С/С++ или псевдокод.

    Для примера рассмотрим следующий фрагмент:

    Code:
    mov     ebx, offset src  
    push    n                
    push    c                
    push    ebx              
    push    offset dest      
    call    _memccpy 
    add     esp, 10h
    После декомпиляции он приобретет следующий вид:

    Code:
    memcpy(dest,src,c,n);
    В последующих заданиях, вам следует проделать такую же работу, как и с приведенным выше примером, т.е. из ассемблерного фрагмента воссоздать его представление в псевдокоде или представить его интерпретацию на языке C/C++.


    Ручная декомпиляция – Упражнение 1

    Проанализировать ассемблерный код и понять как он работает:
    Code:
    ... 
     mov     edx, Var1 
     mov     ecx, Var2 
     mov     eax, edx 
     imul    ecx 
     mov     edx, eax 
     imul    edx, eax 
     mov     Var3, ecx 
     ...
    Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++.

    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • AbreC
    • Стань следующим!


    Ручная декомпиляция – Упражнение 2

    Ниже приведенный фрагмент кода - представляет собой простой цикл. Проанализировать его работу и понять как он работает:

    Code:
    ... 
     mov     dword ptr [esi], 1 
     xor     edx, edx 
     mov     [ebx], edx 
     jmp     short loc_4012F1 
    loc_4012E8: 
     mov     ecx, [esi] 
     imul    ecx, [esi] 
     mov     [esi], ecx 
     inc     dword ptr [ebx] 
    loc_4012F1: 
     cmp     dword ptr [ebx], 8 
     jl      short loc_4012E8 
     ...
    Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:

    Ручная декомпиляция – Упражнение 3

    Ниже приведенный фрагмент кода - содержит два условных оператора ветвления. Проанализировать его работу и понять как он работает:

    Code:
    push    sPassword     ; line of code             
     call    _strlen 
     
     pop     ecx      
     mov     esi, eax 
     
     mov     ebx, offset sMyPassword;  ; line of code 
     push    ebx        
     call    _strlen 
     pop     ecx 
     
     cmp     esi, eax    ; small block of code 
     jz      short loc_4012B2 
     xor     eax, eax 
     jmp     short end_proc 
     
     
    loc_4012B2: 
     push   esi  
     
     
     push    ebx           ; line of code 
     push    sPassword         
     call    _strcmp 
     add     esp, 8 
     
     test    eax, eax    ; small block of code 
     jnz     short loc_4012CC 
     mov     eax, 1 
     jmp     short end_proc 
     
    loc_4012CC:  
     xor     eax, eax     
     
    end_proc:      ; end of function 
     pop     esi 
     pop     ebx 
     pop     ebp 
     retn
    Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Так же нужно объяснить какие конструкции следует изменить (пропатчить), что бы функция всегда возвращала положительный результат.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:

    Ручная декомпиляция – Упражнение 4

    Вы уже знаете, как реверсировать базовые коды.

    Давайте возьмем следующий код:

    Code:
    push    ebp 
    mov     ebp, esp 
    add     esp, -80h 
    push    ebx 
    mov     eax, V2 
    mov     ebx, eax 
    mov     ecx, V3 
    imul    ebx, ecx 
    mov     V4, ebx 
    mov     edx, V1 
    add     edx, eax 
    sub     edx, ecx 
    mov     V1, edx 
    add     ebx, edx 
    mov     V3, ebx
    Рассмотрим его в следующем порядке:

    Code:
    push    ebp        -->    создание стека 
    mov     ebp, esp 
    add     esp, -80h  -->    наш стек занимает 128 байт 
    push    ebx        -->    сохраняем содержимое ebx 
    mov     eax, V2    -->    значение V2 
    mov     ebx, eax   -->    дублируем значение V2 
    mov     ecx, V3    -->    значение V3 
    imul    ebx, ecx   -->    считаем V2 * V3 в ebx 
    mov     V4, ebx    -->    “V4 = V2 * V3”, в ebx записываем V4 
    mov     edx, V1    -->    значение V1 
    add     edx, eax   -->    считаем (V1+V2) в edx 
    sub     edx, ecx   -->    считаем (V1+V2) - V3 
    mov     V1, edx    -->    “V1 = (V1+V2) - V3” 
    add     ebx, edx   -->    считаем (V2*V3) + V1 
    mov     V3, ebx    -->    “V3= V4+V1”
    Таким образом, весь ассемблерный код может быть декомпилирован в следующий вид:
    Code:
    { 
          unsigned char buffer[128]; 
     
          V4 = V2*V3; 
          V1 = V1+V2-V3; 
          V3 = V4+V1; 
     ...
    В этом упражнении вам нужно всего-лишь проанализировать ассемблерный фрагмент и понять почему был сформирован именно такой код на "С".


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!


    Ручная декомпиляция – Упражнение 5

    Проанализировать ассемблерный код и понять как он работает:

    Code:
    proc near                
     
    arg_0           = dword ptr  8 
    arg_4           = dword ptr  0Ch 
    arg_8           = dword ptr  10h 
     
     push    ebp 
     mov     ebp, esp 
     push    ebx 
     push    esi 
     mov     ecx, [ebp+arg_8] 
     mov     esi, [ebp+arg_0] 
     mov     eax, [ebp+arg_4] 
     mov     edx, esi 
     test    ecx, ecx 
     jnz     short loc_40125A 
     xor     eax, eax 
     jmp     short loc_401265 
    loc_401254: 
     mov     bl, [eax] 
     inc     eax 
     mov     [edx], bl 
     inc     edx 
    loc_40125A:                              
     mov     ebx, ecx 
     add     ecx, -1 
     test    ebx, ebx 
     jnz     short loc_401254 
     mov     eax, esi 
    loc_401265: 
     pop     esi 
     pop     ebx 
     pop     ebp 
     retn 
    endp
    Восстановить точный С/С++ код этого фрагмента.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!


    Ручная декомпиляция – Упражнение 6

    Проанализировать ассемблерный код и понять как он работает:

    Code:
    proc near                
     
    V1            = dword ptr  8 
    V2            = dword ptr  0Ch 
    V3            = dword ptr  10h 
    V4            = dword ptr  14h 
     
     push    ebp 
     mov     ebp, esp 
     push    esi 
     push    edi 
     mov     edi, [ebp+V4] 
     mov     esi, [ebp+V3] 
     mov     edx, [ebp+V2] 
     mov     eax, [ebp+V1] 
     test    edi, edi 
     jnz     short loc_40122C 
     xor     eax, eax 
     jmp     short loc_401237 
    loc_401219:                              
     mov     ecx, esi 
     cmp     cl, [edx] 
     jz      short loc_401227 
     mov     cl, [edx] 
     mov     [eax], cl 
     inc     edx 
     inc     eax 
     jmp     short loc_40122C 
    loc_401227:                             
     mov     [eax], cl 
     inc     eax 
     jmp     short loc_401237 
    loc_40122C:                              
     mov     ecx, edi 
     add     edi, -1 
     test    ecx, ecx 
     jnz     short loc_401219 
     xor     eax, eax 
    loc_401237:                             
     pop     edi 
     pop     esi 
     pop     ebp 
     retn 
    endp
    Восстановить точный С/С++ код этого фрагмента.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!


    Ручная декомпиляция – Упражнение 7

    Номера, указанные слева, представляют собой значения указателя стека в функции. Вам нужно восстановить точный код на С/С++ или псевдокод для этого фрагмента:

    Code:
    proc near                
    000                 push    ebx 
    004                 push    esi 
    008                 xor     ebx, ebx 
    008                 mov     [eax], ebx 
    008                 mov     ebx, ecx 
    008                 dec     ebx 
    008                 test    ebx, ebx 
    008                 jl      short loc_408135 
    008                 inc     ebx 
    loc_40810E: 
    008                 mov     ecx, [eax] 
    008                 shl     ecx, 4 
    008                 movzx   esi, byte ptr [edx] 
    008                 add     ecx, esi 
    008                 mov     [eax], ecx 
    008                 mov     ecx, [eax] 
    008                 and     ecx, 0F0000000h 
    008                 test    ecx, ecx 
    008                 jz      short loc_40812D 
    008                 mov     esi, ecx 
    008                 shr     esi, 18h 
    008                 xor     [eax], esi 
    loc_40812D:                              
    008                 not     ecx 
    008                 and     [eax], ecx 
    008                 inc     edx 
    008                 dec     ebx 
    008                 jnz     short loc_40810E 
    loc_408135:                              
    008                 pop     esi 
    004                 pop     ebx 
    000                 retn 
    sub_408100      endp
    После того, как код будет представлен в высокоуровневой интерпретации, вам следует определить используемый алгоритм и назвать его. Он относится к основам криптографии.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!


    Ручная декомпиляция – Упражнение 8

    Проанализировать ассемблерный код и понять как он работает:

    Code:
    sub_408138      proc near                
    000                 push    ebx 
    004                 push    esi 
    008                 mov     esi, edx 
    008                 dec     esi 
    008                 test    esi, esi 
    008                 jl      short loc_40816F 
    008                 inc     esi 
    loc_408142: 
    008                 xor     edx, edx 
    008                 mov     dl, [eax] 
    008                 xor     ebx, ebx 
    008                 mov     bl, cl 
    008                 add     edx, ebx 
    008                 test    edx, edx 
    008                 jge     short loc_40815B 
    008                 mov     ebx, 100h 
    008                 sub     ebx, edx 
    008                 mov     edx, ebx 
    008                 jmp     short loc_408169 
    loc_40815B:                              
    008                 cmp     edx, 100h 
    008                 jle     short loc_408169 
    008                 sub     edx, 100h 
    loc_408169:                              
    008                 mov     [eax], dl 
    008                 inc     eax 
    008                 dec     esi 
    008                 jnz     short loc_408142 
    loc_40816F: 
    008                 pop     esi 
    004                 pop     ebx 
    000                 retn 
    sub_408138      endp
    Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Вы так же должны определить используемый алгоритм и назвать его соответствующим образом. Он относится к основам криптографии.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!


    Ручная декомпиляция – Анализ реального кода 9

    Исследовать следующий фрагмент, взятый из моделируемой системы защиты, и проанализировать его:

    Code:
    procedure0  proc near             
    000                push    0                
    004                push    procedure1 
    008                call    EnumWindows 
    000                retn                     
    procedure0  endp 
    ------ 
    procedure1  proc near 
     
    ClassName        = byte ptr -204h 
    String          = byte ptr -104h 
    hwnd          = dword ptr -4 
    V1             = dword ptr  8 
     
    000                 push    ebp 
    004                 mov     ebp, esp 
    004                 add     esp, -204h     
    208                 push    ebx 
    20C                 push    esi 
    210                 push    edi 
    214                 mov     edi, [ebp+V1] 
    214                 push    100h             
    218                 lea     eax, [ebp+String] 
    218                 push    eax             
    21C                 push    edi              
    220                 call    GetWindowTextA   
     
    214                 mov     [ebp+eax+String], 0 
    214                 push    100h             
    218                 lea     eax, [ebp+ClassName]  
    218                 push    eax             
    21C                 push    edi              
    220                 call    GetClassNameA  
     
    214                 mov     [ebp+eax+ClassName], 0 
    214                 mov     esi, 3           
    214                 mov     ebx, offset Address1 
     
    Label1:                     
    214                 lea     eax, [ebp+ClassName] 
    214                 call    tolower          
     
    214                 mov     edx, [ebx] 
    214                 call    Sysutils::StrPos(char *,char *)  
     
    214                 test    eax, eax       
    214                 jnz     short Label2  
     
    214                 lea     eax, [ebp+String]  
    214                 call    tolower          
     
    214                 mov     edx, [ebx] 
    214                 call    Sysutils::StrPos(char *,char *)  
     
    214                 test    eax, eax      
    214                 jz      short Label3
    Label2:                           
    214                 push    0                
    218                 push    offset aSyslistview32  
    21C                 push    0               
    220                 push    edi             
    224                 call    FindWindowExA    
     
    214                 mov     [ebp+hwnd], eax 
    214                 push    0                
    218                 push    0                
    21C                 push    1009h          
    220                 mov     eax, [ebp+hwnd] 
    220                 push    eax              
    224                 call    SendMessageA     
     
    214                 push    0                
    218                 push    0                
    21C                 push    0Fh  
    220                 mov     eax, [ebp+hwnd] 
    220                 push    eax              
    224                 call    SendMessageA   
     
    214                 push    0                
    218                 push    0                
    21C                 push    02h       
    220                 push    edi              
    224                 call    SendMessageA     
     
    214                 push    0                
    218                 push    0                
    21C                 push    10h 
    220                 push    edi              
    224                 call    SendMessageA     
     
    Label3:                           
    214                 add     ebx, 4           
    214                 dec     esi              
    214                 jnz     short Label1 
     
    214                 mov     al, 1 
    214                 pop     edi 
    210                 pop     esi 
    20C                 pop     ebx 
    208                 mov     esp, ebp 
    004                 pop     ebp 
    000                 retn    8                
     
    procedure1  endp 
     
    aSyslistview32  db 'SysListView32' 
    Address1: 
    dd offset aRegmon       ; "REGMON" 
    dd offset aFilemon      ; "FILEMON" 
    dd offset aRegmonex     ; "REGMONEX"
    Представить интерпретацию ассемблерного кода, в псевдокоде или на C/C++. Во всех местах, где это нужно, заменить числовые значения на константы, определенные в MSDN или в Windows header files. Так же вам нужно дать детальное описание, представленного фрагмента, а так же описать его работу в рамках системы защиты от копирования.


    Варианты решений, присылать на email: support@reverse4you.org

    Данное задание успешно выполнили:
    • Стань первым!
    Last edited by root; 12-10-2013 at 10:12.
    Успех – это путь от провала до провала без потери энтузиазма. (В. Черчиль)

    Не бойся идти медленно, бойся остановиться. (Китайская пословица)

    When you lose fun and start doing things only for the payback, you're dead. (c) TCLH (Phrack 65, Intro)

  2. 2 пользователя(ей) сказали cпасибо:
    dahaka (19-09-2010) ximera (19-09-2010)
+ Reply to Thread

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:39
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org