10.7. 代码注入

如果想在另外的进程上下文内创建子进程
nop
nop
nop
nop
nop
nop

mov $0x2, %eax # fork系统调用
int $0x80 # 系统调用中断
cmp $0x00, %eax # 是否返回值是0

jne fork_finished # 因为eax不是零,表明是父进程

push %ebx # 如果eax是零,子进程开始,将开始地址

call *%edi # 调用函数 
mov $0x1, %eax # 系统调用exit
int $0x80 # 退出子进程
fork_finished:
int $0x3
nop
代码期望寄存器值:
ebx = 传入函数的参数
edi = 子进程上下文中被调用函数的虚拟地址


如果想在另外进程里创建线程:
首先注入libpthread.so到进程中
寻找pthread_create的虚拟地址
申请和复制用户定义代码
执行转移到桩代码来创建线程
nop
nop
nop
nop
nop
nop

sub $0x4, %esp # 空间id
mov %esp, %ebp # 保存esp到ebp压栈
push %ebx # 参数压栈
push %eax # 函数压栈
push $0x0 # 没有属性
push %ebp # 压栈保存进程id的地址
call *%edi # 调用pthread_create
add $0x14, %esp # 恢复栈
int $0x3 # 断点
nop

函数跳转: