0

sys_writeシステムコールを介して(stdout またはファイルに)バイナリ書き込みを試みましたが、テキスト ファイルしか持てません。テキストなし (バイナリ) バイトも取得するにはどうすればよいですか?

"mov   %eax,    %ebx;" 
"mov   $4, %eax;" 
"mov   -0x40(%rbp),       %ecx;" 
"mov   $14,      %edx;" 
"int   $0x80;"

この例を試してみると、テキストバイトでない場合、14 バイトを書き込むことはできません (テキストバイト以外のファイルの長さは 0 です!)。

4

3 に答える 3

0

あなたの問題が何であるかわかりません。で正しい長さを渡す限り%edxsys_writeバッファ内の任意の値を。内のファイル記述子に書き込みます%ebx。これには、0〜255の範囲(つまり、フルバイト範囲)の値が含まれます。

たぶん、ファイルを開くために使用するコードも投稿する必要があります。ただし、ファイルをテキストモードで開いた場合でも、ファイルへの書き込みは任意の値で機能するはずです。

どこを見ればよいか、さらにいくつかのアイデア:出力をフラッシュしますか?ファイルを閉じますか?そうしないと、文字列がフラッシュされるのを待っているバッファにハングアップする可能性があります。

于 2010-01-05T09:21:11.737 に答える
0

はい、あなたが正しい。バイナリデータの問題ではなく、pxor の結果です。これは私の理解のためのテストです。さて、sys_write syscall で、pxor xmm0 値 'mov -0x40(%rbp),%ecx' が格納されているメモリに %ecx を指定すると、長さ 0 のファイルが作成されます! 反対に、bigbuff '-0x30(%rbp)' を指定しても問題ありません。

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include <emmintrin.h>

main(int argc, char **argv)


{  

unsigned char __attribute__ ((aligned (16))) *bigbuff = (char *) malloc(16);

unsigned char __attribute__ ((aligned (16))) *buff = (char *) malloc(16);

unsigned char __attribute__ ((aligned (16))) *nome_file = (char *) malloc(16);

bigbuff="gatto sisvestr\n";

buff="micio sisvestro2";

nome_file="nuovo.txt"; //la lunghezza massima del nome è data da malloc!!!


    asm (
        "movdqa -0x30(%rbp), %xmm0;"
        "movdqa -0x20(%rbp), %xmm1;"
        "pxor %xmm1,%xmm0;"
        "movdqa %xmm0,-0x40(%rbp);"
        "movdqa -0x40(%rbp), %xmm2;"
        "movdqa -0x20(%rbp), %xmm1;"
        "pxor %xmm1,%xmm2;"
        "movdqa %xmm2,-0x30(%rbp);"

   "mov $8, %eax;"

   "mov -0x10(%rbp),%ebx;"

   "mov $448, %ecx;" 

   "int $0x80;"

   "mov   %eax,    %ebx;"

    "mov   $4, %eax;" 

    "mov   -0x40(%rbp),       %ecx;" 

    "mov   $14,      %edx;" 

    "int   $0x80;"
);

}
于 2010-01-05T11:37:27.280 に答える