2010-01-21 聚會手記

上一週 || 下一週

前情提要

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

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

這邊給出運用 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

除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-ShareAlike 3.0 License