簡體   English   中英

格式化字符串漏洞利用,意外結果

[英]Format String Exploit, unexpected result

我正在嘗試在 64 位 Linux 上用 C 語言實現格式字符串漏洞的簡單示例。 這是我的源代碼:

void not_called() {
    printf("Exploited\n");
}

int main(int argc, char **argv) {

    // Buffer overflow vulnerability
    char buffer[256];
    gets(buffer);

    // User may input the format string
    printf(buffer);
}

我輸入以下字符串來編程

AAAABBBB-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x

結果是

AAAABBBB-8608002c-f458fe00-fbad2288-78252d78-252d7825-5e5c51a8-0-41414141-2d78252d-78252d78-252d7825-2d78252d

我可以發現 AAAA 為41414141但不能像我期望的那樣發現 BBBB,因為它是緩沖區中相同輸入字符串的組成部分。

這是某種保護機制還是我誤解了什么? 我的目標是覆蓋返回地址,當我在 64 位機器上工作時,我需要讀取 8 個字節(AAAABBBB)。

漏洞利用字符串的偽代碼看起來像這樣

RETRNPTR%[decimal address of not_called - 8]u%[offset of RETRNPTR]$n

RETRNPTR 是當前堆棧幀中存儲返回地址的內存地址。

所以我最擔心的是,8 字節的 RETRNPTR 似乎並沒有像我期望的那樣連續存在於內存中。 第二個問題是,%n 是整型指針,意味着只寫入 4 個字節。 我也很困惑,AAAA 之前的那些值來自哪里。

首先,您問的是具有未定義行為的代碼; 代碼的行為確實應該在大多數情況下被臨時 C 程序員認為是未定義的。

現在,至於為什么你看不到BBBB 我想這是因為你在 x86-64 系統上運行這個程序。 調用約定是對堆棧上的值進行 64 位推送; 但是%x打印 32 位int 64 位堆棧值的 32 個最低有效位。 要打印 64 位long值,請使用%lx

(此外,在 x86-64 的 System-V API 上,第 6 個整數/指針參數根本不在堆棧中;它們在RDIRSIRDXRCXR8R9寄存器中)。

例如我輸入:

AAAABBBB %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx

並得到輸出

AAAABBBB 7f7c0a88f030 7f7c0a66b980 7f7c0a669980 7f7c0a88f031 786c2520786c2520 7ffc1456b6f8
100000000 4242424241414141 786c2520786c2520 786c2520786c2520

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM