緩衝區溢位實驗1原理篇
//---c源程式--------
#include
#include
unsigned char name="12345678aaaa";
int main(int argc, char* argv)
下面是進入main()後的彙編**:
00401000 /$ 83ec 08 sub esp, 8
00401003 |. 83c9 ff or ecx, ffffffff
00401006 |. 33c0 xor eax, eax
00401008 |. 8d5424 00 lea edx, [esp]
0040100c |. 56 push esi
0040100d |. 57 push edi
0040100e |. bf 30704000 mov edi, 00407030 ; ascii "12345678aaaa"
00401013 |. 68 48704000 push 00407048 ; ascii "hello world!"
00401018 |. f2:ae repne scas byte ptr es:[edi]
0040101a |. f7d1 not ecx
0040101c |. 2bf9 sub edi, ecx
0040101e |. 8bc1 mov eax, ecx
00401020 |. 8bf7 mov esi, edi
00401022 |. 8bfa mov edi, edx
00401024 |. c1e9 02 shr ecx, 2
00401027 |. f3:a5 rep movs dword ptr es:[edi], dword p>
00401029 |. 8bc8 mov ecx, eax
0040102b |. 83e1 03 and ecx, 3
0040102e |. f3:a4 rep movs byte ptr es:[edi], byte ptr>
00401030 |. e8 0b000000 call 00401040
00401035 |. 83c4 04 add esp, 4
00401038 |. 33c0 xor eax, eax
0040103a |. 5f pop edi
0040103b |. 5e pop esi
0040103c |. 83c4 08 add esp, 8
0040103f /. c3 retn
在執行strcpy之前的堆疊情況:
0012ff68 0012ffc0
0012ff6c 00401af1
0012ff70<= 00407048 push [ascii "hello world!"]
0012ff74 7c930738 push edi
0012ff78 ffffffff push esi;
0012ff7c 00401bac |_這裡就是給buf[8]留的記憶體空間
0012ff80 00407000 |
0012ff84 00401125
<-- main()的返回位址
0012ff88 00000001
0012ff8c 00370b40
0012ff90 00370b88
0012ff94 7c930738 ntdll.7c930738
執行了 strcpy 以後會從 0012ff7c 一直填充,將main()地返回位址給覆蓋,成了61616161
於是當main()返回的時候就會跳到位址61616161去,那個地方不存在,於是就出錯咯`
緩衝區溢位實驗
具體過程嚴格按照上面所描述。首先配置好環境。存漏洞程式stack.c,如圖,需對其許可權做更改,更改前後的許可權變化如圖,同樣是按照文件中的 存乙個exploit.c,先存著。使用gdb,在這裡我遇到了問題,因為在設定斷點時輸錯了位址,所以在輸入r時執行失敗,顯示無法插入斷點。解決方法 使用help...
緩衝區溢位漏洞實驗
根據實驗指導輸入命令安裝一些用於編譯 32 位 c 程式的軟體包 關閉位址空間隨機化功能 設定 zsh 程式 輸入命令 linux32 進入32位linux環境 在 tmp 目錄下新建乙個 stack.c 檔案,編輯 編譯該程式,並設定 set uid 在 tmp 目錄下新建乙個 exploit.c...
緩衝區溢位
緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...