iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
1
Security

資訊安全的美味雜炊系列 第 19

[Day19] - Rev 0x4 linux逆逆

  • 分享至 

  • xImage
  •  

Day19 - Rev 0x4 linux逆逆

前言

  • 在先前提到的組合語言,今天來聊聊關於linux上的逆向,接下來會有與一堆C語言相關的東西,如果不熟C的可能會有障礙哦

C語言的編譯流程

  1. Source code
    • C與C++的原始碼(.c, .cpp.cXX....)
  2. Preprocess
    • 接著會將source code預先macro處理
      • #define, #include, #pragma...等做初步處理
  3. Compile
    • 將Code經過編譯器編譯,編譯完的source code會生出組合語言
      • 包括語法分析(Lexical Analysis), 詞法分析(Syntax Analysis), 語意分析(Semantic Analysis)....
  4. Assemble
    • 接著會進行組譯,將組合語言轉成機器碼,產生binary
      • 產生出的是object file
  5. Linking
    • 最後會將產出來的object file,組成一個執行檔案,就可以執行了

Linking

  • Static Linking

    • 把Library編譯到執行檔當中
    • Library若有更動,程式碼code必須重新編譯
  • Dynamic Linking

    • 到程式的執行期,才將所需的Library放到記憶體當中
    • 執行檔檔案相對Static Linking較小
    • Library若有更動,程式碼code必須不須重新編譯

binary 解析工具

編譯一個binary來試試

  • hello.c
#include <stdio.h>
int main()
{
    printf("Hello World!");
}
  • 編譯成binary
gcc hello.c -o hello

strings

  • 試著列出binary可能有的字串

file

  • 通常打CTF會注意到的資訊
    • 32 / 64 bit
    • static / dynamic linked
    • not striped / striped
      • 程式中的symbol是否有被拔掉

nm

  • 列出程式中的symbol
    • 可以看到function name或是variable name

strace, ltrace

  • 列出程式的使用的library call
  • 列出程式的使用的system call

如何逆向source code

靜態分析

objdump

  • objdump -M intel -d <binary>
    • 能夠做到Disassembly,懶得開ida或ghidra可以試試這個

ida, ghidra

  • 這個在Rev 0x1介紹過了,這邊就不多介紹

動態分析

gdb

  • 能夠在程式執行的時候分析程式,通常程式開發者都是拿來除錯居多
  • GNU Debugger
    • 可以搭配peda或是pwngdb插件,能夠更快速及方便分析程式
常用的指令
  • run 執行
  • disas <functon名> 反組譯function
  • break <位置>
  • continue 繼續執行
  • info breakpoint
    • 列出所有斷點
  • info register
    • 列出所有暫存器
  • x/wx <address> 查看地址內容藏甚麼值
    • w可換成 b/n/g 1/2/8 bytes
    • /後可接數字,可表示一次列出幾個
    • 第二個x可換u/d/s/i以不同方式表示
      • u unsigned int
      • d 10進位
      • s 字串
      • i 指令
  • ni 下一個指令(不進func)
  • si 進(func)
  • backtrace 顯示上層所有stack frame
  • 對address設定值
    • 預設一次4byte
    • {char},{short},{long} 1/2/8
    • set *address = value
    • ex:
      • set *0x0804a060=0xdeadbeef
      • set {int}0x0804a060=1337
  • debug symbol
    • list 列出source code
    • b 下斷點
    • info local 列數local var
    • print val 印出變數val值
peda
sudo apt install git
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit
  • 一些好用的command
    • checksec
      • binary 中有那些保護機制
    • vmmap
      • 查看各個address中的權限
    • readelf
      • 查section位置
    • find
      • 找字串
    • record
      gdb 可回朔前面指令

詳情可參考:GDB-CheatSheet


上一篇
[Day18] - Rev 0x3 Android
下一篇
[Day20] - Rev 0x5 linux逆逆實戰
系列文
資訊安全的美味雜炊30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言