我正在编写一个程序,该程序从文件中加载并执行代码。但是我有一个问题:“写”系统调用不起作用。代码成功加载并执行,但在屏幕上不显示任何文本。
加载代码的程序:
#include < stdio.h > #include < stdlib.h > int main(int argc,char* argv[]) { unsigned int f_size = 0; unsigned char* code_buf = NULL; void (*func_call)(void) = NULL; if(argc < 2) { printf("Usage: %s <FILE>\n",argv[0]); return 1; } FILE* fp = fopen(argv[1],"rb"); if(!fp) { printf("Error while opening this file: %s\n",argv[1]); return 1; } unsigned int fsize = 0; fseek(fp,0,SEEK_END); fsize = ftell(fp); fseek(fp,0,SEEK_SET); if(fsize < 4) { printf("Code size must be > 4 bytes\n"); return 1; } code_buf = (unsigned char*) malloc(sizeof(unsigned char)*fsize); if(fread(code_buf,fsize,1,fp)<1) { printf("Error while reading file: %s\n",argv[1]); free(code_buf); return 1; } func_call = (void (*)(void)) code_buf; printf("[EXEC] Binary is loaded\n" "\tFirst 2 bytes: 0x%x 0x%x\n" "\tLast 2 bytes: 0x%x 0x%x\n", code_buf[0],code_buf[1], code_buf[fsize-2],code_buf[fsize-1]); printf("[EXEC] Starting code...\n"); (*func_call)(); printf("[EXEC] Code executed!\n"); free(code_buf); return 0; }
我试图通过此程序(test.s)执行的代码:
.text movl $4, %eax movl $1, %ebx movl $str, %ecx movl $5, %edx int $0x80 jmp end str: .string "test\n" end: ret
这是我的编译方式:
gcc -c test.s objcopy -O binary test.o test.bin
解决了 ,感谢@Christoph
有工作代码:
.text call start str: .string "test\n" start: movl $4, %eax movl $1, %ebx pop %ecx movl $5, %edx int $0x80 ret
您的方法行不通:shellcode必须与位置无关,但是您的代码引用的是绝对地址str。无条件跳转也可以是相对跳转,也可以是绝对跳转:确保获得相对版本号(x86上的操作码EB和E9)。
str
有关更多信息,请参见编写可移植Shell代码的技术。