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是您输入代码并发送给某人的任何信息都应该被视为“公共”信息。客户端始终是不受信任的用户。与上面的示例相比,您可以使用模糊处理和打包之类的方法来实现这一点,但这都属于同一个概念。数据将在那里,数据可以提取。再次感谢:)这真的帮了大忙