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