需要帮助识别汇编代码

时间:2013-12-07 11:23:42

标签: disassembly

我有这个小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中打开它,现在我无法理解Main从哪里开始。去年我学习了AT&amp; T语法汇编语言,但这完全不同。我也粘贴了免疫代码。在加载C代码之前和完成之后还有很多代码使用,所以我没有因为空间限制而粘贴代码(只有我猜的部分代码可能在主代码和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 个答案:

答案 0 :(得分:1)

只要您不告诉我们您使用的编译器,编译器标志,库等等,我们就很难说出00401299和004012ba之间到底发生了什么。我假设您正在使用一些选项来分析您的程序,或检查堆栈/堆/任何完整性,这使得编译器在每个函数的开头添加对某些内部函数的调用。

&#34;比较argc和1,为什么不比较2&#34;就是编译器选择优化汇编代码的方式。发生了什么

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字节值,结构,浮动/双数等可能会有所不同)。从函数返回后(将断点设置为4012cc和4012ec),EAX保存函数的返回值。你的C程序忽略了它们,这就是为什么在程序集中忽略EAX的内容的原因。