【PWN】學習筆記(二)【棧溢出基礎】

目錄

  • 課程教學
  • C語言函數調用棧
  • ret2text
  • PWN工具

課程教學

課程鏈接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
課程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取碼: 5rx6

C語言函數調用棧

在這里插入圖片描述
一個棧幀保存的是一個函數的狀態信息,父函數每調用一個子函數就會在函數調用棧中新增一個棧幀;
32 x86 esp
64 x86 rsp
在這里插入圖片描述
ebp 棧底
esp 棧頂
stack frame pointer記錄上一個父函數的棧頂指針的值,便于恢復父函數;
發生棧溢出的地方在local variables【上圖是32位情況】
上圖是32位情況,在32位傳參時,子函數所用到的參數保存在父函數棧幀的末尾(并不是保存在自己的棧幀中),這里的arguments是子函數所用到的形參
父函數最末尾的字長保存父函數自己棧頂的值,如上面紅色的箭頭指向previous stack frame pointer,同理父函數的父函數也是一樣的
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

父函數(main)先把所要調用的子函數(sum)中的參數(1,2)逆序壓棧(壓入自己的棧幀),此后壓入return address【即子函數下一條指令的地址(return 0 的地址)】,在子函數執行后回到下一條指令的地址(執行return 0);在子函數結束后要返回父函數的棧幀,這意味在調用子函數時不能把父函數的棧幀丟棄,由此需要加入父函數的棧底指針加入
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
丟棄某塊數據不用,并不需要把這塊數據抹除,只需要標記成不是我所使用的范圍即可;這也是磁盤數據恢復的原理,除非有新來的數據復寫
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
主調函數 caller
被調函數 callee
在這里插入圖片描述
遵循C語言函數調用規范,一般在開頭用push ebp以及mov ebp, esp,需要保存父函數棧底的狀態;結束會執行leave(恢復父函數的棧底)以及 ret(返回到父函數的下一條指令)

首先,主調函數也是有自己的父函數,將它的父函數的ebp壓入
在這里插入圖片描述
接著把esp抬高到和ebp相同的位置
在這里插入圖片描述
下一條指令為新的棧幀開辟局部變量的空間;這里是sub 0x10 , esp,即esp-16;為什么是減去?因為棧是反向增長(高到低)

將被調函數所用到的參數(1,2,3)反向壓入棧,即先壓入3,再壓入2,最后壓入1;
在這里插入圖片描述
call 這條指令不等于jump,jump是一個跳轉指令;call 不僅會將eip移動到目標代碼的位置,還會在棧中自動保存下一條指令的地址【此時的return address就是23的位置】
在這里插入圖片描述
此時進入被調函數,同理首先是push ebp和mov sep , ebp;先把主調函數的棧幀保存;注意此時父函數的ebp重新增加到棧里了,將esp的值賦給ebp;讓ebp抬高到新的棧幀的棧頂
在這里插入圖片描述
執行實際操作,最后的運算結果保存在eax的寄存器中【默認情況下保存函數的返回值】
在這里插入圖片描述
由于esp并沒有開辟局部變量的空間;為什么不是leave?leave就是 mov ebp,esp再pop ebp,這里只有pop ebp是因為子函數沒有任何局部變量,所以ebp在調用返回時已經在相應的位置了;pop這條指令總是把esp當前指向的位置,對應的一個字長的數據抬入到目標位置;所以pop ebp就會把esp向上抬一個字長,把esp本來指向父函數的值抬入ebp中;
在這里插入圖片描述
ret 相當于pop eip,eip回到父函數的位置

在這里插入圖片描述
主調函數情況其局部變量以及被調函數的相關參數
在這里插入圖片描述
使用add這條指令清空數據;最后保存結果到eax中
在這里插入圖片描述
值得注意的是,此時返回時esp和ebp并不在相同位置,所以需要leave,首先將esp的值變成ebp
在這里插入圖片描述
返回父函數的父函數
在這里插入圖片描述
以上過程需要非常熟練;棧還有很多其他工作的規則,以上是最基本的

ret2text

