从已编译的C ++代码中提取int数组

时间:2016-02-10 04:11:47

标签: c++ security

攻击者是否有可能从已编译的代码中获取整数数组?

就像攻击者如何使用strings命令从代码中获取字符串一样。

2 个答案:

答案 0 :(得分:1)

是。 main.c的简短示例:

int main(void) {
        int vars[8] = {0,1,2,3,4,5,6,7};
}

然后gcc -O0 main.c -o main禁用优化,因此我们未使用的数组不会被移除。然后,如果你只是拆解它:

0000000000400474 <main>:
  400474:       55                      push   %rbp
  400475:       48 89 e5                mov    %rsp,%rbp
  400478:       c7 45 e0 00 00 00 00    movl   $0x0,-0x20(%rbp)
  40047f:       c7 45 e4 01 00 00 00    movl   $0x1,-0x1c(%rbp)
  400486:       c7 45 e8 02 00 00 00    movl   $0x2,-0x18(%rbp)
  40048d:       c7 45 ec 03 00 00 00    movl   $0x3,-0x14(%rbp)
  400494:       c7 45 f0 04 00 00 00    movl   $0x4,-0x10(%rbp)
  40049b:       c7 45 f4 05 00 00 00    movl   $0x5,-0xc(%rbp)
  4004a2:       c7 45 f8 06 00 00 00    movl   $0x6,-0x8(%rbp)
  4004a9:       c7 45 fc 07 00 00 00    movl   $0x7,-0x4(%rbp)

从逻辑上讲,如果您的代码中有数据且程序使用了数据,则数据必须存在于某处。

答案 1 :(得分:0)

有可能,我建议你在使用notepad ++或notepad编译后打开一个可执行文件,也许你会看到:

.exe file open with notepad++, look to Hello world statement

但是为什么用字符串而不是向量来这么简单呢?因为字符串通常只是由字母数字字母等组成,只是在我们发现的二进制文件中看到它们,一个int数组将作为原始数据存在于代码中,但是眼睛看到它们很难,因为它们不是(强制性的)打印的字符,但是如果你使用反汇编程序,就像其他数组一样容易找到字符串。