2021 AIS3 pre-exam

08 June 2021

Final score

因為修課的關係, 今年又比了一次ais3 pre-exam, 這次成績還蠻滿意的, pre-exam 20名, 但也凸顯我web security方面真的是沒救了… 只解得出一題

Pwn

Write-me

Flag: AIS3{Y0u_know_h0w_1@2y_b1nd1ng_w@rking}

GOT hijack, 題目把system的got指向的位址改成0,導致system(‘/bin/sh’)失敗, 目標是要把 system got指向的位址restore

透過gdb看一下systemplt的位址,然後再根據題目給的.c檔裡面寫的system got的位址 這兩個位址輸入到server,這樣system got的位址就指向正確的plt然後就順利執行

Noper

FLAG: AIS3{nOp_noOp_NOoop!!!}

Shellcode題, 程式會跳到我們的輸入並執行我們的輸入, 但在執行前會把我們的輸入的字串特定的位址得value設成NOP, 所以在design shellcode時要特別注意避開,shellcode在寫到那些特定位址時要插入NOP避開.

Reverse

Piano

Flag: AIS3{7wink1e_tw1nkl3_l1ttl3_574r_1n_C_5h4rp}

稍微用ida pro reverse一下, 發現他是.NET的app, 所以改用dnspy, 接著就順利找到 encode的地方, 把他弄出來decode就得到flag了

Peekora

Flag: AIS3{dAmwjzphIj}

Pickle deserialize的題目, deserialize會執行一段code, 要reverse他 利用pickletools把執行的object code dump出來,接著稍微簡單學一下pickle他的opcode後 開始reverse 然後就可以得到flag了

Reference:

Colors

Flag: AIS3{base1024_15_c0l0RFuL_GAM3_CL3Ar_thIS_IS_y0Ur_FlaG!}

Javascript reverse, 連上題目的網站後,發現有主要就是要reverse一個他include的encode.js檔. 基本上就是花時間reverse js code,

首先reverse得知要輸入上上下 下左右左右ba這個code來得到encoded flag, 花時間了解js code在做的事情發現他是 base1024 encode,題目中的html tag的class c, class r和呈現的數字總共可以有1024種. 這個js file就是用這種方式來對flag進行base1024的encode. 所以手刻base1024 decode得到flag

Crypto

MicroChip

Flag: AIS3{w31c0me_t0_AIS3_cryptoO0O0o0Ooo0}

根據題目給的code把flag decode出來

ReSident evil villAge

Flag: AIS3{R3M383R_70_HAsh_7h3_M3Ssa93_83F0r3_S19N1N9}

偽造rsa簽章題, 題目要我們input一個簽章S, 驗章時要等於某個特定的字串m.題目還有另一個功能是可以input一個integer(integer要小於int(字串m)),然後他會回傳我們那個integer的簽章. 問題點是我們不知道private key d所以也沒辦法得知m^d, 但因為m轉成integer後可以拆成兩個數字相乘, 我們可以透過oracle請system幫我們簽章這兩個數字, 然後把他乘起來得道m^d
即m = a*b 則 m^d = a^d * b^d

因此我們就用oracle input a,b得到兩個簽章相乘後就是m^d.

Chess store

Flag: AIS3{1._e4_e5_2._Qh5_Ke7_3._Qxe5#_1-0}

Hash Extension + fiestal cipher

看了一下source code, 基本上就是要人跟電腦下一盤人必輸的棋局,先下的人先輸,因為有一個必勝的公式,看對手下怎麼自己就用一個對應的下法就一定會獲勝. 我們要做的就是要想辦法贏的這場比賽. 因此,我們要想辦法改變棋局讓我們變成後下的, 看AI怎麼下我們在對應的下法來勝過他.

漏洞在,棋局是可以存下來的, 存下來的方式就是用fiestal的cipher encryption方式對目前的棋盤狀況做加密, 所以簽章就是棋盤的棋局和他的fiestal cipher

fiestal cipher一大特色是他是可以不斷的接下去做block encryption, 所以我們要做的就是設法把他pad到剛好滿,然後再插入一個新的block, 插入一個新的block就代表改變目前的棋局. 所以我們就設法把棋局弄到剛好滿一個或兩個block接著存棋局取得簽章S, 再拿我們設計好的新增的棋子和S做fiestal cipher, 這樣我們下次在load棋局時我們就input我們這個改變後的棋局跟簽章. 因此我們就成功改變棋局,變成人可以穩贏的棋局.接著就用穩贏演算法玩到贏就可以拿到flag.

Web

Json String manipulation

Flag: AIS3{/r/badUIbattles?!?!}

題目的json可以透過操控username,跟password name來迴避掉server端的check. 目的就是要把showflag改成true,然後password改成null即可
Payload:

Username: guest","showflag": true, "username": "qq Password: t","password":null,"test":"haha

Misc

Blind

Flag: AIS3{dupppppqqqqqub}

nc上的那台server他會把stdout的部分關掉在print flag, 但因為關掉所以我們看不到flag. 題目給我們input rax,rdi,rsi,rdx,rbx等五個暫存器位置給我們設定, 設定完後會執行execve, 因此我們要做的事就是設法把stdout打開.

一個想法就是呼叫dup,dup接收一個file descriptor然後把他複製到一個空的file descriptor, 所以dup(2)會把stderr複製到最小的空的file descriptor(即剛剛關掉的stdout,1), 因此我們設定dup(2)把stderr導向到stdout
input: rax:32, rdi:2 rdx:0 –> dup(2)

AIS3 遭駭

Flag: AIS3{0h!Why_do_U_kn0w_this_sh3ll1!1l!}

觀察封包http的部分, 可以發現有一個request他的url接的paramter跟別人不一樣, 然後稍 微看了一下response後 發現他是回傳index.php, Index.php這兩個東西, 所以把那個http request的parameter用先反轉再用base64 decode後發現就是command injection(ls) 接著 就嘗試連到那台主機上, 發現連得進去但只有看到Nginx 然後各種嘗試後發現 只要在http header裡面加上host的欄位,放入magic.ais3.org,就可以成功連上我們的目標, 所以利用前面提到的command injection漏洞把flag cat出來