Tan's Blog.

304Challenge:代码分析3

字数统计: 638阅读时长: 2 min
2019/04/28 Share

sub_E90代码分析

继续分析接下来的switch分支情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	  case 144:
goto LABEL_38;
case 145:
if ( !*((_DWORD *)v1 + 10) )
goto LABEL_38;
return v2;
case 146:
if ( !*((_DWORD *)v1 + 10) )
return v2;
goto LABEL_38;
case 147:
if ( *((_DWORD *)v1 + 10) < 0 )
goto LABEL_38;
return v2;
case 148:
if ( *((_DWORD *)v1 + 10) <= 0 )
goto LABEL_38;
return v2;
case 149:
if ( *((_DWORD *)v1 + 10) <= 0 )
return v2;
goto LABEL_38;
case 150:
if ( *((_DWORD *)v1 + 10) >= 0 )
LABEL_38:
*((_WORD *)v1 + 15) = __ROL2__(*((_WORD *)v7 + 1), 8) + v8;
return v2;

其实可以看出这些情况主要负责执行控制指令,JMP、JZ、JNZ、JG、JS、JNS这些指令。
对于144,执行的是无条件跳转指令JMP,跳转到相应的地址。
145,执行的是等于零则跳转指令JZ,跳转到相应的地址。
146,执行的是不等于零则跳转指令JNZ,跳转到相应的地址。
147,执行的是负号则跳转指令JS,跳转到相应的地址。
148,执行的是不大于0则跳转指令JNG,跳转到相应的地址。
149,执行的是大于0则跳转指令JG,跳转到相应的地址。
150,执行的是非负则跳转指令JNS,跳转到相应的地址。
只看这些伪代码是分析不出来具体指令的,比如说当和0比较的时候,如何区别JS和JL呢,在这时就要结合汇编代码一起看了,看IDA文本视图,就别看IDA图形视图了,找线和框框容易找哭。文本视图里case的情况都是集中在一起的,更容易分析。然后根据汇编代码确定出具体的指令,拿伪代码做验证,这样就可以了。

总结

先来总结今天遇到的汇编代码

指令含义操作码
JMP $R跳转到$R给出的地址32
JZ $R1,$R2,$R3如果$R1=$R2,跳转到R3给出的地址33
JNZ $R1,$R2,$R3如果$R1!=$R2,跳转到R3给出的地址34
JS $R1,$R2如果$R1<0,跳转到R2给出的地址35
JNS $R1,$R2如果$R1>=0,跳转到R2给出的地址38
JG $R1,$R2,$R3如果$R1>$R2,跳转到R3给出的地址37
JNG $R1,$R2,$R3如果$R1<=$R2,跳转到R3给出的地址36

JMP指令的实现很简单,把$IP寄存器的值修改为JMP指令的寄存器操作数里的数值就行了。

1
2
3
4
5
6
7
8
9
10
11
12
JMP:
badAddress(R[RAM[R[$IP]+1]],R[$IP]);
R[$IP]=R[RAM[R[$IP]+1]];
JZ:
if(R[RAM[R[$IP]+1]]==R[RAM[R[$IP]+2]]){
badAddress(R[RAM[R[$IP]+3]],R[$IP]);
R[$IP]=R[RAM[R[$IP]+3]];
}
else{
R[$IP]=R[$IP]+4;
}
······

CATALOG
  1. 1. sub_E90代码分析
  2. 2. 总结