0

まず、msgpack-c を使用して適切にデータを解凍して抽出するにはどうすればよいですか? を使用しました。MessagePack 自身の C API ドキュメントはあまりよくないので、データを適切にアンパックする方法を見つけます。ただし、http: //wiki.msgpack.org/display/MSGPACK/QuickStart+for+C+Language も問題ありません。

metasploit へのほとんどの API 呼び出しでコードが正常に機能していることに注意してくださいmodule.exploits。失敗するのは大きなもの (約 16KB が返される) だけです。

私の最後の質問のように、私は仕事をしているので、実際のコードを投稿することはできません. 次のスニペットで、私のコードが何をしているかを正確に示そうとします。

// Function declaration from msgpack headers
bool msgpack_unpack_next(msgpack_unpacked* result, const char* data, size_t len, size_t* off);

// Called by curl after request
size_t unpack_result(char *ptr, size_t size, size_t nmemb, void *userdata){
    size_t real_size = size * nmemb;

    msgpack_unpacked msg;
    msgpack_unpacked_init(&msg);
    // Fails [returns false] when used on "module.exploits" return, not when
    // "module.payloads" is called nor "auth.login".
    msgpack_unpack_next(&msg, ptr, real_size, 0); 


}

msgpack_sbuffer* pack_payload(char **data, size_t size){
    // Code that actually packs payload, pretty standard with nothing special
    // Definitely works, have not had any problems with my payloads
}


int main(void)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

    char *auth_payload_array[3] = {"auth.login", "<username>", "<password>"};

    msgpack_sbuffer *auth_payload = pack_payload(auth_payload_array, 3);
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "https://<IP Address>/api/");
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, auth_payload->data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, auth_payload->size);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);

        // Add custom content type header
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: binary/message-pack");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, unpack_result);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK){
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(res));
            return 1;
        }

        char *exploit_payload_array[2] = {"module.exploits", AUTH_TOKEN};
        msgpack_sbuffer *exploit_payload = pack_payload(exploit_payload_array,2);

        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, exploit_payload->data);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, exploit_payload->size);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK){
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                        curl_easy_strerror(res));
            return 1;
        }
    }
}

上記にはメモリリークがあることは承知しています。これは単なる例であるため、適切な破棄/解放をすべて入力する気がしませんでした。AUTH_TOKENコードのその時点で問題がないため、エラーではないはずなので、実際にどのように取得されるかの部分を省略しました。また、curl リクエスト コードの一部を関数に最適化できることも認識しています。

ruby gem はこの同じ API 呼び出しで問題なく動作しますが、標準の msgpack ライブラリを使用せず、バイナリ解析自体を行う C 拡張であることに注意してください。

stringbuffer の代わりにリターンから生データをファイルに書き込むと、手動で調べると、正しい msgpack 形式のように見えます。

ここで何がうまくいかないのですか?gdb を使用して問題を追跡し、Ruby C 拡張機能を使用できるライブラリに変えることを検討します。うまくいけば、それは単純なものであり、あなたの1人がそれを理解するでしょう!

4

1 に答える 1

1

書き込みコールバックが正しいリターン コードを返しません。

于 2013-08-22T15:08:53.463 に答える