当前位置: 首页 > 面试题库 >

从C程序加载原始代码

张智
2023-03-14
问题内容

我正在编写一个程序,该程序从文件中加载并执行代码。但是我有一个问题:“写”系统调用不起作用。代码成功加载并执行,但在屏幕上不显示任何文本。

加载代码的程序:

#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)。

有关更多信息,请参见编写可移植Shell代码的技术。



 类似资料:
  • 我正在尝试使用Glide库将gif加载到ImageView中。Gif图像位于Raw文件夹中。代码如下: 但它没有加载。我错过什么了吗?它没有给出失败的日志。

  • 是否有一些简单的方法或现成的组件可以通过Primefaces在中使用延迟加载,但不需要分页(也不是标准的)? 我需要以下特性:加载页面时,dataTable只包含100行中的前10行(快速响应时间)。其余的行会自动加载到,但用户已经可以处理第一部分数据了。 谢谢你的建议。在最坏的情况下,我将不得不自己实施类似的行为,但可能有人已经有了一些经验。

  • 我的代码有点奇怪: 当我在build.gradle中添加webrtc依赖项(编译'io.pristine: libJDle:11139@aar')时,会出现错误。 建筑格拉德尔: .... 编译io。原始:歌词:11139@aar' 编译项目(“:openCVLibrary2411”) .... 错误信息: 无法从加载程序dalvik.system加载opencv\u imgproc。PathCl

  • 问题内容: 我有一个同时具有两个外部内核模块和一个用户空间守护程序的应用程序。我想在启动时从用C编写的守护程序代码中加载模块,然后在干净退出时将其卸载。我可以用比使用相应的方式更干净的方式加载它们吗? 问题答案: 最小的可运行示例 使用此简单的参数打印机模块,在QEMU + Buildroot VM和Ubuntu 16.04主机上进行了测试。 我们使用/ 和 Linux系统调用。 Linux内核为

  • 我在Eclipse中使用NDK。 java.lang.UnsatisfiedLinkError:无法从加载程序Dalvik.System.PathClassLoader加载HelloWorld[DexPathList[[zip文件“/data/app/com.example.HelloWorld-2.apk”],NativeLibraryDirectories=[/data/app-lib/com

  • 本文向大家介绍C语言从代码中加载动态链接库过程解析,包括了C语言从代码中加载动态链接库过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了C语言从代码中加载动态链接库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数:void *dlopen(const char *filename, int flag); 功能:打开动