# **Cryptography** ## Sage(Can solve lots of mathematic question) - Galois Field - System of Equations - Polynomial Ring - Factorize - Discrete Log - Elliptic Vurve - LLL - ... ## Useful Tools/Packages/Website - Python Packages: ```pycryptodome``` (AES, RSA, isPrime…..) > import方法: from Crypto.Util.number import ____ - Website: ```factordb``` (判斷Prime) - Python Packages: ```Z3``` (SAT solver) > import方法: from z3 import * - Tools: ```hashcat``` (有關hash collision) - ```cocalc```(類似colab) # **PWN & Reverse Engineering(Binary Analysis/Exploitation)** ## Reverse Engineering - Disassemblers - ```objdump```(linux內建) :::success **command** objdump -d main.o (任意執行檔,eg. .o .sh) ::: - ```radare2```(簡稱r2)(助教不常用) ## Reverse Engineering - Decompilers - ```IDA Pro``` - ```IDA Freeware``` -> lazy IDA(好用的plugin) - ```Ghidra``` - ```Cutter``` - ```Decompiler Explorer```(Website) :::success ### 關於IDA的操作 1. 在IDA View 的地方按D更改資料的型態,如:Byte、Word、Double Word、Quadro Word等等。(另外可以按下 Alt+D (或是在Options裡的Setup data type), 設定按下D之後可以快速切換的資料型態) 2. 在IDA View 的地方按下 shift+* 可以資料轉成Array。 3. 在IDA View 的地方按下 Alt+A(或是在Options裡的string literals)可以切換string的輸出型態。 4. 有時IDA並無法有效的將switch case解出來, 此時我們可以進行一些操作來修復: (1) 首先, 我們先找到jump的register (2) 接著,用Text view查看jump table的address (3) 最後, 在Graph view底下,點一下jump的register,然後到Edit->Other->Specify switch idiom...,將資訊填好,就可以重建完成。 5. 如果Graph view底下的圖很醜,可以右鍵loyout Graphic即可。 6. 如果想讓一段程式失效可以在Text view底下選取欲失效的程式碼然後按下u就可以讓其失效。 7. recover struct方法 (其實recover的過程就是看到有一連串的資料但大小不一樣那就有可能是struct而不是array) (1) IDA Auto Create Struct (2) Local Type : 如果看到member address的樣子後腦中已有想法可以執行以下步驟, view -> Open subviews-> Local types後, 右鍵點一下, 選Insert寫struct, 寫完後找到對應struct開頭的address選取並按y, 取剛剛寫struct的變數名稱 (3) Structure : 到Structures界面底下新增struct(按右鍵->Add struct type), 然後快樂的按我們的d, 去調整member大小 8. Intrinsic ::: ## Reverse Engineering - Others - ```readelf```: 讀elf :::success **command** readelf -a main.o (任意執行檔,eg. .o .sh) ::: - ```checksec```: check elf的保護機制 :::success **command** checksec --file=main.o (任意執行檔,eg. .o .sh) ::: - ```remote```到server時, 所要輸出的asm文字內容 :::success **command** cat xxx.asm | base64 -w0 (-w0 目的是不要換行) ::: - 查看Struct Alignment ![image.png](https://hackmd.io/_uploads/HkG3Bn1Q6.png) :::success **command** pahole struct_1 (前提是編譯出來的binary檔要-g,(要把所有的symbol都帶著才能pahole)) ::: ## Debuggers - Windows - ```x32dbg / x64dbg``` - ```CheatEngine``` - ```Windbg``` ## Debuggers - *nix - ```gdb -tui``` (gdb內建) :::success **command** ```gcc -g -o0 main.c``` ( -g是指編譯成適合debug的binary output; -o0是指不需要任何的optimization,避免會把一些global variable優化成register,之後要印變數會印不出來 沒有預設output file的話會是a.out ) ::: - ```gdb``` - peda + pwngdb(助教說不要用這個XD) - pwndbg(助教說這個讚) - gef - … > :::info > and you need to change ~/.gdbinit > ::: :::success **command** pwndbg會把ASLR變得很好看 - ```r ``` : run - ```start``` : 會停在program entry - ```starti``` : 跑第一個instuction後停下來 - ```ctrl + l``` : 可以清空畫面,像是清掉std::out的輸出 - ```shell echo 50 > in``` : 可以用在當每次跑程式都需要重複輸入相同內容時,範例為將50寫進in裡 - ```r < in``` : 把in的內容當作輸入 - ```b main``` : 設定main為中斷點 - ```b 10``` : 設定第10行為中斷點 - ```b *0x860040``` : 設定記憶體位置為中斷點 - ```b *$rebase(0x104d)``` : 若記憶體位置是dynamic的話可以透過此方法設定中斷點 - ```del``` : 刪除所有中斷點 - ```i b``` : info breakpoint 查看所有break point - ```del 一個數字``` : 刪除info breakpoint中對應的breakpoint編號 - ```disable 一個數字```: 暫停info breakpoint中對應的breakpoint編號,用在不想刪掉該breakpoint但現在不想啟用他的時候 - ```enable 一個數字``` : 啟用info breakpoint中對應的breakpoint編號 - ```c``` : continue繼續執行程式 - ```n``` : 執行source code下一行 - ```ni``` : 執行assembly code下一行 - ```s``` : step查看某個函數裡面執行的內容 - ```si``` : step instruction進到當前函式的assembly code位置 - ```fin``` : 完成當前函數 - ```bt``` : back trace,查看目前的stack - ```p 變數名稱``` : print出當前變數的值 - ```p 函數名稱``` : print出當前函數的address - ```p cache``` : 可能無法print出cache的值,要查看可以使用```p *cache@一個數值``` - ```p $rax``` : print出register的值,eg. rax rip... - ```p/x $rax``` : print出register的值,且轉為16進制,eg. /x為16進制 - ```p *arr@10``` : - ```x/6gx 0x860040``` : 印出當前address存放6個16進制的值 - ```x/6gd 0x860040``` : 印出當前address存放6個10進制的值 - ```x/10i main``` : 印出main中所存放前10個的instruction,main可以換成memory address - ```x/s main``` : main函數當成string印出其內容,main可換成memory address - ```telescope 一個address``` : 它會自動幫我們猜, 不用那麼麻煩用x/ - ```vmmap``` : 可以看東西的base - ```rec``` : - ```lay reg``` : 將registe畫面呈現出來 - ```lay asm``` : 將程式碼變成assembly code - ```lay src``` : 回到src畫面 - ```focus reg``` : 將畫面操作權交給reg,讓按上下鍵時,是對reg window有反應,可以將reg換成cmd或asm - ```attach pid``` : 連結到該process - ```disass``` : 看從特定位置 disass 的東西, ex:disass 0x555555554000,+0x20 - ```grep "/bin/sh"``` : 找出有此內容的位址 - ```help b``` : - ```help r``` : - … ::: :::info 如果今天不知道該設breakpoint在什麼地方,可以用在程式要input的時候用ctrl+c先中止程式,再來用s進行查看當前的stack,接著用fin不斷往上推,直到找到想要看的地方。 ::: ## PWN - Tools - ```ldd 執行檔```: 可以查看該執行檔用到哪些lib以及他的位置 - 然後再用```readelf -s lib的位置 | grep func名稱```: 可以查看他的symbol - ```one_gadget lib的位置```: 可以告訴我們他內部func的constrain以及他的address - ```ROPgadget --binary 執行檔名稱 > bat``` ,接著```cat bat | less```: 可以用來找尋想要的gadget(1. pop rdi 2. pop rdx 3. mov [rdi], rdx...)(查找ex: ```/pop rdi ; ret```) - ```pwntools``` :::success - https://edu-ctf.csie.org/problems/6 - ``` from pwn import * r = remote('edu-ctf.csie.org', 54322) #ver1 r.recvuntil('" : '[-len('125de545" : '):-len('" : ')]) #ver2 r.recvuntil('== "') h = r.recv(8) r.recv() i = 0 while True: if md5sumhex(str(i).encode())[:8] == h.decode(): break i += 1 print(i) r.sendline(str(i)) r.interactive() ``` - ```context.arch = "amd64" ``` : 設64bits的architecture - ```sc = shellcraft.sh()``` : 系統產生一段assembly ::: # **Web** ## Sending HTTP Request - ```curl``` > tldr套件可以用來查看其他套件有哪些常用的指令,tldr curl,記得不要直接apt tldr,建議去官方看。 > - ```curl -v http..........```可以用來查看詳細內容 > - ```curl -X POST 這裡可以放method,eg. Put Delete Header http........ --data '這裡通常放js指令'(body)``` - ```Postman``` - ```Python - requests``` ``` import requests requests.get('http:.......').json 也可以.txt之類的就看response的內容是什麼 requests.post('http:.......',data='.....').txt ``` - ```Python - aiohttp``` > 解決Python single thread的問題 - ```JavaScript - fetch()``` ``` GET : fetch('http:.........').then(resp=>resp.txt()).then(console.log) POST : fetch('http:.........', {method:'POST', body:'......'}).then(resp=>resp.txt()).then(console.log) ``` ## Inspect Network Traffic / Packets - ```wireshark``` - ```BurpSuite``` ## Obtaining Public IP to Send Back Flag - ```CSIE Workstation``` - ```ngrok``` - https://webhook.site/ - https://requestcatcher.com/ - https://typedwebhook.tools/ ## Website Inspection / Analysis - ```F12``` - elements - sources - network - application > storage > cookies ## Some Cmd - 將本地檔案傳至指定ssh目標 ```scp -r -P xxxx 檔案路徑 ssh名稱@ssh ip:ssh地方的路徑```