2025/3/23

ROP前置知识点

*自用

gadget

获取 gadget 可以使用工具 ROPgadget 获取到 elf 文件中的大部分 gadget。

例如

pop rdi

ret

其下一个地址的字符串会被弹入rdi中,成为ret(下一个函数地址,例如system)中的参数。

C程序调用过程与函数栈变化

#此文为PWN入门(1.1.2)C程序调用过程与函数栈变化(32位 vs 64位)(Intel)_文章阅读笔记

1.栈帧
其本质就是一种栈,只是这种栈专门用于保存函数调用过程中的各种信息(参数,返回地址,本地变量等)。栈帧有栈顶和栈底之分,其中栈顶的地址最低,栈底的地址最高,SP(栈指针)就是一直指向栈顶的。在x86-32bit中,我们用 ebp 指向栈底,也就是基址指针;用 esp 指向栈顶,也就是栈指针。

2.func(参数1, 参数2 ,参数3 )
在执行call func之前程序会执行一些push指令将func函数的参数1,2,3分别压入栈中

也就是push 参数3 push 参数2 push 参数1 这三条指令。#32位程序

3.64位的区别
在64位程序中,函数的参数会依次放入rdi rsi rdx rcx r8 r9 这六个寄存器中,只有把这六个寄存器塞满后,才会从右到左依次放入栈中

阅读文献

https://xidp0.github.io/2024/10/05/PWN%E5%85%A5%E9%97%A8(1.1.2)C%E7%A8%8B%E5%BA%8F%E8%B0%83%E7%94%A8%E8%BF%87%E7%A8%8B%E4%B8%8E%E5%87%BD%E6%95%B0%E6%A0%88%E5%8F%98%E5%8C%96%EF%BC%8832%E4%BD%8D%20vs%2064%E4%BD%8D%EF%BC%89(Intel)/

栈知识补充

1.函数状态主要涉及三个寄存器--esp,ebp,eip。esp 用来存储函数调用栈的栈顶地址,在压栈和退栈时发生变化。ebp 用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置。eip 用来存储即将执行的程序指令的地址,cpu 依照 eip 的存储内容读取指令并执行,eip 随之指向相邻的下一条指令,如此反复,程序就得以连续执行指令。

posted on 2025-03-26 19:59  dreamfish_miu  阅读(61)  评论(0)    收藏  举报

导航