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
保存现场到堆栈中,lea edi, dword ptr ss:[ebp-40]
取地址编号赋给edi
即edi = esp + 3*0x4
,下面三条之路是一组,stos
用于将eax
的值存储到edi
的地址编号中,ecx
记录执行次数 。每执行一次,ecx - 1, edi + 4(df位为0)或者edi - 4(df位为1)
。cccccccc
是int 3
的硬编码int 3
是端点,这样做为了防止缓冲区溢出,未到的栈空间都被设置为cccccccc
,CPU执行遇到这里就会将程序停下来了 。下一步mov eax, dword ptr ss:[ebp+8]
是函数的第二个参数,ebp+c
是函数的第一个参数,这两步执行了关键操作 2 + 1 = 3此时函数功能就完成了,下面就是恢复现场了,pop edi
,可分为两步,mov edi, espadd esp,4
,先push的后pop然后执行mov, esp, ebp
,即将栈指针esp
下降到之前sub
执行前的位置,栈中的数据并没有清除然后
pop ebp
,即将0x12ff30
赋给ebp
然后esp + 4
,最后执行retn
,相当于pop eip
即mov eip, 401171
然后esp + 4
,这个地址就很关键了,这就是我们在pwn中经常覆盖的返回地址 。然后返回到调用者中执行 , 但是需要注意此时
推荐阅读
- 四十一 增删查改分页 Java开发学习----MyBatisPlus标准数据层开发
- 中 学习ASP.NET Core Blazor编程系列十——路由
- CC1,3,6回顾
- 图学习【参考资料2】-知识补充与node2vec代码注解
- 二十四 设计模式学习:Spring 中使用到的设计模式
- Java安全之CC3
- TensorFlow深度学习!构建神经网络预测股票价格!?
- JUC学习笔记——共享模型之管程
- Seata Server 1.5.2 源码学习
- 2022极端高温!机器学习如何预测森林火灾?? 万物AI