作者pponywong (pony)
看板C_and_CPP
标题Re: [问题] system call
时间Thu Feb 12 17:54:38 2009
※ 引述《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)
1F:推 phkmalloc:想知道这些system call 的code template 要去哪里找? 02/12 18:06