首页
社区
课程
招聘
[原创]【学习笔记】二数组逆向、多维数组逆向与寻址,桶排序反编译分析
发表于: 2019-10-13 17:56 4486

[原创]【学习笔记】二数组逆向、多维数组逆向与寻址,桶排序反编译分析

2019-10-13 17:56
4486

直接上例子

0x1

int arr[][4] =  {1,2,3,4,5,6,7,8,9,10,11,12};

 0040B538 mov dword ptr [ebp-30h],1
 0040B53F mov dword ptr [ebp-2Ch],2 
 0040B546 mov dword ptr [ebp-28h],3
 0040B54D mov dword ptr [ebp-24h],4
 0040B554 mov dword ptr [ebp-20h],5
 0040B55B mov dword ptr [ebp-1Ch],6
 0040B562 mov dword ptr [ebp-18h],7
 0040B569 mov dword ptr [ebp-14h],8
 0040B570 mov dword ptr [ebp-10h],9
 0040B577 mov dword ptr [ebp-0Ch],0Ah
 0040B57E mov dword ptr [ebp-8],0Bh
 0040B585 mov dword ptr [ebp-4],0Ch  
由此可见,多维数组的分配方式和一维数组没区别

0x2 多维数组的寻址方式

比如说 int a[8][5];

寻址 a[4][3]的时候,寄存器就会用a[4*5+3]来找
例子:
int  arr[2][3] ;

22:   arr[1][2]=21; //1*3+2 1*0x12(3*4)

0040B89E   mov         ecx,1

0040B8A1   imul        ecx,ecx,0Ch //1*12=1*3*4    乘4是因为数组元素是int型

0040B8A4   lea         edx,[ebp+ecx-18h]

0040B8A8   mov         eax,2

0040B8AB   mov         dword ptr [edx+eax*4],15h   //(1*3)*4+2*4   



int arr[2][4] ;

22:   arr[i][j]=21;

0040B8A4   mov         ecx,dword ptr [ebp-24h] // i

0040B8A7   shl         ecx,4 ///编译器优化  i*4*4=i左移4位(4*4=16  16=2**4)    

0040B8AA   lea         edx,[ebp+ecx-20h]//行的首地址

0040B8AE   mov         eax,dword ptr [j]

0040B8B1   mov         dword ptr [edx+eax*4],15h  ==i*4*4+j*4



0x3

并排序反编译

参数:无



局部变量:larr[8]={3,5,7,9,12,25,34,55}(-20...)

larr1[6]={4,7,9,11,13,16}(-38...-24)

[ebp-3c]:la=0  ,[ebp-40]:lb=0   [ebp-44]:lc=14

larr2[14]={0}  {-7c...-48}  [ebp-80]:ld=0  [ebp-84]:le

全局变量:


返回值:

0


int larr[8]={3,5,7,9,12,25,34,55};  int  larr1[6]={4,7,9,11,13,16};  int  la=0,lb=0,lc=14;  printf("%d**",lc);  int  larr2[14]={0};  int ld=0;    while(la<8||lb<6)    {      if(larr[la]<larr1[lb]  && (lb<6 && la<8))  {      larr2[ld]=larr[la];  ld++;      la++;      }      else  if(larr[la]>larr1[lb] && (lb<6 && la<8))  {      larr2[ld]=larr1[lb];  ld++;      lb++;      }      else  if(lb<6 && la<8)  {        larr2[ld]=larr[la];  ld++;      la++;      larr2[ld]=larr1[lb];  ld++;      lb++;      }                  if(la>=8)    while(lb<6)    {      larr2[ld]=larr1[lb];  ld++;      lb++;      }      else  if(lb>=6)    while(la<8)    {      larr2[ld]=larr[la];  la++;      ld++;      }      }      lb=0;      while(lb<14)    {            int  le=larr2[lb];          lb++;      printf("%d  ",le);    }

逆向步骤:

1,掐头去尾(把保护现场 恢复现场画成红色)

