第3篇-CallStub新栈帧的创建】的更多相关文章

在前一篇文章 第2篇-JVM虚拟机这样来调用Java主类的main()方法  中我们介绍了在call_helper()函数中通过函数指针的方式调用了一个函数,如下: StubRoutines::call_stub()( (address)&link, result_val_address, result_type, method(), entry_point, args->parameters(), args->size_of_parameters(), CHECK ); 其中调用St…
在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 介绍JavaCalls::call_helper()函数的实现时提到过如下一句代码: address entry_point = method->from_interpreted_entry(); 这个参数会做为实参传递给StubRoutines::call_stub()函数指针指向的"函数",然后在 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍到通过callq指令调用entry_point,那…
从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ; ; ret = Add(a,b); ; } 今天主要用汇编代码去讲述这个过程,首先介绍几个寄存器和简单的汇编指令的意思. 先看几个函数调用过程涉及到的寄存器: (1)esp:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶…
在前一篇 第4篇-JVM终于开始调用Java主类的main()方法啦 介绍了通过callq调用entry point,不过我们并没有看完generate_call_stub()函数的实现.接下来在generate_call_stub()函数中会处理调用Java方法后的返回值,同时还需要执行退栈操作,也就是将栈恢复到调用Java方法之前的状态.调用之前是什么状态呢?在 第2篇-JVM虚拟机这样来调用Java主类的main()方法 中介绍过,这个状态如下图所示. generate_call_stub…
在 第6篇-Java方法新栈帧的创建 介绍过局部变量表的创建,创建完成后的栈帧状态如下图所示. 各个寄存器的状态如下所示. // %rax寄存器中存储的是返回地址 rax: return address // 要执行的Java方法的指针 rbx: Method* // 本地变量表指针 r14: pointer to locals // 调用者的栈顶 r13: sender sp 注意rax中保存的返回地址,因为在generate_call_stub()函数中通过__ call(c_rarg1)…
0x01 前言 Windows 64位下函数调用约定变为了快速调用约定,前4个参数采用rcx.rdx.r8.r9传递,多余的参数从右向左依次使用堆栈传递.本次文章是对于Windows 64位下函数调用的分析,分析各种参数情况下调用者和被调用函数的栈结构. 0x02 4参数时函数调用流程 64位下函数的调用约定全部用FASTCALL,就是前4个参数依次用rcx,rdx,r8,r9传递,多余的参数从右至左压参. 1)测试用例 我们先用c语言写一个调用4参数的函数 int Add(int a,int…
之前多次提到接触到调用JavaCalls::call()方法来执行Java方法,如: (1)Java主类装载时,调用JavaCalls::call()方法执行的Java方法checkAndLoadMain()方法 (2)类的初始化过程中,调用JavaCalls::call()方法执行的Java方法<clinit>方法 可以看出,JavaCalls::call()方法为虚拟机调用Java方法提供了便利,Java虚拟机有invokestatic.invokedynamic.invokestatic…
栈帧地址随机化是地址空间布局随机化(Address space layout randomization,ASLR)的一种,它实现了栈帧起始地址一定程度上的随机化,令攻击者难以猜测需要攻击位置的地址. 第一次遇到这个问题是在做cs:app3e/深入理解操作系统attacklab实验的时候,后来在做学校的一个实验的时候也碰到了这个问题,最近在看一篇"上古黑客"写的文章的时候又碰到了这个问题,所以写一篇博文总结一下我了解的两种对抗思路. 1. NOP slide 注:以下环境基于Linux…
简介 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果.除此之外,它们还各自具有一些特殊功能.通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确.合理地使用它们. 16位cpu通用寄存器共有 8 个:AX,BX,CX,DX,BP,SP,SI,DI. 八个寄存器都可以作为普通的数据寄存器使用. 但有的有特殊的用途:AX为累加器,CX为计数器,BX,BP为基址寄存器,SI,DI为变址寄存器,BP还可以是基 指针,S…
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/amd64下的Linux Pwn常见的Pwn手法,如栈,堆,整数溢出,格式化字符串,条件竞争等进行介绍,所有环境都会封装在Docker镜像当中,并提供调试用的教学程序,来自历年赛事的原题和带有注释的python脚本. 课程回顾>> Linux Pwn入门教程第一章:环境配置 Linux Pwn入门教程…