這篇文章就是來教大家學習怎么動態調試的,然后我還寫了一篇關于動態調試的文章,不是buu上面的題,就是兩道簡單的棧溢出問題,那兩道題挺有特點的。大家可以去看看。
每日3道PWN之課外2道(第2.5天)-CSDN博客
先找一個簡單的jarvisoj_level0調試一下,然后咱再看復雜的pwn1_sctf_2016
聽說又不考pwn了,所以只寫完了jarvisoj_level0,現在我就轉行去學逆向了
so,停工了~~~私密馬賽!
要求環境gdb和pwotool+pwndbg
jarvisoj_level0
先回憶一下
進去后按f5,查看反編譯的代碼
看一下vulnerable_function這個函數
找后門shift+f12
雙擊跟進
記錄地址0x40059A
大概回憶起來了吧,就是read溢出,做題思路我的另一個博客寫過,大家可以去看,
每日3道PWN(第二天)-CSDN博客
動態調試
現在我們進行動態調試
動態分析的正常流程,gdb打開文件
查看變量大小的兩種方法
方法1(常規大main的斷點+老老實實的查看)
b main 設置斷點
阿這,他說我權限不夠,稍等我一下哈,先chmod +x level0一下
然后再來一遍,run一下,我們就能看見main函數的匯編和棧什么的
下面這張不是本題的圖,但是有結構大概解釋
注意:asm的英文就是匯編的意思,registers是寄存器的意思,stack是棧的意思
看見漏洞函數了,為什么知道他是漏洞函數,當然因為前面我都博客里IDA靜態分析過了~
而且這個函數的中文意思就是易受攻擊的函數
我們就一直輸入n,然后知道綠色的箭頭指到漏洞函數vulnerable_function
按s,s就是step,si單步步進,進入該函數里面,看見了吧,漏洞利用點,read函數
tips:fini是退出當前函數,r是重新運行,如果弄錯的,可以試試這兩個
stack 24 命令查看當前棧的前24個棧幀
為什么要stack 24呢
我們的目的,就是查看當前變量buf的大小,前提就是要進入該函數內,就是n一直下一步,直到指向函數之后,輸入s,單步進入函數,才能看見變量buf。所以要stack
然后為什么24,聽我的大佬說,不管輸入幾,目的只要看見ebp或者rbp就算可以了,然后我們就用ebp(或者rbp)的地址減去eax(或者rax)的地址,來計算變量的大小
就像這樣
咱直接看后兩位相減就行,也就是0xb0-0x30=0x80=128
大小0x80,我們去看看對不對
對的。木的問題
vmmp
使用vmmap直接查看該進程的內存空間,不知道有啥用,晚點問問大神
1.查看棧、bss段是否可以執行,棧溢出包括BSS溢出
方法2(斷點的其他方式)沒成功
參考
棧溢出學習_loglevel:'debug-CSDN博客
cyclic這個工具,pwntools自帶的一個東西
常用的作用有兩個:
尋找偏移量(Offset):當你想要利用棧溢出等漏洞時,通常需要知道目標程序中棧上緩沖區的偏移量,以確定準確的覆蓋位置。使用"cyclic"工具可以生成一種重復的模式,并將其發送給目標程序,然后在程序崩潰時,通過查找崩潰時覆蓋的位置,就能夠計算出偏移量。
覆蓋返回地址:在進行棧溢出漏洞利用時,通常需要將惡意代碼的地址寫入到返回地址中,從而實現控制程序流程的目的。使用"cyclic"工具可以生成指定長度的重復模式,并將其作為返回地址,使程序跳轉到我們控制的位置。
尋找偏移量,以下是實例代碼:
from pwn import *pattern = cyclic(100) # 生成長度為100的重復模式,就相當于b'A'*n print(pattern)# 在漏洞利用中發送模式給目標程序 p = process('./vulnerable_program') p.sendline(pattern) p.recv() //接受數據的意思,就是有時候他會有一個提示的字符串,需要你先進性接收 p.close() //關閉接受的意思# 漏洞觸發后,獲取返回地址所在的偏移量 offset = cyclic_find(packed_address) # packed_address為返回地址 print(offset)
然后我要講的是gdb中cyclic的使用,目標是0x80=128,可以多一點,進行溢出,也可以剛剛好等于128
這里生成128位垃圾數據,一會直接拿來復制粘貼
這次也再學習以下打斷點的其他方式
先去IDA中查找漏洞利用函數的地址,我們打地址的斷點
先找到漏洞利用的read函數
然后右鍵選擇copy to assembly(復制到程序集的意思,咱也不知道程序集是啥意思,但作用把每一行源代碼就是編譯成成匯編碼,并進行注釋說明)
call的匯編碼意思是函數的意思,后面還有read字樣
那就是他了,記一下地址0x4005bf
gdb打斷點去
tip:對了,斷點就是讓程序運行道某給位置后停止,然后一步一步進行,是為了讓程序員調試用的
打斷點b *地址,別忘了*
然后我們在n的時候,就直接讓我們輸入東西了
找到棧,找道地址0x7fffffffdf30
然后用cyclic
或者當時直接這樣查看
跟著博主沒成功,私密馬賽,學藝不精