C和混编混合编程----strcpy缓存溢出原理
今天老師給了一到程序,讓我們分析分析原理,關于strcpy緩存溢出原理的,反匯編一遍遍調試,終于看明白了,記錄一下
C程序:
運行結果:
可以看出,按照正常的C的話,fun2函數應該只會執行一次,但執行了兩次,事出反常必有妖,讓我們來分析一下,反匯編:
當程序執行strcpy前,a的值是0x0019ff2c,這個是地址,存放的是0000000,在這里我們要特別注意0019ff30和0019ff34地址里面的值,后面執行fun2會用到
執行完strcpy后,a內容是地址為0x0019ff2c存放的值,我們可以看到0019ff30和0019ff34地址存放的內容發生了改變,這個時候我們再看C程序中shellcode數組的值:
發現0x0019ff2c到0019ff34存放的數據就是這些值,而且0019ff30和0019ff34存放的數據被這些覆蓋了。a數組大小為4,shellcode是12,a的數組存放不了shellcode的值,而strcpy函數不會檢查要復制的內容的大小,只管把要復制的內容復制過來,內存不夠,覆蓋內存中其他數據。
當執行完fun3是,按說應該程序結束,來讓我們看看,為什么fun2還會執行
當執行到pop ebp是,當前esp的值為0019ff30,內容為68697071,執行完后ebp的值就是68697071,ebp的值原本不是這個,因為使用strcpy把原本的內容覆蓋了
當執行到ret時,這個時候我們就要注意了,因為執行完這條語句就會去執行fun2函數,ret指令相當于執行:
這個時候esp的值為0019ff34,內容為00401005,執行ret后eip=00401005
我們來看看fun2函數地址,是00401005,這就是為什么執行完fun3回去執行fun2
總結:
參考
https://blog.csdn.net/yahohi/article/details/7724669
https://blog.csdn.net/xiaoyuai1234/article/details/52121588
總結
以上是生活随笔為你收集整理的C和混编混合编程----strcpy缓存溢出原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C和汇编混合编程----实现浮点数的加减
- 下一篇: 固原治疗卵巢功能减退最好的医院推荐