在這里插入圖片描述
關注eip寄存器,其中return address存在eip中;當eip中寫入我們目標代碼的地址,程序的控制流便被劫持了
在這里插入圖片描述
棧溢出是緩沖區溢出的一種
在這里插入圖片描述
在這里插入圖片描述
向局部變量(str[8])中寫入24字節數據,溢出到了關鍵結構
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
當我們拿到一個CTF PWN的題先通過checksec 看這個程序有什么保護措施
【x86架構小端序的可執行ELF】
在這里插入圖片描述
通過IDA看c語言代碼
在這里插入圖片描述
顯然漏洞明顯,讀入的數據長度不受限向上溢出
值得注意的是,此時雖然開辟了8字節,但是與ebp的距離是16字節(10h)
最好的方法還是動態調試,因為出題人可能以esp來尋址
在這里插入圖片描述
通過gdb動態調試,直接run是沒什么意義的,先打斷點,例如b main【b 表示 break】,再r【r 表示run】;此時我們可以看到具體的信息
在這里插入圖片描述
在程序執行到綠色箭頭位置時,所有寄存器的值;
eip此時main函數偏移26字節的指令,當前指針也是0x804856b
esp和ebp此時對應的值是一個很大的值,這是棧的地址(用戶空間的最高地址)
在這里插入圖片描述
這是反匯編窗口
在這里插入圖片描述
最上面的00:0000是棧頂(低地址),最下面的07:001c是棧底(高地址);gdb是反著顯示的
在這里插入圖片描述
函數調用棧的關系
在這里插入圖片描述
按n一直步過到漏洞位置
在這里插入圖片描述
按s步進入這個函數
在這里插入圖片描述
按n開始輸入,按照正常輸入8個A看什么情況
在這里插入圖片描述
這里我們看棧里面的情況,輸入stack 看多少項(24項棧值)
esp和ebp之間就是當前執行的函數的棧幀,esp表示棧頂,ebp是棧底
ebp是前一個函數被保存在棧里的ebp的值,ebp再往高一個字長就是返回地址,我們的目標就是攻擊這個返回地址
我們此時可控制的區域是esp和ebp之間的位置,即buffer這個變量
在這里插入圖片描述
這意味著只要我們一直寫,覆蓋返回地址即可達到攻擊效果
在這里插入圖片描述
回到IDA我們可找到這個后門函數,執行系統命令,直接獲得shell的控制權,相當于在shell中打開shell
這意味著我們先寫20個字節A(ebp還有4個字節),再寫4個字節制定的地址就會把原本的地址覆蓋掉
在這里插入圖片描述
我們要找到getshell的開始地址,通過雙擊IDA中getshell在匯編代碼中找到起始地址8048522
在這里插入圖片描述
我們這里就可以寫腳本來獲得shell了,值得注意的是payload中不能直接加0x8048522【前面是字符串這里是整型】,所以需要p32來轉換
最終發送payload并且與之交互io.interactive(),即可獲得shell
打遠程只要用remote即可

但是實際情況下不一定有后門函數
在這里插入圖片描述
一般系統調用這樣的代碼需要我們自己輸入
在這里插入圖片描述
只要不是代碼的地方都不可執行
在這里插入圖片描述
隨機化棧中的地址
在這里插入圖片描述
所以放在Bss中居多,Bss用于存放全局變量的,如果這個全局變量是開辟緩存區可以輸入系統調用即可
在這里插入圖片描述
比如上面這個情況
在這里插入圖片描述
利用工具直接生成shellcode的機械碼,再io.send直接發送

PWN工具

在這里插入圖片描述
IDA pro
f5 進入c程序
esc 返回上一個程序
在這里插入圖片描述
白色的函數為已寫死的函數
粉色的函數要用的時候再去調
在這里插入圖片描述
在Options的General中可調整一些設置,例如加入機械碼
在這里插入圖片描述
在這里插入圖片描述
這樣C語言代碼被拷貝到匯編代碼中
在這里插入圖片描述
shift+f12 或者 shift+fn+f12打開一個字符串界面【在不知道mian函數位置,可通過程序所表示的字符串找程序的主函數】
在這里插入圖片描述
在這里插入圖片描述
\r把之前的文本在顯示時清空,io.recv()把所有的數據完全還原【這里我用的時io.recvline()一行一行接收】
這里的ZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo=顯然是Base64,我們需要解碼

在這里插入圖片描述
將其解碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Doocker還原容器啟動命令參數

get_command_4_run_container可以還原docker執行命令, 這是個第三方包,需要先安裝: docker pull cucker/get_command_4_run_container 命令格式: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock cucker/get_command_4_run…

MISRA C++ 2023:C和C++測試解決方案實現靜態分析

自動化軟件測試解決方案的全球領導者Parasoft今天宣布,隨著Parasoft C/Ctest 2023.2即將發布,全面支持MISRA C 2023。Parasoft針對C和C軟件開發的完全集成測試解決方案計劃于2023年12月發布,可以幫助團隊實現自動化靜態分析和編碼標準合規性&…

git報錯WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

git報錯WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 可能存在的情況是:連接的gitlab服務已經切換物理服務器。除了上述的可能性還可以參考以下 Git Pull FailedWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING …

Windows 安全基礎——NetBIOS篇

Windows 安全基礎——NetBIOS篇 1. NetBIOS簡介 NetBIOS(Network Basic Input/Output System, 網絡基本輸入輸出系統)是一種接入服務網絡的接口標準。主機系統通過WINS服務、廣播及lmhosts文件多種模式,把NetBIOS名解析對應的IP地址&#xf…

Windows安裝Maven

一、Maven 是什么? Maven 是一個項目管理和整合工具。Maven 為開發者提供了一套完整的構建生命周期框架。開發團隊幾乎不用花多少時間就能夠自動完成工程的基礎構建配置,因為 Maven 使用了一個標準的目錄結構和一個默認的構建生命周期。 在有多個開發團…

AirServer Mac7.27中文破解2024最新圖文安裝激活教程含許可證

AirServer Mac 7.27中文破解是一款便捷式投屏軟件,它的主要功能在于實時地將移動設備上的圖像畫面內容投放到電腦設備上,讓電腦成為iPad、iPhone等iOS系統設備的大屏顯示器。 在設備之間建立局域網內的信號發送與接收通道,確保數據可以穩定安…

