2013-12-07 2 views
0

У меня есть этот небольшой код C:Нужна помощь в определении кода сборки

#include<stdio.h> 
#include<stdlib.h> 
int main(int argc , char *argv[]) 
{ 
    char buff[64]; 
    if(argc<2) 
    { 
     printf("No args passed\n"); 
     return(1); 
    }  
    strcpy(buff,argv[1]); 
    return(0); 
} 

Я открыл его в Immunity Debugger, сейчас я не могу понять, где находится Главный начиная с. Я узнал AT & T язык ассемблера синтаксиса в прошлом году, но это совершенно другое. Я также вставляю код иммунитета. Существует много кода, который использовался перед загрузкой кода C и после его завершения, поэтому я не вставляю этот код из-за ограничения пространства (только часть кода, которую, как я предполагаю, могла начаться до Main &, содержит код сборки после кода C.) Plz помочь мне идентификации кода

0040128A  90    NOP 
0040128B  90    NOP 
0040128C  90    NOP 
0040128D  90    NOP 
0040128E  90    NOP 
0040128F  90    NOP 
00401290 /$ 55    PUSH EBP   ;SAVING EBP 
00401291 |. 89E5   MOV EBP,ESP   ;STORING STACK IN EBP 
00401293 |. 83EC 78  SUB ESP,78   ;CREATING SOME SPACE 
00401296 |. 83E4 F0  AND ESP,FFFFFFF0 
00401299 |. B8 00000000 MOV EAX,0  ; 
0040129E |. 83C0 0F  ADD EAX,0F  ; 
004012A1 |. 83C0 0F  ADD EAX,0F  ;;;WHAT IS THE REASON FOR ALL THESE?? 
004012A4 |. C1E8 04  SHR EAX,4  ; 
004012A7 |. C1E0 04  SHL EAX,4  ; 
004012AA |. 8945 A4  MOV DWORD PTR SS:[EBP-5C],EAX ; WHAT ARE THESE MEANT FOR ? 
004012AD |. 8B45 A4  MOV EAX,DWORD PTR SS:[EBP-5C] ;/ 
004012B0 |. E8 8B040000 CALL buff.00401740   ; WHAT ARE 2 CALLS DOING ? 
004012B5 |. E8 26010000 CALL buff.004013E0   ;/ 
004012BA |. 837D 08 01  CMP DWORD PTR SS:[EBP+8],1 ;COMPARE ARGC WITH 1(WHY NOT 2) 
004012BE |. 7F 15   JG SHORT buff.004012D5  ;JUMP IF GREATER 
004012C0 |. C70424 0030400>MOV DWORD PTR SS:[ESP],buff.00403000 ; PRINT ERROR 
004012C7 |. E8 74050000 CALL <JMP.&msvcrt.printf>   ;/ 
004012CC |. C745 B4 010000>MOV DWORD PTR SS:[EBP-4C],1 
004012D3 |. EB 1E   JMP SHORT buff.004012F3 
004012D5 |> 8B45 0C  MOV EAX,DWORD PTR SS:[EBP+C]    ; | 
004012D8 |. 83C0 04  ADD EAX,4        ; | 
004012DB |. 8B00   MOV EAX,DWORD PTR DS:[EAX]    ; | 
004012DD |. 894424 04  MOV DWORD PTR SS:[ESP+4],EAX    ; | 
004012E1 |. 8D45 B8  LEA EAX,DWORD PTR SS:[EBP-48]   ; | 
004012E4 |. 890424   MOV DWORD PTR SS:[ESP],EAX    ; | 
004012E7 |. E8 44050000 CALL <JMP.&msvcrt.strcpy>    ; \strcpy 
004012EC |. C745 B4 000000>MOV DWORD PTR SS:[EBP-4C],0 
004012F3 |> 8B45 B4  MOV EAX,DWORD PTR SS:[EBP-4C] 
004012F6 |. C9    LEAVE 
004012F7 \. C3    RETN 
004012F8  90    NOP 
004012F9  90    NOP 
004012FA  90    NOP 
004012FB  90    NOP 
004012FC  90    NOP 
004012FD  90    NOP 
004012FE  90    NOP 
004012FF  90    NOP 
00401300 /$ 55    PUSH EBP 
00401301 |. B9 F0304000 MOV ECX,buff.004030F0 
00401306 |. 89E5   MOV EBP,ESP 
00401308 |. EB 14   JMP SHORT buff.0040131E 
0040130A | 8DB6 00000000 LEA ESI,DWORD PTR DS:[ESI] 
00401310 |> 8B51 04  MOV EDX,DWORD PTR DS:[ECX+4] 
00401313 |. 8B01   MOV EAX,DWORD PTR DS:[ECX] 
00401315 |. 83C1 08  ADD ECX,8 
00401318 |. 0182 00004000 ADD DWORD PTR DS:[EDX+400000],EAX 
0040131E |> 81F9 F0304000 CMP ECX,buff.004030F0 
00401324 |.^72 EA   JB SHORT buff.00401310 
00401326 |. 5D    POP EBP 
00401327 \. C3    RETN 
00401328  90    NOP 
00401329  90    NOP 
0040132A  90    NOP 
0040132B  90    NOP 
0040132C  90    NOP 

