2

こんにちは、「Hacking: the Art of Exploitation」という本からいくつかの基本的なメモリ エクスプロイトを学ぼうとしていますが、x86-64 システムが原因で問題が発生しています。

本のこの部分では、フォーマット文字列のエクスプロイトを学習し、環境変数を挿入して脆弱性を読み取らせました。(p172)

これは、フォーマット文字列の脆弱性を悪用しようとしているプログラムのコードです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

    int main(int argc, char *argv[]) 
    {
    char text[1024];
    static int test_val = -72;

    if(argc < 2) {
    printf("Usage: %s <text to print>\n", argv[0]);
    exit(0);
    }
    strcpy(text, argv[1]);

    printf("The right way to print user-controlled input:\n");
    printf("%s", text);


    printf("\nThe wrong way to print user-controlled input:\n");
    printf(text);

    printf("\n");

    // Debug output
    printf("[*] test_val @ %p = %d %p\n", &test_val, test_val, test_val);

    exit(0);
    }

ここから、悪用するために、コンパイル後に本が言うように(x86-32用に書かれました)試しました:

  ./fmt_vuln $(printf "\x\x\x\x\x\x\x\x")%016x%016x%016x%016x%016x%016x%016x%s

(\x\x\x\x\x\x\x はリトル エンディアン形式の任意の環境メモリ アドレスに置き換えられます)、「\nユーザー制御の入力を印刷する間違った方法: \n" の部分。

プログラムの正しい応答は、挿入されたアドレス内の文字列であると想定されています。

ASLR、NX、フォーマットガードもオフにしました。

これを機能させる方法がわかりません。32 と 64 の違いのためにアドレスを正しく挿入していないか、%s がアドレスを正しく読み取っていないかのどちらかだと思います。または、セキュリティを十分にオフにしていないと推測しています。

x86-64 システムでメモリ アドレスを正確に挿入する方法を教えてください。

4

0 に答える 0