簡體   English   中英

Fedora 32位上的緩沖區溢出測試不會改變$ eip寄存器值

[英]Buffer Overflow Test on Fedora 32-bit not changing $eip register value

我試圖在32位Fedora上執行簡單的緩沖區溢出,但是eip寄存器值沒有改變

我的C代碼如下:

#include <string.h>
int main(int argc, char ** argv){
    char buffer[8];
    strcpy(buffer, argv[1]);
}

我試過執行:

echo 0 > /proc/sys/kernel/exec-shield
echo 0 > /proc/sys/kernel/randomize_va_space

禁用任何類型的保護。 以及我編譯如下:

gcc -g -Wall -fno-stack-protector -z execstack -m32 boftest.c -o boftest

當我運行命令

./boftest AAAABBBBCCCCDDDD

然后使用gdb觀察寄存器值; 我看到:

ebp contains  0x44444444, but 
eip contains 0x80483F4

這意味着$ eip尚未成功修改。

我已經閱讀了同樣問題的其他問題,但沒有一個解決方案適合我。 你知道怎么做這個工作嗎?

一種可能的結果是,在調用main之前,副本會覆蓋堆棧中的任何內容。 你正在檢查寄存器。 而不是從EPB指向的位置檢查堆棧。

EIP是指令指針寄存器,所以我不明白為什么你認為這會以某種有趣的方式改變。 請注意,機器指令不在x86的堆棧中。 此外,無法保證返回地址在堆棧上,因此如果您想要的話,您不必使用溢出寫入對其進行修改。

如果要修改EIP,則需要修改某些函數指針或其他內容。 通過緩沖區添加一個函數指針,然后在main的末尾調用它,看看是否通過溢出寫入函數指針來修改EIP。

好吧,我想我最終弄清楚出了什么問題。 我正在嘗試在Linux的Fedore 9上進行緩沖區溢出測試。我嘗試了所有修改,但沒有任何效果。

所以我將操作系統改為Ubuntu 12.04,測試工作完美。 通過執行./boftest `perl -e 'print "A" x 200'`$eip寄存器值被覆蓋為0x41414141 ,其中0x41是'A'字符的十六進制值,這意味着緩沖區溢出測試有效。

我認為問題出在Fedora OS上,也許它提供了其他級別的防止緩沖區溢出的保護,我不知道,而ubuntu 12.04版本沒有。 我只需要命令echo 0 > /proc/sys/kernel/randomize_va_space來使測試工作。

暫無
暫無

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

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