Cでのバイナリ比較のエラー

イゴールアウグストゥス

私は、ソケットを接続し、ソケットでバイナリを受信し、このバイナリを読み取り、他のバイナリと比較して、ソケットで受信したバイナリがあるかどうかを確認するPerlプログラムを使用しています。見てください:

perlProgram.pl

# some code here ...

my $sock = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 666, Proto => 'tcp');   

$sock->sockopt(SO_LINGER, pack("ii", 1, 0));


# some code here for another porposes...
# ...


read($sock, $buff, 0xfffff);

close($sock);

if (($v = index $buff, "\xC7\x44\x24\x08\x03\x00\x00\x00\xC7\x04\x24\x00\x00\x00\x00\x89\x44\x24\x04") >= 0) {
    $offset = $v;

    printf "your offset is %08x\n", $offset;
} else {
    if (($v = index $buff, "\x89\x44\x24\x10\xA1\xBC\xA5\x0F\x08\x89\x44\x24\x04\xe8") >= 0) {
        $offset = $v;

    printf "your offset is %08x\n", $offset;
    } else {
        print "Could not find your binaries\n";
        exit;
    }
}


# more code here ...

このPerlプログラムは正しく実行され、私のバイナリはソケットに接続されていると確信しています。だから、私はCで同じコードを書きましたが、問題があります。CIでは、ソケットにバイナリがあるかどうかを確認できませんが、バイナリがソケットにあることは確かです。見てください:

sameProgramInC.c:

// some code here ...

char binaries_1[]="\xc7\x44\x24\x08\x03\x00\x00\x00\xc7\x04\x24\x00\x00\x00\x00\x89\x44\x24\x04";
char binaries_2[]="\x89\x44\x24\x10\xa1\xbc\xa5\x0f\x08\x89\x44\x24\x04\xe8";

int indexOf(const unsigned char *data_buffer, const unsigned int length, const unsigned char *needle, const unsigned int needlelen) {
   unsigned int i, j, index=0;
   for(i=0; i < length-needlelen; i++) {
      if(data_buffer[i] == needle[0]){
         index=i;
         for(j=1; j < needlelen; j++){
            if(data_buffer[i+j] != needle[j]){
               index=0;
               break;
            }
         }
         if(index == i){
            return index;
         }
      }
   }
   return index;
}

