Molet

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

Molet 安全防护 2022-12-08 333浏览 0

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

. if…else…分支结构例子程序

首先来写一个简单的C语言代码例子,然后对例子代码进行介绍。例子代码如下:

#include<stdio.h>
intmain()
{
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看其反汇编代码。固定模式的头部和尾部位置省略不看,主要看其关键的反汇编代码,具体如下:

.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:00401064pushoffsetFormat;"%d\r\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段进行观察,第1段的地址范围是0040103D至00401056,第2段的地址范围是00401058至00401071,第3段的地址范围是00401073至00401081。除了第3段代码外,前面两段的代码有一个共同的特征:cmp / jxx / printf / jmp。这部分功能的特征就是if…else…的特征所在。看一下IDA绘制的该段反汇编代码的反汇编流程结构,如图1所示。

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

图1 if…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,xxx
movxxx,xxx
;比较跳转
cmpxxx,xxx
jxx_else_if
;一系列处理指令
……
jmp_if_else结束位置
_else_if:
movxxx,xxx
;比较跳转
cmpxxx,xxx
jxx_else
;一系列处理治理
……
jmp_if_else结束位置
_else:
;一系列处理指令
……
_if_else结束位置:

以上就是if…else…分支结构的大体形式。

继续浏览有关 安全 的文章
发表评论