Re: [問題] system call
※ 引述《phkmalloc (earnest)》之銘言:
: 想請問:
: 我寫了一個hello world 如下
: int main() {
: printf("hello world\n");
: return 0;
: }
: 我想知道這個main.c在做了static linking 之後,
: printf 產生出來的object level code 會是哪些?
: (這裡可能會有點誤解,其實我是已經知道產生出來的object level code是哪些,
: 但是我想知道printf call vfprintf 之後,是用哪些system call 來產生出這個
: object level code。)
: architecture 是 ARM
: linux : 2.4 or 2.6 都可以
: ------------------
: 上面的問題如果解釋的不清楚,我想就問: linux 在implement ARM system call
: 的方式 要去哪裡找?
: 目前 在<linux2.4>/include/asm-arm/unistd.h 有找到一些system call 的asm
: 其他不知道該怎樣追下去 ?
: 謝謝
用google 搜尋的話應該蠻多結果的
你可以搜搜看 shell code
基本上 system call 是 OS interrupt 0x80
一般是這樣的啦
unistd.h 應該會有所謂的 system call table
像是
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
這樣的話 exit 就是 1 號 system call
要呼叫 exit
給你一個範例
mov eax, 1;
mov ebx, 0; exit(0);
int 0x80
就可以了, 呼叫的時候 eax 放 system call number
之後 ebx, ecx, edx, esi, edi 放其他的參數
像是 exit 只需要一個參數, 所以填 ebx 就好了
如果超過六個參數怎麼辦, 就 allocate 一塊空間
把記憶體位置放到 ebx 就可以了
再給你一個範例:
write(int, void*, int);
mov eax, 4; // write = system call 4
mov ebx, fd; // get from open()
mov ecx, buffer;
mov edx, size_to_write;
int 0x80
應該了解了吧
還有我是用 MS asm 的寫法
linux要用 AT&T asm 的寫法, 所以去學一下吧
交大圖書館不知道有沒有 shellcode binding 這本書
清大是有...你可以借看看
當初學 buffer overflow attack 看了好久
當然要轉成arm的要花一點功啦
建議你先不要用 printf, fopen 之類的
先用 C or C++ 寫 open, write, read 這些 system call
#include <unistd.h>
int main()
{
write(1, "hello world\n", 12); // 0 = stdin, 1 = stdout, 2 = stderr
return 0;
}
然後用 gcc 轉成 asm 檔去看, 參數大S
arm-linux-gcc -S test.c
會生成 test.S 是 AT&T asm 的格式
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.207.94
※ 編輯: pponywong 來自: 140.114.207.94 (02/12 17:59)
※ 編輯: pponywong 來自: 140.114.207.94 (02/12 18:00)
推
02/12 18:06, , 1F
02/12 18:06, 1F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章