int main(int argc, char *argv[]) {
   int sockfd, buflen;
   struct hostent *host_info;
   struct sockaddr_in target_addr;
   unsigned char read_buffer[0xfffff];

   if((host_info = gethostbyname(argv[1])) == NULL)
      fatal("looking up hostname");

   if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
      fatal("in socket");

   target_addr.sin_family = AF_INET;
   target_addr.sin_port = htons(PORT);   
   target_addr.sin_addr = *((struct in_addr *)host_info->h_addr);
   memset(&(target_addr.sin_zero), '\0', 8); // zero the rest of the struct

   if (connect(sockfd, (struct sockaddr *)&target_addr, sizeof(struct sockaddr)) == -1)
      fatal("connecting to target server");

   // some code here for another porposes...
   // ...

   printf("\n\t Attempting to read memory of the server...");
   bzero(read_buffer, sizeof(read_buffer));
   read(sockfd, read_buffer, 0xfffff);

   index = indexOf(read_buffer, sizeof(read_buffer), binaries_1, sizeof(binaries_1));    
   if(index != 0){
      printf("\n\t [+] your offset is 0x%08x", index);
   } else {
      index = indexOf(read_buffer, sizeof(read_buffer), binaries_2, sizeof(binaries_2));      
      if(index != 0){
         printf("\n\t [+] your offset is 0x%08x", index);
      } else {
         printf("\n\t [-] Fail! Could not find your offset!");
      }
   }

   // more code here

したがって、このCコードは私のPerlコードのようには機能しません。実行時にエラーは発生しません。Cコードだけでは、Perlコードのようなバイナリが存在するかどうかを確認できません。その後、私が使用しようmemmem、とmemcmpstrstr、だけでなく、作品はありません。なぜそれが機能しないのですか?なにが問題ですか?

アントン・サヴィン

sizeof(binaries_1)検索部分文字列の長さとして指定する場合、末尾のゼロが含まれているので、に変更しsizeof(binaries_1) - 1ます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

バイナリ イメージでの ImageMagick と OpenCV の比較

分類Dev

エレガントな方法でのバイナリ比較操作

分類Dev

バイナリエンコーディングバリアントと固定スライス長の比較

分類Dev

Javaでのバイナリ検索小さなエラー

分類Dev

Cの無効なバイナリのエラーメッセージ

分類Dev

C ++でのZigZagバイナリツリートラバーサル

分類Dev

PopupMenu.show()AndroidでのバイナリXMLインフレートエラー

分類Dev

C ++-プログラムがバイナリツリーで値を見つけるのにかかった比較の数を数える方法

分類Dev

バイナリ検索とターナリ検索の比較

分類Dev

バイナリ '==':ベクトルC ++の演算子がエラーを検出しませんでした

分類Dev

バイナリ定数の前のkeiluvision5構文エラー

分類Dev

エラーの取得:bash:./ program:バイナリファイルを実行できません:Exec形式エラー

分類Dev

バイナリへのコンパイル中のperl5.28でのperlccコンパイルエラー

分類Dev

Scalaでの2つのByte []の同等性の比較(バイナリイメージデータのチェック)

分類Dev

匿名リスナークラスでのバターナイフバインド

分類Dev

フロートのバイナリ等価比較は正しいですか?

分類Dev

比較のバイナリサーチの実行時間

分類Dev

論理バイナリ中置演算子のエラー

分類Dev

バイナリ検索Javaのエラー

分類Dev

NVIDIAレガシーバイナリプロプライエタリドライバとバイナリのみのプロプライエタリドライバの違いは何ですか?

分類Dev

バイナリ文字列から整数へのコンバータのエラー

分類Dev

C ++ 14のバイナリリテラルのエンディアンは何ですか?

分類Dev

バイナリ検索の比較

分類Dev

matlabで2つのバイナリイメージのエラーマップを表示する方法

分類Dev

再帰でバイナリ ツリーを作成するときのコール スタック エラー

分類Dev

C ++での混合バイナリデータの解析

分類Dev

バイナリクロスエントロピーのバイナリグラウンドトゥルースラベルではありませんか?

分類Dev

C のバイナリ ツリー トラバーサルで出力がありません

分類Dev

バイナリ式エラーメッセージのオペランドが無効です

Related 関連記事

  1. 1

    バイナリ イメージでの ImageMagick と OpenCV の比較

  2. 2

    エレガントな方法でのバイナリ比較操作

  3. 3

    バイナリエンコーディングバリアントと固定スライス長の比較

  4. 4

    Javaでのバイナリ検索小さなエラー

  5. 5

    Cの無効なバイナリのエラーメッセージ

  6. 6

    C ++でのZigZagバイナリツリートラバーサル

  7. 7

    PopupMenu.show()AndroidでのバイナリXMLインフレートエラー

  8. 8

    C ++-プログラムがバイナリツリーで値を見つけるのにかかった比較の数を数える方法

  9. 9

    バイナリ検索とターナリ検索の比較

  10. 10

    バイナリ '==':ベクトルC ++の演算子がエラーを検出しませんでした

  11. 11

    バイナリ定数の前のkeiluvision5構文エラー

  12. 12

    エラーの取得:bash:./ program:バイナリファイルを実行できません:Exec形式エラー

  13. 13

    バイナリへのコンパイル中のperl5.28でのperlccコンパイルエラー

  14. 14

    Scalaでの2つのByte []の同等性の比較(バイナリイメージデータのチェック)

  15. 15

    匿名リスナークラスでのバターナイフバインド

  16. 16

    フロートのバイナリ等価比較は正しいですか?

  17. 17

    比較のバイナリサーチの実行時間

  18. 18

    論理バイナリ中置演算子のエラー

  19. 19

    バイナリ検索Javaのエラー

  20. 20

    NVIDIAレガシーバイナリプロプライエタリドライバとバイナリのみのプロプライエタリドライバの違いは何ですか?

  21. 21

    バイナリ文字列から整数へのコンバータのエラー

  22. 22

    C ++ 14のバイナリリテラルのエンディアンは何ですか?

  23. 23

    バイナリ検索の比較

  24. 24

    matlabで2つのバイナリイメージのエラーマップを表示する方法

  25. 25

    再帰でバイナリ ツリーを作成するときのコール スタック エラー

  26. 26

    C ++での混合バイナリデータの解析

  27. 27

    バイナリクロスエントロピーのバイナリグラウンドトゥルースラベルではありませんか?

  28. 28

    C のバイナリ ツリー トラバーサルで出力がありません

  29. 29

    バイナリ式エラーメッセージのオペランドが無効です

ホットタグ

アーカイブ