首页
论坛
专栏
课程

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

2019-10-13 17:56 1851

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

2019-10-13 17:56
1851
直接上例子
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


2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (14)
AMask 2019-10-13 17:59
2
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);
AMask 2019-10-13 18:00
3
0
还原的代码格式乱了 补一下。。
丿feng 3 2019-10-14 00:25
4
0
发帖建议还是markdown编辑(看代码会舒服一点
张新琪 1 2019-10-14 09:58
5
0
去逆向下 Release. 你会有新发现.
有毒 2 2019-10-14 10:01
6
0
建议做成md上传,这么看着有点费劲
夕风号 2019-10-14 10:35
7
0
楼主你主业是风水大师吧
柒雪天尚 2019-10-14 11:08
8
0
call c.xxxx 这是自己写了先贴OD再贴源码的吗。符号表都被OD加载进去了
堂前燕 1 2019-10-14 11:40
9
0

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

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