我有这个小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
答案 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的内容的原因。