首先弄明白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) 现在执行这个代码,然后恢复进程到正常运行,内存被申请了。