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

:::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地方的路徑```