0%

8-if语句逆向分析

if语句逆向分析

内存图

全局变量与局部变量

全局变量的特点:

  1. 全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面是否有值取决于声明时是否给定了初始值,如果没有,默认为0
  2. 全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值.
  3. 全局变量所占内存会一直存在,知道整个进程结束.
  4. 全局变量的反汇编识别:MOV 寄存器,byte/word/dword ptr ds:[0x12345678]

全局变量就是所谓的基址

局部变量的特点:

  1. 局部变量在程序编译完成后并没有分配固定的地址.

  2. 在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在堆栈中分配内存.

  3. 当局部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据.局部变量消失.

  4. 局部变量只能在方法内部使用,函数A无法使用函数B的局部变量.

  5. 局部变量的反汇编识别:[ebp-4],[ebp-8],[ebp-0xc]

函数参数确认

步骤1: 观察调用处代码

push 3

push 2

push 1

call 0040100f

步骤2: 找到平衡堆栈的代码继续论证

call 0040100f

add esp,0Ch

或者函数内部

ret 4/8/0xc/0x10

最后,两者一综合,函数的参数个数基本确定

  1. 参数传递未必都是通过堆栈,还可能通过使用寄存器
  2. 函数调用处的代码无法查看.

if语句判定

来个影响标志位语句,然后jcc,极有可能就是if语句

c语言与汇编指令是反着来的,比如<=在汇编里就是jg

函数分析步骤

自行分析

1
2
3
4
5
6
7
8
num = 0;
void func(int num1, int num2)
{
if(num1 > num2)
{
num += num2;
}
}

if_else判断

if_else练习

  1. 参数 [ebp+8]=num1, [ebp+0xc]=num2, [ebp+0x10]=num3
  2. 局部变量[ebp-4]=0, [ebp-8]=1, [ebp-0xc]=2
  3. 全局变量无
  4. 功能分析直接分析代码
  5. 返回值存在eax里,有
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int func(int num1, int num2, int num3)
{
int local1=0,local2=1,local3=2;
if(num1 <= num2)
{
local1 = local2-1;
}else if(num2 >= num3)
{
local1 = local3+1;
}else if(num1 > num2)
{
local1 = local2+local3;
}else
{
local1 = local3+local2-1;
}
return local1;
}

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/661203e9/
版权声明:转载请注明出处!