10.4. 内存分配

首先弄明白malloc在给定进程的哪里,以至于我们可以调用它。
1) ldd ./example
libc.so.6 => /lib/libc.so.6 (0x40016000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
objdump --dynamic-syms --section=.text \
/lib/libc.so.6 | grep malloc
0006df90 w DF .text 00000235 GLIBC_2.0 malloc 
objdump --dynamic-syms --section=.text \
/lib/ld-linux.so.2 | grep malloc
0000c8f0 w DF .text 000000bd GLIBC_2.0 malloc
ld-linux是解释器,每个用到共享库的程序都需要用到
2) 现在我们知道malloc的vma在0x0000c8f0,这个只是在ld-linux.so.2
里的偏移,ld-linux基地址在0x40000000,那么真实的vma是0x4000c8f0。
3) 这样我们通过执行转移来调用malloc申请内存,通过PTRACE_GETREGS获取
寄存器,其中eax保存了函数返回值。
nop
nop
nop
nop
nop
nop

push %ebx # 申请的大小
call *%eax # 调用malloc
add $x4, %esp # 恢复栈
int $0x3 # 断点
nop

4) 现在执行这个代码,然后恢复进程到正常运行,内存被申请了。