分金:

找到局部变量 全局变量 参数

定穴:

根据每个jmp画流程图

探墓:

从头开始把汇编代码分块

夺宝:

分块后就可以还原C语言了! 住:一块汇编是一个功能(一条C语言)


汇编代码:图一


详细请看excl


[课程]FART 脱壳王!加量不加价!FART作者讲授!

最后于 2021-9-8 15:38 被AMask编辑 ,原因:
上传的附件:
收藏
免费 2
支持
分享
最新回复 (14)
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
int larr[8]={3,5,7,9,12,25,34,55};                
int larr1[6]={4,7,9,11,13,16};                
int la=0,lb=0,lc=14;                                
printf("%d**",lc);                
int larr2[14]={0};                
int ld=0;                
while(la<8||lb<6)        
{
if(larr[la]<larr1[lb] && (lb<6 && la<8))
{
larr2[ld]=larr[la];                
ld++;                
la++;
}
else if(larr[la]>larr1[lb] && (lb<6 && la<8))                
{
larr2[ld]=larr1[lb];                
ld++;                
lb++;                
}                
else if(lb<6 && la<8)                
{
       larr2[ld]=larr[la];                                
ld++;
la++;        
larr2[ld]=larr1[lb];                
ld++;                
lb++;
}}

                       
if(la>=8)                

while(lb<6)                
{                        
larr2[ld]=larr1[lb];                                
ld++;        
lb++;        
}                
else if(lb>=6)                                
while(la<8)                
{                
larr2[ld]=larr[la];                
la++;                
ld++;                                
}                

lb=0;                
while(lb<14)                
{                                
int le=larr2[lb];                                
lb++;                
printf("%d ",le);
2019-10-13 17:59
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
还原的代码格式乱了 补一下。。
2019-10-13 18:00
0
雪    币: 7794
活跃值: (1496)
能力值: ( LV12,RANK:256 )
在线值:
发帖
回帖
粉丝
4
发帖建议还是markdown编辑(看代码会舒服一点
2019-10-14 00:25
0
雪    币: 1706
活跃值: (9630)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
5
去逆向下 Release. 你会有新发现.
2019-10-14 09:58
0
雪    币: 14299
活跃值: (16667)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
6
建议做成md上传,这么看着有点费劲
2019-10-14 10:01
0
雪    币: 199
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主你主业是风水大师吧
2019-10-14 10:35
0
雪    币: 181
活跃值: (616)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
call c.xxxx 这是自己写了先贴OD再贴源码的吗。符号表都被OD加载进去了
2019-10-14 11:08
0
雪    币: 10477
活跃值: (4167)
能力值: ( LV12,RANK:329 )
在线值:
发帖
回帖
粉丝
9

 22:   arr[1][2]=21;//1*3+2 1*0x12(3*4)

0xc
2019-10-14 11:40
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
夕风号 楼主你主业是风水大师吧
哈哈
2019-10-14 12:18
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
柒雪天尚 call c.xxxx 这是自己写了先贴OD再贴源码的吗。符号表都被OD加载进去了
小例子直接贴vc的debug   因为我主要是为了演示  。。
2019-10-14 12:21
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
张新琪 去逆向下 Release. 你会有新发现.
发现新大陆。。
2019-10-14 12:57
0
雪    币: 83
活跃值: (1082)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
开头结尾红色是 掐头去尾  开头第二个深蓝色 绿帽色 亮蓝色是分金吧 颜色不同 是代表不同的局部变量(结构或者类)?
2019-10-16 16:48
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
killpy 开头结尾红色是 掐头去尾 开头第二个深蓝色 绿帽色 亮蓝色是分金吧 颜色不同 是代表不同的局部变量(结构或者类)?
对,但是有些逻辑也是用颜色快标出来的
2019-10-22 12:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
楼主,私信个联系方式呗。
2019-12-3 20:34
0
游客
登录 | 注册 方可回帖
返回
//