Здесь я попытался прокомментировать все, что я мог понять, что я не мог разобрать, где поместить контрольную точку для наблюдения эффекта ввода. Я хочу контролировать вызовы и возвращать вызовы. Заранее спасибо ... Kriss

ответ

1

До тех пор, пока вы не сообщите нам больше о том, какой компилятор вы используете, флаги компилятора, библиотеки и т. Д., Трудно сказать, что именно происходит между 00401299 и 004012ba. Я предполагаю, что вы используете некоторые параметры для профилирования своей программы или проверки стека/кучи/любой целостности, которые заставляют компилятор добавлять вызовы к некоторым внутренним функциям в начале каждой из ваших функций.

«Сравнить argc с 1, почему бы не 2» - это просто способ, которым компилятор решает оптимизировать код сборки. То, что происходит

compare argc with 1 
if it's greater than 1, jump to else 
    -- Getting to here means argc was not greater than one, so its less than 2 
    push the address of the error message (buff.00403000) on the stack 
    call the print function (print error message) 
    set returncode to 1 (ss:[ebp-4c]) 
    jump to end 
else: 
    put the addresses of the buffer, and argv[1], on the stack 
    call the strcpy function 
    set returncode to 0 
end: 
retrieve the returncode from the temporary variable (ss:[ebp-4c]) 
fix the stack and return from the function 

Возвращение результатов функции в EAX есть соглашение, что все компиляторы 80x86 (что я знаю) использовать.

Если вы хотите отладить, установите первую точку останова на 004012BA, чтобы увидеть эффект argc. Установите точки останова на 4012c7 и 4012e7, здесь вызываются другие функции. Функциональные аргументы обычно передаются в стеке, поэтому посмотрите на ss: [esp] для первого аргумента, ss: [esp + 4] для второго и т. Д. (Обратите внимание, что это относится только к 4-байтным значениям, структуры, float/double numbers и т. д., вероятно, будут разными). После возврата из функций (поместите точки останова на 4012cc и 4012ec), EAX сохраняет возвращаемое значение функции. Ваша программа C игнорирует их, поэтому содержимое EAX также игнорируется в сборке.

+0

Спасибо большое Guantram. Я попробую, как ты сказал. BTW Я использую компилятор Turbo-C3. Есть ли способ заставить компилятор или отладчик Immunity включать функциональные строки (используемые в C) в машинный код также (или любой трюк для идентификации)? Я мог видеть, что Debugger включает несколько C-кодов. На самом деле я начинаю изучать отладку и реверсирование. Не могли бы вы рассказать о том, как мне это сделать? Спасибо ... – kriss

+0

Turbo C 3? Я не могу поверить, что это, должно быть, прошло 20 лет с тех пор, как я использовал это последнее, и я уверен, что он не поддерживает 32 бит, которые использует ваш код сборки. Вы уверены, что используете Turbo C? Старая вещь Borland? –

+0

Сначала я использовал компилятор DevShed-4.9.9.2, но я догадался, что он добавляет слишком много ассемблерного кода (он генерировал много кода для загрузки программы в память и после основной программы). Тогда я подумал попробовать попробовать TurboC3. – kriss

Смежные вопросы