C/C++逆向:字符数组与字符串对比

admin 2024年10月25日14:31:23评论12 views字数 1536阅读5分7秒阅读模式

在逆向工程中,字符数组和字符串的处理是一个重要的方面。字符数组通常是由相同类型的数据元素组成的集合,存储在连续的内存空间中,而字符串则是字符数组的一种特殊形式,用于表示文本信息。字符数组和字符串的区别主要体现在它们的定义、使用方式以及内存管理上。从逆向工程的角度来看,字符数组和字符串的差异可以通过分析汇编代码、内存布局、以及程序运行时的行为来进一步理解。这种差异会在二进制级别影响程序的结构、数据操作方式和函数调用。下面我们先给出一个C代码例子:

#include<stdio.h>
#include<stdlib.h>

int main() {
char arr[6] = { 'W', 'o', 'l', 'v', 'e', 'n' };
char str[] = "wolven";

system("pause");
return 0;
}

接着我们对这个代码进行编译生成exe文件,接着使用IDA工具进行逆向分析。

字符数组

字符数组是一组连续的字符元素,存储在内存中的相邻位置。例如:

char arr[6] = {'W', 'o', 'l', 'v', 'e', 'n'};

arr 是一个字符数组,它包含 6 个字符,它不会自动添加空字符作为结束标志。字符数组在内存中按顺序存储字符元素。由于它不一定需要以空字符 结尾,因此逆向工程时不能直接依赖 来确定数组的结束位置。我们需要依靠上下文或程序中使用的索引来判断数组的长度。汇编代码中,字符数组的初始化通常是通过一个 mov 指令序列来逐个将字符放入内存地址。对上述程序进行逆向分析可以得到如下代码:

C/C++逆向:字符数组与字符串对比

mov     [ebp+var_C], 57h ; 'W'
mov     [ebp+var_B], 6Fh ; 'o'
mov     [ebp+var_A], 6Ch ; 'l'
mov     [ebp+var_9], 76h ; 'v'
mov     [ebp+var_8], 65h ; 'e'
mov     [ebp+var_7], 6Eh ; 'n'

可以看到字符数组的初始化这里直接向内存地址写入字符,没有自动附加的终止符。

字符串

在 C 语言中,字符串是以空字符 结尾的字符数组。字符串可以通过字符串常量来定义:

char str[] = "wolven";

在这个例子中,str 是一个字符串,它等价于一个包含 {'w', 'o', 'l', 'v', 'e', 'n',''} 的字符数组。字符串的结尾会自动由 标记,这也是区别字符串和普通字符数组的关键。逆向时,当你遇到一个以 结尾的字符序列时,可以确定这是一个字符串常量,这个是字符串的显著特征,在逆向过程中很容易识别。字符串的初始化常常通过块拷贝的方式进行,即一次性将整个字符串(包括 )写入内存。如上述的C代码对应的汇编代码可能会通过类似 mov 指令加载整个字符串:

C/C++逆向:字符数组与字符串对比

mov     eax, dword ptr ds:aWolven ; "wolven"
mov     [ebp+var_1C], eax
mov     cx, word ptr ds:aWolven+4 ; "en"
mov     [ebp+var_18], cx
mov     dl, byte ptr ds:aWolven+6 ; ""
mov     [ebp+var_16], dl

这段汇编代码显示了字符串的初始化过程:从内存中的字符串 "wolven" 中提取内容,并将其存储在栈上的过程。mov eax, dword ptr ds:aWolven ; "wolven":从 ds 段(数据段)加载一个指针或常量值,该值是以 "wolven" 为起始的4字节(32位)数据,存入寄存器 eax;也就是将 "wolv" (4字节) 放入 eax 寄存器中。然后将eax中的内容再存入栈中。这就是一个拷贝的过程,接着就是将剩下的"en"(空)分别存入栈空间。这就是字符串初始化的分步拷贝的过程。


原文始发于微信公众号(风铃Sec):C/C++逆向:字符数组与字符串对比

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月25日14:31:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   C/C++逆向:字符数组与字符串对比https://cn-sec.com/archives/3313502.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息