2014-02-24 18 views
1

我試圖利用在printf的關於利用printf格式漏洞

#include <stdio.h> 
int main() 
{ 
    int a = 1, b = 2, c = 3, d = 4; 
    printf("%d %d %d %d"); 
} 
  1. A,B,C,d的脆弱性被壓入堆棧。
  2. printf參數被壓入堆棧,然後返回地址
  3. 現在,printf會從"%d%d%d%d"增加SP以達到參數。
  4. 但是,由於沒有參數應達到當地主要的變量,那麼B ...

但是,上面的輸出是隨機的較大值

-1000081144 - 10000081128 4197428 4197568 -842270912

Q1:輸出中的這些值是什麼。我的理解有什麼問題?

Q2:如何更正上面的代碼以便在printf中的主函數中打印局部變量的值? (通過利用printf的漏洞)

+0

你還沒有提到要在printf語句中打印的變量名 –

+3

@jpw,Santhosh Pai,大家請再讀一遍這個問題 –

+1

@IvayloStrandjev我剛剛回答了第二部分。 – jpw

回答

4

無法保證變量將位於堆棧的正確位置。您可以檢查堆棧(gdb)並查看它們的正確地址,但這不會是一個通用的解決方案。

+0

好吧,我同意你的看法。你如何可視化堆棧框架?它是主存的一部分,是虛擬內存的抽象部分。現在當我們說SP指向某些東西的時候。那麼SP指向多少個字節呢?當我做SP + 1時,SP指針向前移動多少個字節? –

+1

@codeymodey啓動'gdb'並說'break main'。然後嘗試步進('step'或'stepi'),做'info frame','x/16x $ rsp'等。 – cnicutar

+0

x/16x $ rsp工程,同樣如果我打印整個堆棧太多%d,我啓動最終看到價值。此外,爲什麼這些值不同大小(-1000081144 - 10000081128 4197428 4197568 -842270912)? –