108第三次社課 === ###### tags: `1081` :::success 簽到: B073040047 楊志璿 B063012054 林祐安 B062040025 黃宇豪 B083040037 黃琮閔 B083040036 蔡明霖 B073040032 涂哲誠 B083040021 嚴宇同 B073040039 吳秉勳 B083040045 李亦晴 B083040044 沈育齊 B083011026 蘇彥龍 B083011023 陳又𩑹 B073040050 翁昌閔 B073040030 林秉承 B073040037 王昇鴻 B073040023 花千祐 B083011002 蔡泳霈 B083040004 艾保丞 B063040010 林宏儒 B073040022 張浩綸 B063040013 李洳瑄 B073040062 南政佑 B063040046 徐彥庭 B083040001 陳宥景 B083040014 陳昱維 B073040031 葉星佑 B063040059 陳縵欣 B073022002 蔡東霖 B063012015 賴亭諭 B064011007 徐筱媛 B063040016 陳垣菘 I083010013 陈金羽 B063040015 呂昇峰 B063040004 劉翔誠 B083040050 陳柏穎 M083140014 黃晏林 M083140008 黃警鋒 M083140006 莫閔勛 M083140001 張郢展 M083140005 曾煜鈞 ::: slide: https://docs.google.com/presentation/d/1UhU3tgzdzmtcAZh3cVkF-RuSRnLa_7CH3xHp5nv-XmI/edit?usp=sharing --- [Macaca CTF](https://ctf.macaca.cool) macaca.cool port:30XX 帳號: user 密碼: Is_l4b_pw --- ## objdump 用這個可以看到 vuln 的組合語言 ``` objdump -d -M intel ~/labs/abc/vuln | less ``` 鍵盤打 ``` /main ``` 可以看到 main 的組合語言 在 0x8048421 可以看到 push ebp 就是保存上一個 ebp 的位置(註: \_start() ) 然後 main 就是從這裡開始 little endian "ABC" = 0x434241 main 在 call sum 的時候: ``` 804843c: ff 75 f8 push DWORD PTR [ebp-0x8] 804843f: ff 75 fc push DWORD PTR [ebp-0x4] 8048442: e8 c4 ff ff ff call 804840b <sum> ``` 可以看到 push 了兩個參數進去 然後往上看,可以看到 sum function 在 0x804840b 把 ebp-8 移動到 edx 把 ebp-4 移動到 eax 這樣 sum function 就可以吃到 main 傳過來的參數了 離開是按 q ,就可以離開了。 ## GDB 接著輪到 gdb ``` gdb ~/labs/abc/vuln ``` 輸入 b main 設定中斷點在 main 上 ``` b main ``` 接著輸入 r 執行(run) ``` r ``` 單行執行 ``` ni ``` gdb 會顯示當前許多重要資訊 ``` [----------------------------------registers-----------------------------------] EAX: 0xf7f2b808 --> 0xffe9e82c --> 0xffea0848 ("SHELL=/bin/bash") EBX: 0x0 ECX: 0x84680548 EDX: 0xffe9e7b4 --> 0x0 ESI: 0xf7f29000 --> 0x1e5d6c EDI: 0xf7f29000 --> 0x1e5d6c EBP: 0xffe9e788 --> 0x0 ESP: 0xffe9e778 --> 0x8048479 (<__libc_csu_init+9>: add ebx,0x1b87) EIP: 0x8048435 (<main+20>: mov DWORD PTR [ebp-0x10],0x434241) EFLAGS: 0x286 (carry PARITY adjust zero SIGN trap INTERRUPT direction overflow) [-------------------------------------code-------------------------------------] 0x8048424 <main+3>: sub esp,0x10 0x8048427 <main+6>: mov DWORD PTR [ebp-0x4],0x10 0x804842e <main+13>: mov DWORD PTR [ebp-0x8],0x20 => 0x8048435 <main+20>: mov DWORD PTR [ebp-0x10],0x434241 0x804843c <main+27>: push DWORD PTR [ebp-0x8] 0x804843f <main+30>: push DWORD PTR [ebp-0x4] 0x8048442 <main+33>: call 0x804840b <sum> 0x8048447 <main+38>: add esp,0x8 [------------------------------------stack-------------------------------------] 0000| 0xffe9e778 --> 0x8048479 (<__libc_csu_init+9>: add ebx,0x1b87) 0004| 0xffe9e77c --> 0x0 0008| 0xffe9e780 --> 0x20 (' ') 0012| 0xffe9e784 --> 0x10 0016| 0xffe9e788 --> 0x0 0020| 0xffe9e78c --> 0xf7d61fb9 (<__libc_start_main+249>: add esp,0x10) 0024| 0xffe9e790 --> 0x1 0028| 0xffe9e794 --> 0xffe9e824 --> 0xffea082f ("/home/user/labs/abc/vuln") [------------------------------------------------------------------------------] Legend: code, data, rodata, value 0x08048435 in main () gdb-peda$ ``` 單步執行 ``` ni ``` 跟 si 的差異是 nexti 遇到要 call 另外一個 function ,那麼它會直接執行到該 function 結束,也就是說 nexti 不會暫停在其它的 function。 display assemble 列印出組語程式碼 ``` disass ``` 可以看組語 leave = mov esp, ebp; pop ebp; ret = pop eip 看 main assembly code ``` disass main ``` 看到 const char* ``` $ x/s 0xffe540d8 > 0xffe540d8: "ABC" ``` --- ## execute ``` ls -l ./vuln cat flag.txt ``` 離開 shell ``` exit ``` --- ## address ``` objdump -d -M intel ~/labs/address/vuln | less /main ``` 比較 source code ``` cat vuln.c ``` 沒有關到 canary,先略過(這題是正常的,只是剛好被改寫QQ) canary 參考資料:https://szlin.me/2017/12/09/stack-buffer-overflow-stack-canaries/ --- ## endian ``` echo -e "\x41" >A echo -e "\xef" >????不可視字元 ``` echo -e --- ssh連線工具: putty https://www.putty.org/ install this: https://the.earth.li/~sgtatham/putty/latest/w64/putty-64bit-0.73-installer.msi --- ## 頁尾意見區 有沒有好的自學網站QQ >[name=楊志璿][pwnable.kr](https://pwnable.kr) (?) >或是說 picoctf.com >[name=吃瓜眾]如果是關於GDB的部分,可以google有蠻多資源。 >像是[如何使用-GDB-Debug](https://www.puritys.me/docs-blog/article-329-如何使用-GDB-Debug.html) >[name=吃瓜眾] 若題目有提供source code可以先看看程式是如何執行的:) > >[name=講師] 抱歉~今天環境目錄權限沒關好,導致有些題目被修改而開保護,無法解題QQ >>[name=蘇彥龍] 請問影響哪些題目呢?impossible可以解嗎?XD >>[name=講師] 全部都正常,除非被修改,而impossible真的impossible了QQ (已從ctfd移除) >>[name=蘇彥龍] 所以,因此才出現``` 'flag.txt' missing in the current directory!```嗎?XD >>[name=講師]嘿呀,設計有誤,jump過去也沒權限讀 >>[name=蘇彥龍] 原來如此,害我花那麼多時間在想這怎麼回事XD >>[name=講師]sorrr,耽誤到你時間>< >>[name=蘇彥龍] 沒關係啦~ 話說,你輸入法是不是開到轉成簡體的模式? >>[name=講師] debian10太新,gcin還沒跟上,只有破破輸入法 >>[name=蘇彥龍] 有注音卻預設簡體?真奇怪 >>[name=講師]剛又翻了下,確定没有繁體的...(已放棄治療 >>[name=蘇彥龍] XDD vuln擁有者為ctf:[題目名稱]代表正常 ```shell -r--r----- 1 ctf address 27 Oct 23 11:31 flag.txt -rwxr-sr-x 1 ctf address 7592 Oct 24 09:30 vuln -rw-rw-r-- 1 ctf address 805 Oct 24 08:00 vuln.c ``` vuln擁有者為user:user代表被修改過,可能無解(建議換一台) ```shell -r--r----- 1 ctf address 27 Oct 23 11:31 flag.txt -rwxrwxr-x 1 user user 7592 Oct 24 09:30 vuln -rw-rw-r-- 1 ctf address 805 Oct 24 08:00 vuln.c ``` 路人路過,補充幾個學習資源(不符合格式再麻煩管理員刪除Orz): * wargame: * [pwnable.tw](https://pwnable.tw) * hitcon 成員架的解題網站 * 很像平常 ctf 比賽的模式 * 偏難,練到一定程度可以去玩玩看 * 學習: * [angelboy-slide](https://www.slideshare.net/AngelBoy1?utm_campaign=profiletracking&utm_medium=sssite&utm_source=ssslideview) * hitcon pwn 主力選手,[人物介紹](https://ithelp.ithome.com.tw/articles/10226236) * 教材很經典 * 初學看 linunx binary exploitation 和 execution 就好,其他可以先略過 * 可以配合 angelboy 的 [lab](https://github.com/scwuaptx/HITCON-Training) 自己練習 * [ctf-wiki](https://ctf-wiki.github.io/ctf-wiki/)