数据逆向(三)

  字符串
  在C语言中,字符串是由字符组成,单字符不是字符串,至少有两个字符组成,且结尾字符是'\0'。
  例如:"ABCD" 内存中实际储存结构是 41H 42H 43H 44H 00H
  字符串的寻址,依靠首字节进行寄存器相对寻址方式:
  例如:访问"ABCD"中的第二字节,byte ptr [ebx+1]
  正是因为字符串的首字节索引的寻址方式,因此字符串往往要与指针配合。在C语言中常见的,
  例如:char *str="ABCD";//mov [xxxx],offset string "ABCD"
  另一种常见的方式,是将字符串放在数组里,需要首字节地址时,在数组名前加"&"伪装成指针。当然,存在数组里的字符串,自然可以按照数组的访问方式,比如 直接寻址。
  数组
  数组其实和普通变量没什么区别,每一个成员都是分别通过直接寻址方式访问。
  但只有一种情况例外,并且十分常见,即当索引号为变量时,使用相对寻址方式。
  例如:char a[4]={'A','A','A','\0'};
  for(int i=0;i<3;i++)
  a[i]+=1;
  对应反汇编:
  char a[4]={'A','A','A','\0'};
  0041139E mov byte ptr [a],41h
  004113A2 mov byte ptr [ebp-7],41h
  004113A6 mov byte ptr [ebp-6],41h
  004113AA mov byte ptr [ebp-5],0
  for(int i=0;i<3;i++)
  004113AE mov dword ptr [i],0
  004113B5 jmp wmain+40h (4113C0h)
  004113B7 mov eax,dword ptr [i]
  004113BA add eax,1
  004113BD mov dword ptr [i],eax
  004113C0 cmp dword ptr [i],3
  004113C4 jge wmain+5Ah (4113DAh)
  a[i]+=1;
  004113C6 mov eax,dword ptr [i]
  004113C9 movsx ecx,byte ptr a[eax]
  004113CE add ecx,1
  004113D1 mov edx,dword ptr [i]
  004113D4 mov byte ptr [a+edx],cl;反汇编器上常写为mov byte ptr a[edx],cl
  004113D8 jmp wmain+37h (4113B7h)
  数组的尴尬
  除了源码调试,由于数组不标记边界,提通过数据初始化不能判断数组的始末位置
  比如:int i=0;
  int a[3]={1,2,3};
  OD反汇编结果:
  00412FFE MOV DWORD PTR SS:[EBP-8], 0
  00413005 MOV DWORD PTR SS:[EBP-1C], 1
  0041300C MOV DWORD PTR SS:[EBP-18], 2
  00413013 MOV DWORD PTR SS:[EBP-14], 3
  显然,只看初始化我们很容易错误还原为 int a[4]={0,1,2,3};
  因此数组的边界判断,需要后续代码流程的辅助,因为数组通常都是同一类操作的集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值