前情提要

前情提要

這一頁會固定於前一天週三中午附加在聚會通告的 Email 裡 若你也有想要分享的內容,也隨時歡迎你自助編輯加上你想分享的消息嘍 :-)

Thinker:

cat /proc/<PID>/maps

這樣子可以看某個 process 的 dynamic loading 的資訊

man proc 然後找 maps ,可以找到這個表格的說明

/proc/[pid]/maps
              A  file containing the currently mapped memory regions and their access per‐
              missions.

              The format is:

              address           perms offset  dev   inode   pathname
              08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
              08056000-08058000 rw-p 0000d000 03:0c 64593   /usr/sbin/gpm
              08058000-0805b000 rwxp 00000000 00:00 0
              40000000-40013000 r-xp 00000000 03:0c 4165    /lib/ld-2.2.4.so
              40013000-40015000 rw-p 00012000 03:0c 4165    /lib/ld-2.2.4.so
              4001f000-40135000 r-xp 00000000 03:0c 45494   /lib/libc-2.2.4.so
              40135000-4013e000 rw-p 00115000 03:0c 45494   /lib/libc-2.2.4.so

yan:

分享、重新整理 CIH @SA_Tainan – using ptrace to crack

摘自 jserv’s blog

[[div]]

  • ptrace 系統呼叫用以實做 gdb 一類可斷點 (breakpoint) 的追蹤除錯,或作系統呼叫的追蹤分析
  • ptrace 允許一個 parent process 去監控另一個 process 的執行,並得以檢驗 / 更改執行時期的系統 image (映射於虛擬記憶體) 和暫存器
  • 使用情境可透過 fork 系統呼叫去建立 child process (搭配 exec 系統呼叫) 或者直接追蹤某個已執行的 process [[/div]]

這邊給出運用 ptrace 的 [code], 利用上述, 在此用以打印出每行機械碼執行的記憶體位址 (eip)

$ touch 123 $ ./ptrace /bin/rm 123 2> y

b7eef810
b7eef812
b7eefa60
b7eefa61
b7eefa63
b7eefa64
b7eefa65
b7eefa66
b7f047db
b7f047de

$ ./ptrace /bin/rm 123 2> n

b7fd9810
b7fd9812
b7fd9a60
b7fd9a61
b7fd9a63
b7fd9a64
b7fd9a65
b7fd9a66
b7fee7db
b7fee7de

要使用 diff -ruN y n (或 vimdiff y n ) 去查程式的分叉點

一開始執行時就不一樣, 位址是 b7xxxxxx, 怎麼不是程式的 Entry Point

用 strace 在 trace 看看發現應該是 kernel 將檔案映射進記憶體的過程

$ touch 123 $ strace /bin/rm 123 &> strace

用 readelf 可以知道 object 檔結構 (定義於 i386 System V 版 ABI)

$ readelf -a /bin/rm less

大概在 6x 行, 看到程式執行其實會先經由 interpreter, ( Thinker : 這邊也可以指定, 比如 jave 的程式可能透過 jre, 而 arm 的程式可以交由 qemu 來執行 )

Entry point address:               0x80492b0



[Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x0acec 0x0acec R E 0x1000
  LOAD           0x00b000 0x08053000 0x08053000 0x00220 0x005c8 RW  0x1000

作弊一下, 把的程式的位址過濾出來就好,

$ grep “^0804” y > yy $ grep “^0804” n > nn

用 vimdiff 比較有成功刪除檔案和沒成功刪除檔案的, 在 475 行後開始有不一樣

475 08049baa                                   |   475 08049baa
   476 08049bac                                   |   476 08049bb4
   477 08049baf                                   |   477 08048ea8
   478 08049bb2                                   |   478 08048eae
       -------------------------------------------|   479 08048eb3
       -------------------------------------------|   480 08048e88
       -------------------------------------------|   481 08048e8e
       -------------------------------------------|   482 08049bb9
       -------------------------------------------|   483 08049bbb
       -------------------------------------------|   484 08049bbd
       -------------------------------------------|   485 08049bbf

$ touch 123 $ gdb /bin/rm (gdb) b *0x08049baa 設定中斷在此位址 (gdb) i b 看看設定的 break point (gdb) r 123 執行程式 /bin/rm 123 (gdb) si 單步執行, 會發現到了 0x08049bac (gdb) set $eip=0x08049bb4 設定指令指位器去執行判斷結果是沒有檔案的位址 (gdb) c Continuing. /bin/rm: cannot remove `123’: No such file or directory

Program exited with code 01.

看看執行結果是否為找不到檔案而跳出, 若不是則試試下個分叉點

找到差異處 08049baa,可以從此分叉點的的組合語言來看看 ,可以發現在這裡有作一個 je 的 jump

$ objdump -d /bin/rm less (為 AT&T 語法 GAS vs NASM)
8049baa:       74 08                   je     8049bb4 <geteuid@plt+0x91c>

修改十六進制檔, 但是要減去程式的基底位址, 因為編輯器通常從 00000000 開始算起

$ printf “%x\n” echo $((0x08049baa-0x08048000))

$ sudo vim /bin/rm :%!xxd

443 0001ba0: 4424 04e8 c0f6 ffff 85c0 7508 8b5f 2c8b  D$........t.._,.

到達 1baa 位置, 把 75 改成 74 [Intel Pentium Instruction Set Reference (Basic Architecture Overview)] 修改完後要轉回來

:%!xxd -r

$ rm 123

rm: cannot remove `123’: No such file or directory

不過以 rm 這個例子在我 eeepc 上好像有點不正常, 如果要安全一點請先用 ls 測試

關於怎麼修改成你要的 shell code, 研究中….

gittrac:

用 processing 寫一個有重力加速度的球 玩 geo defense 得到的靈感。 然後寫一個黑洞來作吸所有的球。起始點是 random 接著寫一隻蟲,讓所有的粒子追著跑 下一個是寫隨機產生的連續三角形,只用灰階。 下一個是丟石頭到天空。 下一個是下雨,下完後,有點像條碼。 下一個是地毯 下一個是像大日本國旗,切腹下去血都噴出來了。 下一個是畫失敗但有效果的圓框 下一個一排排的圓 下一個是慢慢的噴血 下兩個有慢慢動的靜態圖 有在動的馬塞克 下一個是碎形 下一個是也是 下一個是像qr code 下一個是切棋盤 下一個也是切棋盤的變形 下一個像慧星的原子圖 下一個是圓蓋圓 下一個是 cellear

Mat:

指令參考 http://code.google.com/p/wtxcode/wiki/LiveCD_Scripts

作 base layer

mkdir /tmp/ro/ 
mount -t tmpfs -o size=1% tmpfs /tmp/ro/

作 overlay layer

mkdir /tmp/overlay/ 
mount -t tmpfs -o size=1% tmpfs /tmp/overlay/

合併成 union layer

mkdir /tmp/aufs/
mount -t aufs -o br:/tmp/overlay=rw aufs  /tmp/aufs/
mount -n -o remount,add:1:/tmp/ro=rr aufs /tmp/aufs/

合併成 union layer ( 更常見的寫法 )

mount -t aufs -o rw,noatime,dirs=/tmp/overlay=rw:/tmp/ro=ro aufs /tmp/aufs

LiveCD/USB 常用到的唯讀壓縮檔案系統 SquashFS http://zh.wikipedia.org/zh-tw/SquashFS