我覺得我今天寫不了一個段落
接續昨天我們講到要覆蓋的位置在相對於 buf 偏移 112 的位置,但我們需要繞過保護機制。
由於 .rodata 是一個用於存儲 read-only data 的段。因此通常儲存不需要修改的數據,例如字串、常數等,我們可以觀察看看是否有可以利用的東西。
可以使用 IDA 或其他工具查看(R2、gdb 都可)
我們發現了有趣的字串 '/bin/sh',為什麼它有趣呢?
再了解這個之前,我們必須先了解一個叫 execve 的 system call。
execve 是一个重要的 system call,用于在 Linux 系统中載入並執行一個新的可執行檔,將目前的 process 替換為新的 process。
int execve(const char *pathname, char *const _Nullable argv[],
char *const _Nullable envp[]);
第一個參數是要執行的可執行檔的路徑,第二個是命令列參數,第三個是環境變數,用法如下:
execve("/bin/sh",NULL,NULL)
這樣代表執行一個 shell。
而在 x86 使用者呼叫 System call 的流程如下:
而我們要操控這些 Register 的值呢? 這就需要利用 gadgets 了
至於要怎麼用有機會再寫~
終於進入正題了,好累
這樣也可以喔,感覺跟這個有異曲同工之妙。