X-man-A face:
這道題是二維碼補圖的題,用ps將那兩個空的角補全就好了,掃碼可以得到一串base64加密的字符串,解碼就是了
Flag:QCTF{Pretty_Sister_Who_Buys_Me_Lobster}
X-man-Keyword:
這道題給了一張png圖片,常規(guī)思路試了一下,發(fā)現(xiàn)好像沒什么東西藏在圖片中,用Stegsolve發(fā)現(xiàn)圖層沒什么問題,也提取不出什么東西,長寬也沒問題,想了想有沒可能是lsb隱寫,就去網(wǎng)上找了個工具,解了下 ,密碼根據(jù)圖片猜就是lovekfc

噢噢 發(fā)現(xiàn)有點東西PVSF{vVckHejqBOVX9C1c13GFfkHJrjIQeMwf}
這一看就應(yīng)該是一個加密 ,試了一波凱撒 ,呃呃呃,然后就去google,百度,搜狗查了挺久的沒什么發(fā)現(xiàn),直到出題人給了hint2:種把關(guān)鍵詞提前的置換
發(fā)現(xiàn)了一種關(guān)鍵詞加密法的加密算法
原理 參考https://wenku.baidu.com/view/ab7a4f0131126edb6f1a10a0.html
最后根據(jù)原理寫出解密腳本

NewsCenter:
簡單的sql注入,用sqlmap跑就可以了

Lottery:
簡單看了下題目,最終目標是買個flag,初始money是20, 買lottery需要的9990000,然后就是玩一個游戲--猜數(shù)字 ,數(shù)字猜對的越多,獲得的money越多
查看了網(wǎng)頁的js代碼,找到關(guān)鍵邏輯

只要number數(shù)組全為true,就可以獲得最多的money
抓了個包

發(fā)現(xiàn)了numbers數(shù)組
只要將數(shù)組的值全改為true,那么就可以一次贏最多的money

重復多幾次就夠money買flag了

Xman-dice_game:
拿到題目,看了下防護機制:

程序是64位的 只開啟了NX
拖到IDA中反匯編一下

程序的邏輯也很簡單,就是玩猜數(shù)字優(yōu)秀,要連續(xù)猜中50次 ,就會將flag打印出來
利用思路:
將seed種子覆蓋成一個固定的值,然后爆破處程序的隨機數(shù)
Seed在棧中的偏移

輸入70個1就可以將seed覆蓋成一個常數(shù)
爆破腳本:


getshell腳本:


Xman-stack2:
防護進制

開啟了NX和Canary 說明不是一般的棧溢出
用ida反匯編后 ,查看代碼發(fā)現(xiàn)了兩個漏洞點

主要是這個數(shù)組下標溢出 ,同時這個數(shù)組下標溢出可以使得打印數(shù)組的循環(huán)輸出256個棧上的字符,只要將v13[-20] = -1


根據(jù)打印出來的內(nèi)容可以得到棧上ebp和返回地址對應(yīng)數(shù)組的偏移,然后通過修改功能就可以一個字節(jié)一個字節(jié)的修改返回地址,構(gòu)造ropchain了
因為程序中本來就有system函數(shù),所以我將返回地址修改成hackhere函數(shù)的地址,但是打遠程時 ,服務(wù)器上不能用/bin/bash getshell
所以想到泄露libc地址,利用puts函數(shù)打印處printf_got地址的內(nèi)容

泄露出來后在libc database search那個網(wǎng)站查到相應(yīng)的libc版本
這里查到兩個 ,試了后發(fā)現(xiàn)是libc6-i386_2.23-0ubuntu10_amd64
我查到libc版本后,用one_gadget 來找gadget

還有一點是泄露完地址返回main函數(shù)后棧的地址會發(fā)生變化,所以要重新算,將數(shù)組再打印一遍就好了
exp:


NoLeak:
這道題我比賽的時候沒有做出來,那時候傻傻的unlink修改了存儲chunk指針的數(shù)組的內(nèi)容后就不知道怎么做了,比賽結(jié)束以后看writeup才明白怎么做
先分析下程序:
程序的漏洞有兩個,一個是UAF,另一個是堆溢出


具體思路:
因為程序沒開NX和PIE,所以可以通過向bss段寫shellcode,然后執(zhí)行的方式來getshell,因為沒有辦法直接控制rip,所以通過向__malloc_hook寫入shellcode的地址,然后再malloc一個chunk,觸發(fā)malloc_hook來getshell。至于要怎么寫,可以通過fastbins dup 獲取包含 數(shù)組buf的chunk, 修改buf數(shù)組的內(nèi)容,將__malloc_hook的地址寫到數(shù)組中,然后再通過編輯功能向__malloc_hook寫入shellcode的地址
具體步驟:
- 先生成大小分別為0x70,0x90,0x90的3個chunk0,1,2
- 利用unsorted bin attack ,向0x601040+0x28 + 0x10的地址寫入 main_arena+0x88的地址,
- 通過fastbins dup,在數(shù)組buf上分配堆塊。這是為了后面修改buf數(shù)組的內(nèi)容做準備 ,將chunk0 free掉,然后修改chunk0的fd指針,使其指向 0x601075,因為經(jīng)過unsorted bin attack后,0x601075+0x8處的值為0x7f,大小符合fastbins list。先生成一個0x70大小的chunk,然后再生成一個0x70大小的chunk,就在0x601075那分配出一個chunk,同時將buf[9]地址的內(nèi)容修改為0x601070 ,即向buf[9]寫入指向buf[6]的指針
- 用編輯功能,將&buf[6]地址上的內(nèi)容,將buf[6]修改為0x601090,為后面向bss段寫shellcode做準備,同時partial overwrite 修改buf[7]的最低位,使其變成__malloc_hook的地址
- 用編輯功能 ,修改buf[7],使__malloc_hook 指向0x601090
- 向0x601090 即*buf[6] ,寫入shellcode
- 隨便分配一個堆,觸發(fā)__malloc_hook getshell
下面畫一張 buf的內(nèi)存分布的示意圖:

- unsorted bin attack 向buf數(shù)組寫入main_arena + 0x88的地址
update(1,p64(0x601040+0x28)*2)#unsorted bin attack
print "update chunk1 fd and bk to [%s]"%"0x601040 + 0x28"
delete(0)
create(0x80,'G'*0x30)

- fastbins dup 在buf數(shù)組的上分配chunk
update(0,p64(0x601075))
create(0x68,'H'*0x10)
create(0x68,'I'*3+p64(0x601070))#9


可以看到此時buf[9]地址的內(nèi)容被修改為0x601070
- 編輯buf[9],即向buf[6]地址寫東西,向buf[6]寫入buf[10]的地址,同時partial overwrite 修改buf[7]最低位為'\x10',這是__malloc_hook 的地址就在buf數(shù)組中了
update(9,p64(0x601090)+'\x10')

- 向__malloc_hook寫入0x601090 ,同時向0x601090寫入shellcode
update(7,p64(0x601090))
update(6,sc)

- 最后隨便malloc一個chunk 就可以getshell了
