OS - 用 Strace 追蹤 Syscall
===
###### tags: `OS` `C` `Linux` `Syscall`
# Test1
~~它就是一個會自殺的程式~~
- killSelf.c
```c=
#include <linux/unistd.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <signal.h>
int main() {
int tid;
tid = syscall(SYS_set_tid_address, NULL);
syscall(SYS_write, 1, "Hello World!\n", 13);
syscall(SYS_kill, tid, SIGKILL);
syscall(SYS_write, 1, "Test!\n", 6);
}
```
執行以下 command
```shell=
gcc -o killSelf killSelf.c
strace ./killSelf
```
輸出如下
```c=
execve("./killSelf", ["./killSelf"], [/* 64 vars */]) = 0
/* execve : execute program
* 執行程式 並傳參數以及環境變數 */
brk(NULL) = 0x8bf000
/* brk : change data segment size
* brk(NULL) 可以獲取 data segment 最後一個位址 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=97813, ...}) = 0
mmap(NULL, 97813, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5080502000
close(3) = 0
/* Load /etc/ld.so.cache */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5080501000
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f507ff2b000
mprotect(0x7f50800eb000, 2097152, PROT_NONE) = 0
mmap(0x7f50802eb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7f50802eb000
mmap(0x7f50802f1000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f50802f1000
close(3) = 0
/* Load /lib/x86_64-linux-gnu/libc.so.6 */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5080500000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f50804ff000
/* 創造兩個新的 mapping */
arch_prctl(ARCH_SET_FS, 0x7f5080500700) = 0
/* 設定 FS register 的 base address */
mprotect(0x7f50802eb000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7f508051a000, 4096, PROT_READ) = 0
/* 設定 memory 的保護機制 */
munmap(0x7f5080502000, 97813) = 0
/* unmap /etc/ld.so.cache */
/* 以下為 killSelf.c 裡所寫到的 syscall */
set_tid_address(0) = 32362
/* 得到 thread id
* 因為沒有創造 child process
* 這個 thread id 也是這支 process 的 process id */
write(1, "Hello World!\n", 13) = 13
/* 輸出字串到 fd 1, 預設 fd 1 是執行此程式的 pts */
kill(32362, SIGKILL <unfinished ...>
/* 將 PID 32362 的 Process 殺掉, 也就是這支 Process */
+++ killed by SIGKILL +++
```
# Test 2
```shell=
kill -9 24148
```
以下是 strace 這行指令的結果
註解則是作者後來加的
以下 syscall 都在 linux man 的第二部分
可以透過
```shell=
man 2 execve
```
類似這樣的指令去查如何使用 syscall
```c=
execve("/bin/kill", ["kill", "-9", "24148"], [/* 64 vars */]) = 0
/* execve : execute program
* 執行 /bin/kill
* 傳一個指向 ["kill", "-9", "24148"] 的 pointer
* 以及另一個指向有 64 個環境變數的陣列的 pointer
* 回傳值為 0, 代表成功執行 */
brk(NULL) = 0x195c000
/* brk : change data segment size
* 而 brk(NULL) 可以獲取 data segment 最後一個位址, 此例回傳為 0x195c000 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
/* access : check user's permissions for a file
* F_OK 測試檔案是否存在(若沒有讀取權限也會回傳 -1)
* R_OK 測試使用者是否對檔案有 r 權限
* 回傳 -1 代表執行失敗 */
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
/* open : open a file
* 開啟檔案 /etc/ld.so.cache
* O_RDONLY 設定了唯獨模式
* O_CLOEXEC 設定後, 若之後調用到 exec() 成功後, 此 fd 會被關閉
* 確保父子程序使用同一個檔案而造成衝突
* 回傳 3 即代表代表此檔案的 fd */
fstat(3, {st_mode=S_IFREG|0644, st_size=97813, ...}) = 0
/* fstat : get file status
* 第一個參數放 fd
* 第二個參數放一個指向 struct stat buf 的 pointer
* 執行成功後, file status 都會存在 buf 中
* 此例 fd 為 3 的檔案的權限為 0644, size 為 97813 B */
mmap(NULL, 97813, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe8c3e7e000
/* mmap : map files or devices into memory
* mmap(addr, size, protection, flags, fd, offset)
* addr 若為 NULL, 則由 kernel 決定在哪個 address 創造 mapping
* 若不是 NULL, kernel 也只會把它當作 '提示', 在它附近創造 mapping
* size 就是這個 mapping 的大小
* protection 設定這塊 mapping 的讀寫權限
* flags 設定這塊 mapping 是否跟其他 process shared
* fd 設定被 mapping 的咚咚
* offset 設定從那個咚咚的哪邊開始 mapping
* 此例的 fd 3 整個被 mapping 到 0x7fe8c3e7e000 上 */
close(3) = 0
/* close : close a file descriptor
* 關掉指定的 fd */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 看 ld.so.nohwcap 是否存在
* return -1, 不存在 */
open("/lib/x86_64-linux-gnu/libprocps.so.4", O_RDONLY|O_CLOEXEC) = 3
/* 開啟 /lib/x86_64-linux-gnu/libprocps.so.4
* 並用了兩個參數, 詳見 line 20
* 此 fd 為 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pD\0\0\0\0\0\0"..., 832) = 832
/* read : read from a file descriptor
* read(fd, buf, size)
* 從 fd 讀 size 個 B 到 buf
* 此例從 fd 3 讀 832 個 B
* "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0pD\0\0\0\0\0\0" 就是內容
* return 832 代表最終讀了 832 個 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=76744, ...}) = 0
/* fd 為 3 的檔案的權限為 0644, size 為 76744 */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3e7d000
/* 根據 man 以及
* https://stackoverflow.com/questions/34042915/what-is-the-purpose-of-map-anonymous-flag-in-mmap-system-call
* 這是創造一塊 rw-, size 為 4096 B 且都被 0 填充的 mapping
* address 為 0x7fe8c3e7d000 */
mmap(NULL, 2253888, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c3a4a000
/* 將 fd 3 mapping 到 0x7fe8c3a4a000, size 為 2253888, r-x */
mprotect(0x7fe8c3a5b000, 2097152, PROT_NONE) = 0
/* mprotect : set protection on a region of memory
* mprotect(addr, size, protection)
* 對從 addr 開始 size B 的記憶體施行 protection
* 此例為從 0x7fe8c3a5b000 開始的 2097152 B 的記憶體都被禁止存取 */
mmap(0x7fe8c3c5b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11000) = 0x7fe8c3c5b000
/* 將 fd 3 從 0x11000 B 的位置開始的 8192 B mapping 到 0x7fe8c3c5b000
* rw-
* MAP_FIXED 將 mapping 準確 mapping 到 addr
* MAP_DENYWRITE 此 flag 已棄用 */
mmap(0x7fe8c3c5d000, 78912, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3c5d000
/* 創造一塊 78912 B 的記憶體
* rw-
* 位置準確 mapping 在 0x7fe8c3c5d000 */
close(3) = 0
/* 將 fd 3 關閉 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
/* 開啟 /lib/x86_64-linux-gnu/libc.so.6 唯獨模式
* 並在 execv() 成功執行時關閉此 fd
* 代表此檔案的 fd = 3 */
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0755, size 為 1868984 */
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c3680000
/* 將 fd 3 mapping 到 size 為 3971488 B、權限 r-x 的 memory
* memory address = 0x7fe8c3680000 */
mprotect(0x7fe8c3840000, 2097152, PROT_NONE) = 0
/* 設定從 0x7fe8c3840000 開始的 2097152 B 的 memory 禁止存取 */
mmap(0x7fe8c3a40000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7fe8c3a40000
/* 將 fd 3 從 offset 0x1c0000 mapping 至 size 為 24576
* 權限 rw-
* memory address = 0x7fe8c3a4000 */
mmap(0x7fe8c3a46000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3a46000
/* 創造一個 14752 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c3a46000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/libsystemd.so.0", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/libsystemd.so.0
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=536520, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0644, size 為 536520 */
mmap(NULL, 540800, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c3df8000
/* 將 fd 3 mapping 至 size 為 540800
* 權限 r-x
* memory address = 0x7fe8c3df8000 */
mmap(0x7fe8c3e78000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7f000) = 0x7fe8c3e78000
/* 將 fd 3 從 offset 0x7f000 mapping 至 size 為 16384
* 權限 rw-
* memory address = 0x7fe8c3e78000 */
mmap(0x7fe8c3e7c000, 128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3e7c000
/* 創造一個 128 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c3e7c000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/libsystemd.so.1
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260Z\0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=130224, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0644, size 為 130224 */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df7000
/* 創造一個 4096 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c3df7000 */
mmap(NULL, 2234080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c345e000
/* 將 fd 3 mapping 至 size 為 2234080
* 權限 r-x
* memory address = 0x7fe8c345e000 */
mprotect(0x7fe8c347d000, 2093056, PROT_NONE) = 0
/* 設定從 0x7fe8c347d000 開始的 2093056 B 的 memory 禁止存取 */
mmap(0x7fe8c367c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x7fe8c367c000
/* 將 fd 3 從 offset 0x1e000 mapping 至 size 為 8192
* 權限 rw-
* memory address = 0x7fe8c367c000 */
mmap(0x7fe8c367e000, 5856, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c367e000
/* 創造一個 5856 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c367e000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/librt.so.1
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0!\0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=31712, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0644, size 為 31712 */
mmap(NULL, 2128832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c3256000
/* 將 fd 3 mapping 至 size 為 2128832
* 權限 r-x
* memory address = 0x7fe8c3256000 */
mprotect(0x7fe8c325d000, 2093056, PROT_NONE) = 0
/* 設定從 0x7fe8c325d000 開始的 2093056 B 的 memory 禁止存取 */
mmap(0x7fe8c345c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fe8c345c000
/* 將 fd 3 從 offset 0x6000 mapping 至 size 為 8192
* 權限 rw-
* memory address = 0x7fe8c345c000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/liblzma.so.5
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320 \0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=137400, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0644, size 為 137400 */
mmap(NULL, 2232456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c3034000
/* 將 fd 3 mapping 至 size 為 22324560
* 權限 r-x
* memory address = 0x7fe8c3034000 */
mprotect(0x7fe8c3055000, 2093056, PROT_NONE) = 0
/* 設定從 0x7fe8c3055000 開始的 2093056 B 的 memory 禁止存取 */
mmap(0x7fe8c3254000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x7fe8c3254000
/* 將 fd 3 從 offset 0x20000 mapping 至 size 為 8192
* 權限 rw-
* memory address = 0x7fe8c3254000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/libgcrypt.so.20", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/libgcrypt.so.20
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\215\0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0644, st_size=919168, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0644, size 為 919168 */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df6000
/* 創造一個 4096 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c3df6000 */
mmap(NULL, 3015360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c2d53000
/* 將 fd 3 mapping 至 size 為 3015360
* 權限 r-x
* memory address = 0x7fe8c2d53000 */
mprotect(0x7fe8c2e2a000, 2097152, PROT_NONE) = 0
/* 設定從 0x7fe8c2e2a000 開始的 2097152 B 的 memory 禁止存取 */
mmap(0x7fe8c302a000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd7000) = 0x7fe8c302a000
/* 將 fd 3 從 offset 0xd7000 mapping 至 size 為 36864
* 權限 rw-
* memory address = 0x7fe8c302a000 */
mmap(0x7fe8c3033000, 704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3033000
/* 創造一個 704 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c3033000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
/* 檢查 /etc/ld.so.nohwcap 是否存在 */
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
/* open /lib/x86_64-linux-gnu/libpthread.so.0
* 唯獨, 並在成功執行 exec() 時自動關閉
* fd = 3 */
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260`\0\0\0\0\0\0"..., 832) = 832
/* 從 fd 3 讀取 832 B
* 回傳 832 代表成功讀取 832 B */
fstat(3, {st_mode=S_IFREG|0755, st_size=138696, ...}) = 0
/* 取得 fd 3 的 file status
* 權限為 0755, size 為 138696 */
mmap(NULL, 2212904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c2b36000
/* 將 fd 3 mapping 至 size 為 2212904
* 權限 r-x
* memory address = 0x7fe8c2b36000 */
mprotect(0x7fe8c2b4e000, 2093056, PROT_NONE) = 0
/* 設定從 0x7fe8c2b4e000 開始的 2093056 B 的 memory 禁止存取 */
mmap(0x7fe8c2d4d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7fe8c2d4d000
/* 將 fd 3 從 offset 0x17000 mapping 至 size 為 8192
* 權限 rw-
* memory address = 0x7fe8c2d4d000 */
mmap(0x7fe8c2d4f000, 13352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fe8c2d4f000
/* 創造一個 13352 B, 用 0 填充的記憶體
* 權限 rw-
* memory address = 0x7fe8c2d4f000 */
close(3) = 0
/* 關閉 fd 3 */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=456632, ...}) = 0
mmap(NULL, 2552072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c28c6000
mprotect(0x7fe8c2934000, 2097152, PROT_NONE) = 0
mmap(0x7fe8c2b34000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6e000) = 0x7fe8c2b34000
close(3) = 0
/* Load /lib/x86_64-linux-gnu/libpcre.so.3 into memory */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\r\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14608, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df5000
mmap(NULL, 2109680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c26c2000
mprotect(0x7fe8c26c5000, 2093056, PROT_NONE) = 0
mmap(0x7fe8c28c4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fe8c28c4000
close(3) = 0
/* Load /lib/x86_64-linux-gnu/libdl.so.2 into memory */
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libgpg-error.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320(\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=80496, ...}) = 0
mmap(NULL, 2175544, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fe8c24ae000
mprotect(0x7fe8c24c0000, 2097152, PROT_NONE) = 0
mmap(0x7fe8c26c0000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12000) = 0x7fe8c26c0000
close(3) = 0
/* Load /lib/x86_64-linux-gnu/libgpg-error.so.0 into memory */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df4000
/* Mapping a 4096 rw- memory at 0x7fe8c3df4000 */
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df3000
/* Mapping a 4096 rw- memory at 0x7fe8c3df3000 */
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fe8c3df1000
/* Mapping a 8192 rw- memory at 0x7fe8c3df1000 */
arch_prctl(ARCH_SET_FS, 0x7fe8c3df1880) = 0
/* arch_prctl : set architecture-specific thread state
* ARCH_SET_FS 設定 FS 的 Base 為 0x7fe8c3df1880 */
mprotect(0x7fe8c3a40000, 16384, PROT_READ) = 0
/* 設定從 0x7fe8c3a40000 開始的 16384 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c26c0000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c26c0000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c28c4000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c28c4000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c2d4d000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c2d4d000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c2b34000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c2b34000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c302a000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c302a000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c3254000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c3254000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c345c000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c345c000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c367c000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c367c000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c3e78000, 12288, PROT_READ) = 0
/* 設定從 0x7fe8c3e78000 開始的 12288 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c3c5b000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c3c5b000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x604000, 4096, PROT_READ) = 0
/* 設定從 0x604000 開始的 4096 B 的 memory 擁有讀取權限 */
mprotect(0x7fe8c3e96000, 4096, PROT_READ) = 0
/* 設定從 0x7fe8c3e96000 開始的 4096 B 的 memory 擁有讀取權限 */
munmap(0x7fe8c3e7e000, 97813) = 0
/* unmap memory 從 0x7fe8c3e7e000 開始 97813 B */
set_tid_address(0x7fe8c3df1b50) = 24189
/* set_tid_address : set pointer to thread ID
* */
set_robust_list(0x7fe8c3df1b60, 24) = 0
rt_sigaction(SIGRTMIN, {0x7fe8c2b3bb50, [], SA_RESTORER|SA_SIGINFO, 0x7fe8c2b47390}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7fe8c2b3bbe0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7fe8c2b47390}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
brk(NULL) = 0x195c000
brk(0x197d000) = 0x197d000
statfs("/sys/fs/selinux", 0x7ffd644fdb80) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffd644fdb80) = -1 ENOENT (No such file or directory)
open("/proc/filesystems", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 362
read(3, "", 1024) = 0
close(3) = 0
uname({sysname="Linux", nodename="ubuntu", ...}) = 0
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
read(3, "0\n", 8192) = 2
close(3) = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2981280, ...}) = 0
mmap(NULL, 2981280, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fe8c21d6000
close(3) = 0
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2995
read(3, "", 4096) = 0
close(3) = 0
open("/usr/share/locale/en_US/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en_US/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en/LC_MESSAGES/procps-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
kill(24148, SIGKILL) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
```