pytorch 常用api筆記

view_as()函數 函數定義:view_as(tensor) [參數為一個Tensor張量] 該函數的作用是將調用函數的變量,轉變為同參數tensor同樣的形狀。 例子 data1 [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [10, 11]]] t1 torch.Tensor(data1).long() # size2…

【解刊】IEEE(trans),1區TOP,CCF-B,審稿國人友好,最快僅1個月錄用!值得收藏~

計算機類 ? 好刊解讀 今天小編帶來IEEE旗下計算機領域高分好刊,CCF-B類推薦的期刊解讀,期刊審稿快,投稿友好,如您有投稿需求,可作為重點關注!后文有相關領域真實發表案例,供您投稿參考~ 01 期…

1,使用IDLE開啟我們第一個Python程序

前面我們已經安裝好了Python,安裝了Python后,他會自動幫我們安裝一個IDLE。IDLE是一個Python自帶的非常簡潔的集成開發環境(IDE)。他是一個Python Shell,我們可以利用Python Shell與Python交互。下面我們就利用IDLE開發…

常用的調試方法(段錯誤產生原因)

C 語言中常用的調試技巧和 demo C語言中常用的調試方法 打印調試信息 GDB 調試器 編寫單元測試 段錯誤產生原因 初學時兩種常用的段錯誤調試方法 C 語言中常用的調試技巧和 demo 當程序員進行調試時,他們通常會使用一些調試語句或技巧來幫助他們理解代碼的執行過程…

跟風申請香港優才計劃的人,很容易進入騙局和被割韭菜!

跟風申請香港優才計劃的人,很容易進入騙局和被割韭菜! 不得不承認一個事實就是,越來越多內地人正在搶占申請香港身份的份額!就因為這個項目門檻低、投入低,簡單來說就是多一層身份,多一層福利保障。 從目前…

Pyqt python 界面代碼

1、界面拖動代碼 # 拖動 def mousePressEvent(self, event):if event.button() QtCore.Qt.LeftButton and self.isMaximized() False:self.m_flag Trueself.m_Position event.globalPos() - self.pos() # 獲取鼠標相對窗口的位置event.accept()self.setCursor(QtGui.QCur…

go - 計算CIDR的主機數量

在網絡中,CIDR /32 表示該地址只能用作網絡地址本身,不能分配給任何主機。因此,在計算主機數量時,應將 CIDR 地址按照其位掩碼長度進行區分。對于 /32 子網掩碼,主機數量總是為 1,而不是 -1。 以下是修正后…

二.ts基礎類型

ts的基礎類型包含js的基礎類型和ts獨有的基礎類型 我們一般使用[let | const | val] 變量:類型 值的方式聲明一個帶有類型的變量 stringlet val:string 1numberlet val:number 1boolearnlet val:boolaern falseundefindlet val:undefind undefindnulllet val:nul…

Kubernetes實戰(九)-kubeadm安裝k8s集群

1 環境準備 1.1 主機信息 iphostname10.220.43.203master10.220.43.204node1 1.2 系統信息 $ cat /etc/redhat-release Alibaba Cloud Linux (Aliyun Linux) release 2.1903 LTS (Hunting Beagle) 2 部署準備 master/與slave主機均需要設置。 2.1 設置主機名 # master h…

成都工業學院Web技術基礎(WEB)實驗五:CSS3動畫制作

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考,前端變化比較大,按照要求,只能做到像,不能做到一模一樣 3、圖片和文字僅為示例,需要自行替換 4、如果代碼不滿足你的要求,請尋求其他的…

使用PyTorch II的新特性加快LLM推理速度

Pytorch團隊提出了一種純粹通過PyTorch新特性在的自下而上的優化LLM方法,包括: Torch.compile: PyTorch模型的編譯器 GPU量化:通過降低精度操作來加速模型 推測解碼:使用一個小的“草稿”模型來加速llm來預測一個大的“目標”模型的輸出 張量并行:通過在多個設備…

成都工業學院Web技術基礎(WEB)實驗三:CSS字體等屬性使用

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考,前端變化比較大,按照要求,只能做到像,不能做到一模一樣 3、圖片和文字僅為示例,需要自行替換 4、如果代碼不滿足你的要求,請尋求其他的…

Oracle 慢查詢排查步驟

1. Oracle 慢查詢排查步驟 1.1. 前言 記錄一次 Oracle 慢查詢的排查過程 , 便于以后直接使用。 看了一些文檔 , Oracle 中優化的方案和 Mysql 基本上是一致的 , 通常包括一下幾個方向 : 基準測試 (吞吐量): 包括 Oracle 本身吞吐量和磁盤 I/O 吞吐量 硬件分析 (資源情況): 包…

rails3 row sql example

refer: https://stackoverflow.com/questions/14824453/rails-raw-sql-example 搜索怎么在Rails3 使用row sql, 打開上面的鏈接,可以找到這樣的答案,如下圖: sql "Select * from ... your sql query here" records_ar…