【问题标题】:passing shell argument to c program on mac osx将shell参数传递给mac osx上的c程序
【发布时间】:2023-03-05 12:32:01
【问题描述】:

出于教育目的,我正在尝试运行一个程序,该程序使用缓冲区溢出来覆盖函数指针地址。我已经确定了要使用 nm 覆盖的函数指针的位置。然后我想将新函数指针的地址传递给 argv。我正在尝试使用

perl -e '打印 "aa\xc0\x0c\x00\x00\x01\x00\x00\x00\"'| ./a.out

其中 \xc0\x0c\x00\x00\x01\x00\x00\x00\ 是新函数指针地址的小端序,而 aa 只是填充字符缓冲区。问题是这似乎没有将输出通过管道传输到 a.out,因为 argc 始终为 1。我也尝试过

perl -e '打印 "aa\xc0\x0c\x00\x00\x01\x00\x00\x00\n"' > a.bin cat a.bin - | ./a.out

而 argc 仍为 1。

我附上了我的程序的副本,以便于跟踪。 还有一种更简单的方法可以将格式化的字节直接传递给 c 程序,而不是使用 perl,而无需更改程序的当前结构?

那么我可以执行 ./a.out 并让它运行吗?

谢谢

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

typedef struct user_s{
    char name[2];
    void (*print_name)();
}user;

user a;

void print_name1(){
    printf("hello\n");
}

void print_name2(){
    printf("hi\n");
}

void usage(char * msg){
    printf("usage: %s <name>\n", msg);
}

void fill_name (char * name_to_fill, char *filler){
    int i, len;
    len = strlen(filler);
    printf("length of filler is %d\n", len);
    for (i = 0 ; i < len; i ++){
        *(name_to_fill + i) = *(filler+i);
    }
}

int main(int argc, char * argv[]){
    printf("argc = %d",argc);
    if (argc != 2){
        usage(argv[0]);
        return 0;
    }
    a.print_name = print_name1;
    a.print_name();
    fill_name(a.name, argv[1]);
    a.print_name();
    return 1;
}

【问题讨论】:

  • 做CTF? :D 我喜欢那些。我会用 python 来做,因为它具有交互性并且更容易玩。
  • os.execvp("./a.out", ["./a.out", "aa\x00\x00" + address_bytes]) 请注意,“aa”后面有 2 个额外字符。结构的成员可能是 4 字节对齐的。如果这不起作用,请尝试 8 字节对齐,如果没有失败,请切换字节顺序并再次尝试。

标签: c macos shell


【解决方案1】:

您将命令行参数与标准输入混淆了。你的命令:

perl -e 'print "aa\xc0\x0c\x00\x00\x01\x00\x00\x00\"'| ./a.out

将写入程序的标准输入。如果您想做与命令行参数相同的操作,请尝试:

perl -e 'print "aa\xc0\x0c\x00\x00\x01\x00\x00\x00\"'| xargs ./a.out

见:http://ss64.com/bash/xargs.html

【讨论】:

    【解决方案2】:

    就像约翰说的那样,您将参数与标准输入混淆了。要将程序的输出作为参数传递,您可以通过将其包装在$(command) 中来使用命令替换,因此对于您的示例,您应该这样做

    ./a.out $(perl -e 'print "aa\xc0\x0c\x00\x00\x01\x00\x00\x00\"')
    

    【讨论】:

      【解决方案3】:

      使用 bash 你可以这样做:

      ./a.out $'aa\xc0\x0c\x00\x00\x01\x00\x00\x00'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多