安全矩阵

 找回密码
 立即注册
搜索
查看: 525|回复: 0

Windows 下的逆向分析-初探

[复制链接]

10

主题

10

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2022-10-15 19:17:59 | 显示全部楼层 |阅读模式
本帖最后由 梦幻的彼岸 于 2022-10-15 19:24 编辑

环境信息
系统信息:Windows11
涉及工具:Visual studio 、x64dbg
测试代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int a;
  5.     printf("Please input a number:\n");
  6.     int x = scanf_s("%d", &a);               //这不是将a的值赋给x,而是用来判断
  7.     //这是定义一个整型变量 x,scanf_s是输入一个值a,当你输入一个整型值,就会得到x = 1(判断为真);而当你键输入一个字符或其他不符合条件的内容时,就会得到x = 0(判断为假)

  8.     printf("%d\n", x);
  9.      if (a % 5 == 0 && a % 7 == 0 && a >1 && a <200)                        /*判断该数是否能同时被5和7整除并且a大于1小于200*/
  10.             printf("yes\n");                                /*如果能,则输出yes*/
  11.     else
  12.             printf("no\n");                                    /*如果不能,则输出no*/
  13.     return 0;
  14. }
复制代码

游戏规则
输入一个数值,使其终端返回出如下信息:
  1. 1
  2. yes
复制代码

备注:正常输入140即可满足需求
打破规则
输入不符合条件的内容,也可满足需求
示例思路:
程序运行后,会输入一段字符串

之后用户开始输入,判断后返回一些内容。

正常流程输出的字符串代码会在判断代码之前,并很有可能在一个区域,可测试根据这一段字符串定位到判断代码区域。
验证:
如下设置,会在Enyry Breakpoint 处断下

点击运行按钮让程序继续运行

此时返回x64dbg界面,搜索程序加载的字符串信息

结果

鼠标左键双击进入,此时看到了一些判断流程

鼠标滚轮上滑可看到此功能区域的入口点(sub)
sub上有多个int3,判断此为call调用的地址

下断点

重新加载程序


运行到下断点的地方

在Call、判断指令下断点用于分析

lea 指令:取偏移地址7FF7D3DA2260发送到寄存器RCX




单步运行,看到此Call过后终端输出了如下字符串

此Call后终端可输入数值

确认后

Call寄存器信息

Call后返回1

重新运行,输入不满足条件的值对比
Call寄存器信息

Call后返回0

差异
RAX不同
重新运行并输入不满足条件的值,并更改rax信息为1
选中RAX或对应的值并右键

修改

Call运行后看到已返回1,已打破一条规则

继续运行后看到如下判断情况

判断:根据显示的指令执行流程判断,若两个jne指令不跳转并jbe跳转就可返回yes
右键编辑指令,使其不起作用


修改指令



修改完后

运行验证

本篇文章,到此告一段落,有缘再会。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2023-6-7 14:51 , Processed in 0.014324 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表