当前位置: 首页 > 科技观察

网络安全编程:If…else…C语言逆向结构分析

时间:2023-03-19 16:13:36 科技观察

If…else…分支结构示例程序先写一个简单的C语言代码示例,然后介绍示例代码。示例代码如下:#includeintmain(){inta=0,b=1,c=2;if(a>b){printf("%d\r\n",a);}elseif(b<=c){printf("%d\r\n",b);}else{printf("%d\r\n",c);}return0;}2.对以上代码进行反汇编分析很短小简单,用IDA看其反汇编代码。fixed模式头尾位置省略,主要是关键的反汇编代码,如下:.text:00401028mov[ebp+var_4],0.text:0040102Fmov[ebp+var_8],1.text:00401036mov[ebp+var_C],上面2、3行的反汇编代码是定义变量的初始化,在IDA中可以通过快捷键重命名。重命名以上3个变量后,再看剩下的反汇编代码,如下:.text:0040103Dmoveax,[ebp+var_4].text:00401040cmpeax,[ebp+var_8].text:00401043jleshortloc_401058.text:00401045movecx,[ebp+var_4].text:00401048pushecx.text:00401049pushoffsetFormat;"%d\r\n".text:0040104Ecall_printf.text:00401053addesp,8.text:00401056jmpshortloc_401084.text:00401058;------------------------------------------------.text:00401058.text:00401058loc_401058:;CODEXREF:_main+33j.text:00401058movedx,[ebp+var_8].text:0040105Bcmpedx,[ebp+var_C].text:0040105Ejgshortloc_401073.text:00401060moveax,[ebp+var_8].text:00401063pusheax.text:404010Formatr\n".text:00401069call_printf.text:0040106Eaddesp,8.text:00401071jmpshortloc_401084.text:00401073;--------------------------------------------------.text:00401073.text:00401073loc_401073:;CODEXREF:_main+4Ej.text:00401073movecx,[ebp+var_C].text:00401076pushecx.text:00401077pushoffsetFormat;"%d\r\n".text:0040107Ccall_printf.text:00401081addesp,8.text:00401084.text:00401084loc_401084:;CODEXREF:_main+46j.text:00401084;_main+61j把上面的反汇编分成3段观察,第一段的地址范围是0040103D到00401056,第二段段的地址范围是00401058到00401071,第三段的地址范围是00401073到00401081。除第三段代码外,前两段的代码有一个共同的特点:cmp/jxx/printf/jmp.这部分函数的特点是if...else....的特点看一下IDA绘制的这段反汇编代码的反汇编过程结构,如图1所示。图1if...else...反汇编过程结构在C语言代码中,有两个关键的比较会影响程序流程,即“>”和“<=”。在反汇编代码中,有两条影响主流程的条件跳转指令,分别是“jle”和“jg”。C语言代码中,“>”(大于号)对应反汇编中的“jle”(小于等于跳转),“<=”(小于等于)对应“jg”(跳转)如果大于)。注意00401043和0040105E这两个地址。jxx指令会跳过紧跟其后的指令部分,在跳转目标地址上方有一条jmp无条件跳转指令。也就是说jxx和jmp之间的部分是C语言代码中比较表达式成功后执行的代码。在反汇编代码中,如果条件跳转指令不跳转,则执行后面的指令。这样的反汇编指令和C语言的流程是一样的。条件跳转指令跳转时,对应的指令执行完后,会执行jmp指令跳转到某个地址。注意两次jmp跳转的目的地址都是00401084。3、if...else...结构总结从例子中可以找出C语言中if...else...结构对应的结构和反汇编代码,如下:初始化变量movxxx,xxxmovxxx,xxx;比较并跳转cmpxxx,xxxjxx_else_if;一系列处理指令...jmp_if_else结束位置_else_if:movxxx,xxx;比较跳转cmpxxx,xxxjxx_else;一系列的处理治理...jmp_if_else结束位置_else:;一系列处理指令..._if_else结束位置:以上是if...else...分支结构的一般形式。

猜你喜欢