预备知识
一、相关实验
本实验要求您已经认真学习和完成了《CTF-PWN练习》、《CTF-PWN练习之精确覆盖变量数据》、《CTF PWN练习之函数指针改写》等试验。
二、函数调用约定
函数调用约定描述了函数传递参数的方式和栈协同工作的技术细节,不同的函数调用约定原理基本相同,但在细节上是有差别的,包括函数参数的传递方式、参数的入栈顺序、函数返回时由谁来平衡堆栈等。本实验中着重讲解C语言函数调用约定。
通过前面几个PWN系列实验的学习,也许你已经发现了在gdb中通过disas指令对main函数进行反汇编时,函数的开头和结尾的反汇编指令都是一样的:
push %ebp
mov %esp,%ebp
......
leave
ret
在函数的开头,首先是一条push %ebp指令,将ebp寄存器压入栈中,用于保存ebp寄存器的值,接着是mov %esp,%ebp将esp寄存器的值传递给ebp寄存器;在函数的末尾,leave指令相当于mov %ebp,%esp和pop %ebp两条指令,其作用刚好与开头的两条指令相反,即恢复esp和ebp寄存器的内容。
如果在函数A中调用了函数B,我们称函数A为主调函数,函数B为被调函数,如果函数B的声明为int B(int arg1, int arg2, int arg3),那么函数A中的调用函数B时的汇编指令的形式如下:
push arg3
push arg2
push arg1
cal

本文介绍了CTF-PWN练习中的返回地址覆盖技术,涉及函数调用约定、基本的缓冲区溢出攻击模型。通过实验步骤,包括源码审计、GDB调试和构造溢出攻击,深入理解缓冲区溢出攻击原理,最终成功改写函数返回地址,触发特定行为。
297

被折叠的 条评论
为什么被折叠?



