c - 返回 libc 在 gdb 中有效,但单独运行时无效

标签 c linux gcc gdb libc

我正在尝试使用以下简单代码返回 libc 技巧:

#define SYSTEM_CALL_ADDR 0xb7ec5e50  /*my system call addr*/
#define EXIT_CALL_ADDR  0xb7ebbb80   /*my exit call addr*/
char shell[] = "/bin/sh";

int main(){
 int* p; 
 p = (int*)&p + 2;
 *p = SYSTEM_CALL_ADDR;

 p = (int*)&p + 3;
 *p = EXIT_CALL_ADDR;

 p = (int*)&p + 4;
 *p = shell;

 return 1;
}

有趣的是,当我运行这个程序时,它以“段错误”结束,但如果我使用 gdb 调试它并逐步运行它,它完全没问题,生成一个 shell 然后退出程序。有人遇到这种情况吗?或者有人可以指导我如何纠正这个问题吗?先谢谢了。我在 ArchLinux 内核:2.6.33,gcc 4.5.0。

最佳答案

gdb 禁用了一些缓冲区溢出攻击缓解技术,例如 ProPolice 和地址空间布局随机化 (ASLR)。

关于c - 返回 libc 在 gdb 中有效,但单独运行时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4177996/

相关文章:

c - INT_MAX 和 INT_MAX 之和

c - 针对特定结构的 Eclipse CDT c 项目设置

linux - 使用 Sed 多重搜索模式打印特定行

Python 在 Linux 上通过 pip 找不到已安装的包

c - 使用循环语句进行 C 练习 : Write code to reverse numbers with do-while statement

c - 如何使用C语言和esent.lib读取ESE表中的列名?

c++ - const_reference_type 不编译但 const value_type& 编译

gcc - 什么时候可以安全地使用 "=r"寄存器操作数约束?

linux - 如何确定可用(未使用)共享内存的数量?

c - 重命名函数而不更改其引用