出于教育目的,我正在尝试运行一个使用缓冲区溢出来覆盖函数指针地址的程序。我已经确定了要使用 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。
我附上了我的程序的副本,以便于跟踪。还有一种更简单的方法可以将格式化的字节直接传递给 ac 程序而不是使用 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;
}