Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从编译的C++;代码_C++_Security - Fatal编程技术网

C++ 从编译的C++;代码

C++ 从编译的C++;代码,c++,security,C++,Security,攻击者是否可能从编译的代码中获取整数数组 比如攻击者如何使用strings命令从代码中获取字符串 有可能,我建议您在使用notepad++或notepad编译后打开一个可执行文件,您可能会看到以下内容: 但为什么这对于字符串而不是向量来说如此简单呢?因为字符串通常是由alphanumeric字母等组成的,只要在我们找到的二进制文件中看到它们,int数组就会作为原始数据出现在代码中,但是眼睛看到它们很难,因为它们不是(强制)打印字符,但是,如果使用反汇编程序,查找字符串就像查找其他数组一样容易。

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


比如攻击者如何使用
strings
命令从代码中获取字符串

有可能,我建议您在使用notepad++或notepad编译后打开一个可执行文件,您可能会看到以下内容:


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

是的。使用
main.c
的快速示例:

int main(void) {
        int vars[8] = {0,1,2,3,4,5,6,7};
}
然后
gcc-o0main.c-omain
禁用优化,这样就不会删除未使用的数组。然后,如果您只是将其分解:

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)
0000000000 400474:
400474:55%按需付费
400475:48 89 e5 mov%rsp,%rbp
400478:c7 45 E000动产$0x0,-0x20(%rbp)
40047f:c7 45 e4 01 00动产$0x1,-0x1c(%rbp)
400486:c7 45 e8 02 00移动$0x2,-0x18(%rbp)
40048d:c7 45 ec 03 00 movl$0x3,-0x14(%rbp)
400494:c7 45 f0 04 00 movl$0x4,-0x10(%rbp)
40049b:c7 45 f4 05 00 00动产$0x5,-0xc(%rbp)
4004a2:c7 45 f8 06 00 00动产$0x6,-0x8(%rbp)
4004a9:c7 45 fc 07 00 00 movl$0x7,-0x4(%rbp)

这是合乎逻辑的,如果您的代码中有数据,并且您的程序使用它,那么数据必须存在于某个地方。

谢谢。所以,如果你一个接一个地声明变量,它们也会被放在连续内存中吗?基本上,是的。编译器优化可能会改变它的外观,因此它不像int[4]之后声明的int[4]那么简单,这将导致上述相同的结果,但它的jist是您输入代码并发送给某人的任何信息都应该被视为“公共”信息。客户端始终是不受信任的用户。与上面的示例相比,您可以使用模糊处理和打包之类的方法来实现这一点,但这都属于同一个概念。数据将在那里,数据可以提取。再次感谢:)这真的帮了大忙