<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/5305

                    level 0


                    這一關就是一個簡單的游戲介紹,當然,還有明文的賬號密碼。打開網頁就能看到,不再敘述。

                    level 0 -> 1


                    使用上一關得到的賬號和密碼,ssh 登陸到目標機器。

                    ssh_level1.png

                    在主目錄下面,我們可以發現一個.backup文件夾,進入文件夾,發現了一個html文件,看樣子是瀏覽器收藏夾文件。我猜測密碼應該是在文件中以明文形式出現,用關鍵字leviathan進行搜索,立刻就能得到密碼。the password for leviathan1 is rioGegei8m。這道題應該就是讓你熟悉命令的。

                    leviathan_password_level1

                    level 1 -> 2


                    使用上一個level得到的密碼,ssh到下一個level。在這關的home目錄里面,我們看到一個名為checkset-uid程序,執行程序,看看程序執行結果。

                    leviathan_check_level1

                    程序要求我們輸入一個密碼,好吧。我不知道該輸入什么,猜想程序應該是將我們的輸入和某個密碼做比較,然后再執行。隨便輸入一個,觀察結果。

                    leviathan_check_failure_level1

                    打開GDB神器,看看它內部到底是個什么東西。

                    leviathan_gdb_level1.png

                    從圖中我們可以看看出來,程序三次調用getchar(),猜想,password應該是三個字符。strcmp()函數的一個參數是我們輸入的字符的存儲起始地址,另一個地址是0x18(%esp),程序一開始在這里存儲了一個值0x786573,然后將兩個地址作為實參送入strcmp(),所以猜想,這里0x18(%esp)就是我們需要的密碼。這個值正好是sex的十六進制格式,于是,得到密碼是sex。輸入程序,得到下一個level的密碼。

                    leviathan_crack_level1

                    level 2 -> 3


                    在這個level的home目錄里面,依然是一個set-uid的程序,執行程序得到如下結果,還是要使用神器gdb

                    leviathan_home_level2

                    使用gdb打開程序,這個程序主函數反匯編出來的結果有點長,不過貌似沒有看到子函數調用,只有一個主函數。

                    leviathan_gdb_level2

                    這個程序首先進行了參數檢查,如果沒有命令行參數輸入,則打印出錯信息,然后退出。之后使用access()進行文件權限檢查,如果沒有權限,則打印出錯信息,然后退出。然后再使用system()函數執行/bin/cat fileinput這個命令。

                    leviathan_error_level2

                    這就意味著我們不能利用符號鏈接來過這個權限檢查。

                    gdb的反匯編代碼,我們可以得到,程序使用輸入的命令行參數構造了/bin/cat argv[1]這個字符串,然后送入system()這個函數執行。于是我猜想到構造這么一個字符串/bin/cat < /etc/leviathan_pass/leviathan2。這樣就可以通過權限檢查,然后得到密碼了。

                    這樣,系統進行權限檢查的時候,則檢查的是<file這個文件的權限,但是執行命令的時候卻是/bin/cat < file這個命令。

                    leviathan_pass_level2

                    level 3 -> 4


                    還是一個set-uid程序,老流程走起,打開程序,看看它是那個小怪。

                    leviathan_home_level3

                    還是要gdb走起啊。

                    leviathan_gdb_main_level3

                    這里的strcmp()函數為什么調用我沒有理解,或許是為了干擾吧,在main()函數中有一個do_stuff()函數調用,整個程序的邏輯應該在這個函數里面。

                    leviathan_gdb_do_stuff_level3

                    可以看到,在do_stuff()函數中有strcmp()system()等比較,strcmp()的其中一個實參來自于fgets()函數的返回結果,另一個參數存儲在-0x117(%ebp),從圖中可以看出來,存儲在-0x117(%ebp)的參數就是待匹配的密碼。

                    leviathan_gdb_pass_level3

                    將密碼輸入到程序中,就可以得到一個shell,進而得到下一個level的密碼。

                    leviathan_pass_level3

                    level 4 -> 5


                    好吧,這一個level的文件在.trash文件夾中了,依舊是熟悉的流程。

                    leviathan_home_level4

                    從程序輸出看,應該是密碼被轉換成二進制輸出了,或者是加密之后轉換成二進制輸出,這個還是得要祭起gdb神器來幫忙了。

                    leviathan_gdb_main_level4

                    從這個循環過程中,我們可以看到,程序對密碼的每個字符,從最高位(符號位)開始計算,每次輸出一個字符0或者字符1,所以可以得到,該bin程序是將密文的每個字符轉換成二進制格式輸出。單步調試的時候,程序在調用fopen("/etc/leviathan_pass/leviathan5", "r")的時候返回錯誤,導致調試無法進行。看來,直接查看內存獲得密碼的方法是行不通了,只能寫腳本,處理程序的輸出了。

                    #!python
                    #!/usr/bin/env python
                    #coding=utf-8
                    
                    if __name__ == "__main__":
                            try:
                                    fp = open("log.txt", "r")
                            except:
                                    print "file open error"
                            for i in range(12):
                                    byte = fp.read(9).strip()
                                    value = (int(byte, 2)) & 0xFF
                                    #print value
                                    char = chr(value)
                                    print char,
                    

                    python代碼寫得不是一丁點的丑,實在是因為用得不多!

                    leviathan_pass_level4

                    把密碼中的空格剔除就是正確的密碼了。

                    level 5 -> 6


                    還是熟悉的流程,熟悉的味道。

                    leviathan_home_level5

                    似乎/tmp/file.log這個路徑被硬編碼到了程序中了,還是要看看這個程序到底做了什么事情。

                    leviathan_gdb_main_level5

                    確實是被硬編碼到了程序中去了,嘗試著在該路徑下建立一個指向密碼文件的符號鏈接文件,發現居然成功了。

                    leviathan_pass_level5

                    好吧,這一個level實在是有點開玩笑啊。。。。

                    level 6 -> 7


                    哈哈,這個level似乎有不一樣的味道,雖然還是熟悉的流程。

                    leviathan_home_level6

                    這里,這個set-uid程序需要輸入一個4 digit code,懶得再去用gdb反匯編了,我估計也不太好反,做了混淆應該。干脆就來個爆破吧。

                    #!python
                    #!/usr/bin/env python
                    #coding=utf-8
                    
                    import os
                    
                    for pincode in range(10000):
                            cmd = "~/leviathan6 %04d" %(pincode)
                            # for debug
                            #print "test %s" %(cmd)
                            ret = os.popen(cmd).read()
                            if ret.find("Wrong") == -1:
                                    print "maybe success in %s" %(cmd)
                    

                    程序在7123那里停止了,我猜想是跑到了shell里面去了。嘗試了一下,果然是這樣的。

                    leviathan_pass_level6

                    level 7


                    ssh登陸到level 7

                    leviathan_home_level7

                    好吧,我純粹是為了混一個邀請碼,才寫這個writeup的。要不然我肯定遵守這個規則!

                    end


                    Bingo!這個wargame就這樣結束了,題目確實挺簡單的,完全是為了新手學習,知道怎么玩wargames

                    更多關于wargames的信息,請參考這里!

                      <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>

                                      这里只有精品视频