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