前情提要
這一頁會固定於前一天週三中午附加在聚會通告的 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