11

私はファイルからコードをロードして実行するプログラムを書いています。しかし、問題が発生しました。「書き込み」システムコールが機能しません。コードは正常に読み込まれて実行されますが、画面にテキストが表示されません。

コードをロードするプログラム:

#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
4

4 に答える 4

9

あなたのアプローチは機能しません:シェルコードは位置に依存しない必要がありますが、あなたのコードは絶対アドレスを参照していますstr。無条件ジャンプは、相対ジャンプでも絶対ジャンプでもかまいません。相対バージョンを取得していることを確認してください(x86のオペコードEBおよびE9)。

詳細については、ポータブルシェルコードの記述手法を参照してください。

于 2011-02-23T18:48:54.500 に答える
3

CPUの詳細は指定しませんが、NXビットに違反している可能性があります。私はあなたのコードが完全に実行されるのではなく、SEGFAULTになることを期待します。

これはまさに、Intel Xeon E5410で実行されている私のボックス(Linux 2.6.32-28-generic#55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU / Linux)で発生することです。

于 2011-02-23T18:14:24.967 に答える
2

1つは、ファイルをバイナリとして開く必要があるということです。

FILE* fp = fopen(argv[1],"rb"); 
于 2011-02-23T18:15:40.420 に答える
1

コードを動的にロードするために.soファイルを使用しないのはなぜですか?セキュリティシナリオをテストしていますか、それとも実際にコードを動的にロードして実行しようとしていますか?

コードを.soとしてコンパイルし、プログラム内で動的にロードし、エクスポートされた関数を実行する方法については、こちらをお読みください。

http://www.yolinux.com/tokyoS/LibraryArchives-StaticAndDynamic.html

于 2011-02-23T18:19:23.970 に答える