数据逆向(二)——区分常量、变量、指针
2010-08-10 17:33
295 查看
做数据逆向分析最先应该区分数据是常量、变量,还是指针。可是作为二进制数据本身不会标记自己是什么,然而编译器将不同的的类别储存在不同的区域。
变量数据应分为这两类:
1. 局部非静态变量:对于1KB以下的该种变量,一般都要放在栈区,那么它的寻址必然用到ebp寄存器来间接变址进行寻址。另外,有些编译器(比如gcc)出于优化考虑,也会用到esp寄存器。
举例:
void fun()
{
int i=0;
char a[5]="AAAA";
}
//vc2005Debug版反汇编
void fun()
{
-------------------------------------------------保护寄存器数据
00411390 push ebp
00411391 mov ebp,esp
00411393 sub esp,0E0h
00411399 push ebx
0041139A push esi
0041139B push edi
---------------------为局部变量在栈区预留内存,以及vc编译器的添加防溢出措施
0041139C lea edi,[ebp-0E0h]
004113A2 mov ecx,38h
004113A7 mov eax,0CCCCCCCCh
004113AC rep stos dword ptr es:[edi]
004113AE mov eax,dword ptr [___security_cookie (417000h)] //研究溢出漏洞的人,
//可以看一下蓝色代码,
//通过在回调地址前,
//添加安全码
//使shellcode不可以覆盖
//这里,否则异常
004113B3 xor eax,ebp
004113B5 mov dword ptr [ebp-4],eax
//这是vs2005的新特性,
//你想能出破解方案吗?
-------------------------------------------------
int i=0
004113B8 mov dword ptr [ebp-0Ch],0
char a[5]="AAAA";
004113BF mov eax,dword ptr [string "AAAA" (41563Ch)]
004113C4 mov dword ptr [ebp-1Ch],eax
004113C7 mov cl,byte ptr ds:[415640h]
004113CD mov byte ptr [ebp-18h],cl
}
004113D0 push edx
004113D1 mov ecx,ebp
004113D3 push eax
004113D4 lea edx,[ (4113F4h)]
004113DA call @ILT+140(@_RTC_CheckStackVars@8) (411091h)
004113DF pop eax
004113E0 pop edx
004113E1 pop edi
004113E2 pop esi
004113E3 pop ebx
004113E4 mov ecx,dword ptr [ebp-4]
004113E7 xor ecx,ebp
004113E9 call @ILT+25(@__security_check_cookie@4) (41101Eh)
004113EE mov esp,ebp
004113F0 pop ebp
004113F1 ret
2. 全局变量、局部静态变量:它们统一储存在数据节,因为它们的实现方式是一样的,都是直接寻址方式来寻址,只是全局变量,在所有区域均可访问,而局部静态变量只能在函数内部访问。
char a[5]="AAAA";
void fun()
{
static int i;
i=0;
a[0]='b';
}
void fun()
{
00411390 push ebp
00411391 mov ebp,esp
00411393 sub esp,0C0h
00411399 push ebx
0041139A push esi
0041139B push edi
0041139C lea edi,[ebp-0C0h]
004113A2 mov ecx,30h
004113A7 mov eax,0CCCCCCCCh
004113AC rep stos dword ptr es:[edi] //由于没有使用堆栈,编译器没有添加防溢出措施
static int i;
i=0;
004113AE mov dword ptr [41719Ch],0
a[0]='b';
004113B8 mov byte ptr [417034h],62h
}
004113BF pop edi
004113C0 pop esi
004113C1 pop ebx
004113C2 mov esp,ebp
004113C4 pop ebp
004113C5 ret
常量
常量和全局变量、静态变量实现方法使一样的,使用直接寻址,但区别是:只能读、不可写。
比如:1. mov eax, [417034h]
2. cmp eax, [417034h]
指针
指针可以当做是存储地址的变量,它即可以是全局变量,也可以是局部非静态变量,但与普通变量的区别是:"初始化时使用offset或lea,使用指向内容时二次寻址"。
举例:初始化:
1.mov [417034h],offset “AAAA”//全局指针
2.lea eax,ARRAY
mov [esp-4ch],eax//局部指针
使用:
1.mov eax, [417034h]
mov edx, [eax]
2.mov eax, [esp-4ch]
mov edx, [eax+i]//指针可能指向的是数组
//vc2005Debug版反汇编
变量数据应分为这两类:
1. 局部非静态变量:对于1KB以下的该种变量,一般都要放在栈区,那么它的寻址必然用到ebp寄存器来间接变址进行寻址。另外,有些编译器(比如gcc)出于优化考虑,也会用到esp寄存器。
举例:
void fun()
{
int i=0;
char a[5]="AAAA";
}
//vc2005Debug版反汇编
void fun()
{
-------------------------------------------------保护寄存器数据
00411390 push ebp
00411391 mov ebp,esp
00411393 sub esp,0E0h
00411399 push ebx
0041139A push esi
0041139B push edi
---------------------为局部变量在栈区预留内存,以及vc编译器的添加防溢出措施
0041139C lea edi,[ebp-0E0h]
004113A2 mov ecx,38h
004113A7 mov eax,0CCCCCCCCh
004113AC rep stos dword ptr es:[edi]
004113AE mov eax,dword ptr [___security_cookie (417000h)] //研究溢出漏洞的人,
//可以看一下蓝色代码,
//通过在回调地址前,
//添加安全码
//使shellcode不可以覆盖
//这里,否则异常
004113B3 xor eax,ebp
004113B5 mov dword ptr [ebp-4],eax
//这是vs2005的新特性,
//你想能出破解方案吗?
-------------------------------------------------
int i=0
004113B8 mov dword ptr [ebp-0Ch],0
char a[5]="AAAA";
004113BF mov eax,dword ptr [string "AAAA" (41563Ch)]
004113C4 mov dword ptr [ebp-1Ch],eax
004113C7 mov cl,byte ptr ds:[415640h]
004113CD mov byte ptr [ebp-18h],cl
}
004113D0 push edx
004113D1 mov ecx,ebp
004113D3 push eax
004113D4 lea edx,[ (4113F4h)]
004113DA call @ILT+140(@_RTC_CheckStackVars@8) (411091h)
004113DF pop eax
004113E0 pop edx
004113E1 pop edi
004113E2 pop esi
004113E3 pop ebx
004113E4 mov ecx,dword ptr [ebp-4]
004113E7 xor ecx,ebp
004113E9 call @ILT+25(@__security_check_cookie@4) (41101Eh)
004113EE mov esp,ebp
004113F0 pop ebp
004113F1 ret
2. 全局变量、局部静态变量:它们统一储存在数据节,因为它们的实现方式是一样的,都是直接寻址方式来寻址,只是全局变量,在所有区域均可访问,而局部静态变量只能在函数内部访问。
char a[5]="AAAA";
void fun()
{
static int i;
i=0;
a[0]='b';
}
void fun()
{
00411390 push ebp
00411391 mov ebp,esp
00411393 sub esp,0C0h
00411399 push ebx
0041139A push esi
0041139B push edi
0041139C lea edi,[ebp-0C0h]
004113A2 mov ecx,30h
004113A7 mov eax,0CCCCCCCCh
004113AC rep stos dword ptr es:[edi] //由于没有使用堆栈,编译器没有添加防溢出措施
static int i;
i=0;
004113AE mov dword ptr [41719Ch],0
a[0]='b';
004113B8 mov byte ptr [417034h],62h
}
004113BF pop edi
004113C0 pop esi
004113C1 pop ebx
004113C2 mov esp,ebp
004113C4 pop ebp
004113C5 ret
常量
常量和全局变量、静态变量实现方法使一样的,使用直接寻址,但区别是:只能读、不可写。
比如:1. mov eax, [417034h]
2. cmp eax, [417034h]
指针
指针可以当做是存储地址的变量,它即可以是全局变量,也可以是局部非静态变量,但与普通变量的区别是:"初始化时使用offset或lea,使用指向内容时二次寻址"。
举例:初始化:
1.mov [417034h],offset “AAAA”//全局指针
2.lea eax,ARRAY
mov [esp-4ch],eax//局部指针
使用:
1.mov eax, [417034h]
mov edx, [eax]
2.mov eax, [esp-4ch]
mov edx, [eax+i]//指针可能指向的是数组
//vc2005Debug版反汇编
相关文章推荐
- 数据逆向分析(2)——区分变量,常量以及指针
- 参数中有const时进行数据类型的转换问题-固定变量转常量
- 数据本身vs参考变量(指针)
- [C++] C++指针的那些事 -- 常量,变量,指针及指针相关的三个数值
- Java基础复习之一篇:关健字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换
- Swift 2.0 学习第1天:常量和变量, 数据类型,字符和字符串
- 深入探讨常量、指向常量的指针,常量与变量的区别
- 数据类型-变量与常量
- golang语法学习(一):变量,常量以及数据类型
- Swift:(一)、常量、变量、数据类型
- C++系列之基本数据类型、常量、变量、const、引用、typedef、枚举、类类型、编写自己的头文件
- PL/SQL学习笔记-常量变量及数据类型初步
- python(一)变量,常量,编码,数据类型
- java数据类型基础,运算符,常量,变量
- MC新手入门(二十七)------数据类型、标识符、常量与变量
- cpp学习:文字常量;变量;指针基本概念
- 边记边学PHP-(四)PHP数据类型、常量、变量及表达式2
- 语言基础(项目结构,数据类型,引用类型,转义字符,变量常量,基本的类型转换)
- c中的数据类型、常量、变量
- IOS之C语言--2数据、常量和变量