Pwn题做题流程
- 使用checksec检查ELF文件保护开启的状态
- IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试)
- 编写python的exp脚本进行攻击
- (若攻击不成功)进行GDB动态调试 , 查找原因
- (若攻击成功)获取flag , 编写Writeup
一般都会在C代码开头设置setbuf(stdout, 0)表示设置printf缓冲区为0 , 有就输出而不是等到输出\n时一块输出
ebp + 0x4 存放函数中第一个局部变量 , ebp - 0x4是返回地址ebp - 0x8 存放函数第一个参数栈帧基本知识

文章插图
下面解释一下下面的汇编代码(AT&T格式) ,
首先
push %ebp , 保存调用者的调用者的ebp寄存器 , move %esp, %ebp开始创建caller函数的栈帧 , 然后sub $0x10, %esp , 在32位程序下是4字节对齐的 , 将esp指针向下移动16字节(参数占12字节 , 局部变量4字节) , 即四格 , 此时esp指向3上面的地址 , 然后将
callee函数的参数入栈(cdecl从右往左入栈) , 然后调用call callee , call指令其实是两条指令 , 先push esp + 0xc , 将返回地址压栈 , 然后jmp 00000000跳到callee函数的位置开始执行 , 然后同样的操作 , 先将caller函数的ebp寄存器压栈 , 然后mov esp. ebp开始创建callee函数的栈帧 , 之后开始callee函数的计算功能 , 取出之前入栈的参数进行加法操作 。执行完后将栈中保存的caller函数ebp寄存器的内容再pop给ebp寄存器 , 此时ebp指向最上面的位置 。然后esp - 4 , 上移一格 。最后执行ret指令 , 其实也是两条指令 , pop eip将caller调用callee函数之前入栈的返回地址pop给eip , 下一步就执行该地址 。然后esp + 4 , 回到caller函数的栈帧 , 可以看到首先是add $0xc, %esp , 将栈顶指针提升到3上面的位置 , 然后mov %eax, -0x4(%ebp) , 意思就是将eax寄存器的值 (callee的返回值) 赋给ebp-4的位置 , 即caller函数的局部变量ret , 然后addl $0x4,-0x4(%ebp)将局部变量ret的值 + 4 , 最后再把局部变量赋给eax寄存区准备返回
文章插图
call指令执行完后 , 会在esp中存储返回地址0x401171 = 0x40116c + 4 , 
文章插图
进入函数内部后 , 需要首先执行
push ebp , 保存调用它的函数的栈帧 。然后ebp = esp , 提升栈底 , 准备创建本函数的栈帧 , sub esp, 50 , 会将esp的位置往上提升0x40 / 4 = 0x10即16格 , 然后push ebx | esi | edi保存现场到堆栈中 ,
经验总结扩展阅读
- 四十一 增删查改分页 Java开发学习----MyBatisPlus标准数据层开发
- 中 学习ASP.NET Core Blazor编程系列十——路由
- CC1,3,6回顾
- 图学习【参考资料2】-知识补充与node2vec代码注解
- 二十四 设计模式学习:Spring 中使用到的设计模式
- Java安全之CC3
- TensorFlow深度学习!构建神经网络预测股票价格!?
- JUC学习笔记——共享模型之管程
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI
