---
# System prepended metadata

title: Computer_Security_Tools
tags: [Computer Security, "National Taiwan University\_"]

---

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



