当前位置: 首页 > news >正文

CALL处 F8的“bug“

看zpchcbd师傅的一篇文章看到了这个比较有趣的点。实操跟着过一遍。
准确来说这个不能说是"bug",这可以是一种"刻意为之"的手段,可以用于加壳、反调试等逆向技术中。

原理:

F8步过call的时候,其实是在call的地址的+5处下断点,也就是call的下一条指令下断点。
那如果我们在call调用的函数中,改变返回地址,使得不是默认的+5,那么F8就形同虚设,根本断不到,所以程序就直接F9了。
感觉这种完全可以结合SEH来设置[eax+2]的eip来做一个反调试,再加点junkcode,效果应该挺不错。

示例程序:

就是瞎改了call结束时的返回地址(通过改变栈顶[rsp]的值)

#include<stdio.h>
#include<Windows.h>int iEax;
int iRet;void _declspec(naked) test01() {printf("Cheat F8 Test...\n");__asm {mov iEax, eax;mov eax, [esp];add eax, 7;mov iRet, eax;push iRet;ret;}
}void test02() {printf(":?");return;
}int main() {int a = 0;printf("testing...");test01();a = 1;getchar();return 0;
}

visual studio编译为32位后,x32dbg调试。
在这里:image

我们直接F8过这个call的话,程序会直接运行到最终暂停的点。
对应这里就是这个int 29处,因为写asm的时候貌似写出了一些异常,不管了。。
image

也就是说,我们F8步过根本没有断到call返回的指令地址,而是直接F9了。

如果我们F7步入call,然后步过到ret跳出call,就会发现能够到call的返回地址处:
image
image

虽然是个奇怪的地址,但确实是断下了。

http://www.lryc.cn/news/481869.html

相关文章:

  • Verilog中的有符号数与无符号数
  • 15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!
  • 前端代码分析题(选择题、分析题)——this指向、原型链分析
  • react 组件应用
  • mysql 快速解决死锁方式
  • RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)
  • 在 WPF 中,绑定机制是如何工作的?WPF数据绑定机制解析
  • pwn学习笔记(12)--Chunk Extend and Overlapping
  • java基础面试题六集合框架
  • 2024年12月一区SCI-指数-三角优化算法ETO-附Matlab免费代码
  • 设置服务器ssh连接超时时间
  • Dubbo分布式日志跟踪实现
  • EPSON机械手与第三方相机的校准功能设计By python
  • 探索 Java 23:新时代的编程利器
  • CSS3_3D变换(七)
  • Mesh网格
  • LeetCode 509.斐波那契数
  • SQL Server 数据太多如何优化
  • 关于word 页眉页脚的一些小问题
  • 【高等数学学习记录】连续函数的运算与初等函数的连续性
  • 【抖音直播间弹幕】protobuf协议分析
  • Swift 开发教程系列 - 第11章:内存管理和 ARC(Automatic Reference Counting)
  • C#中 layout的用法
  • 【编程概念基础知识】
  • 【React】深入理解 JSX语法
  • 【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式
  • QtLua
  • c++-有关计数、双变量累加、半衰、阶乘、变量值互换的基础知识
  • MyBatis3-获取参数值的方式、查询功能及特殊SQL执行
  • web——[SUCTF 2019]EasySQL1——堆叠注入