經過兩種方法,實現程序可以運行本來並不會被運行的代碼shell
手工修改可執行文件,改變程序執行流程,直接跳轉到getShell函數網絡
彙編指令與機器指令一一對應函數
%eip
存儲指向下一條要執行的指令的地址%ebp
存儲棧底指針,棧基址%esp
存儲棧頂指針,始終指向棧頂ESP存儲棧底地址,是由ESP在函數調用以前傳遞給EBP的。等到調用結束以後,EBP會把其地址再次傳回給ESP。因此ESP再次指向了函數調用結束後,棧頂的指針學習
首先將可執行文件pwn1
複製另存爲文件名爲學號20145308
的文件並執行,可實現回顯輸入的字符串的功能
3d
objdump -d 20145308 | more
命令查看目標文件20145308
的反彙編代碼getshell
指針
foo
code
main
blog
main
函數在call 8048491
處調用執行foo
函數,對應機器碼爲e8 d7ffffff
想要使main
函數在此處改成跳轉執行getshell
函數,修改d7ffffff(EIP+d7ffffff=foo)
爲c3ffffff(EIP+c3ffffff=getshell)
便可ip
vi
打開20145308
,將顯示模式切換至16進制模式,並查找到e8 d7
將d7
改成c3
,並將模式改回原格式,保存
字符串
運行修改後的文件,成功執行getshell
複製可執行文件pwn1
爲20145308lhy
objdump -d 20145308lhy | more
進行反彙編目標觸發函數getshell
正常運行的可執行函數foo
讀入字符串部分函數
輸入長度超過緩衝區的字符串
經過查看EIP
寄存器的值,發現是5覆蓋返回地址
再次輸入另外一字符串,精確肯定是字符串的哪一個位置覆蓋返回地址
查看EIP
寄存器,發現是1234四個數字覆蓋返回地址
構造用getsell
地址覆蓋返回地址的字符串
使用16進制格式查看input
文件
將input
經過管道符|
做爲20145308lhy
的輸入,緩衝區溢出,覆蓋返回地址,返回到getshell
,截獲getshell
後輸入命令ls
成功執行