逆向基础01--初见逆向

Catalogue
  1. 1. 逆向基础01–初见逆向
    1. 1.0.1. 寻找主程序
    2. 1.0.2. 内存中数据的修改
    3. 1.0.3. 修改跳转
    4. 1.0.4. 滑板指令

逆向基础01–初见逆向

在使用VS2015生成解决方案的时候,有两个版本:

image-20200516194459881

分别是Debug和Release版

  • Debug版比较大,带调试信息

  • Release版更小,会对代码进行优化精简

寻找主程序

在逆向的时候,第一件事是先找到主程序

示例程序:

1
2
3
4
5
#include<stdio.h>
int main() {
printf("hello world!");
return 0;
}

这里有个字符串hello world!在运行的时候回打印出来,所以可以作为标志点去寻找

对于debug版本:(使用Ollydbg)

  • ollydbg拖入程序后,右键,查找,所有参考文本字符串,然后点进去

对于Release版本:

  • ollydbg拖入程序后,右键,查找,所有参考文本字符串,然后点进入
  • F8跳转,见到红的F7进去,直到3个push1个call,很有可能是main函数(main函数特点:3个参数)F7进去看
  • 也可以直接往上拖,一般release版本main函数在最上面附近
  • 如果有API查找所有模块调用
  • 也可以用ida,ida会自动分析出main函数

内存中数据的修改

比如将前面的代码输出的hello world改为其他内容

直接修改1:

  1. 找到需要修改的地方,F2加断点,F9执行过去
  2. 在内存窗口上右键,转到,输入地址
  3. ollydbg在地址上,左键拖动选中,右键,二进制,编辑修改
    • 不保持大小可能会淹掉后面的数据

直接修改2:

  1. 在内存空的地方,修改入其他的值
  2. 找到需要修改的地方的push,把push后面的地址改为刚才修改过的地址

修改的作用:跳过程序中某些过程

修改跳转

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main() {
int nNum = 0;
scanf("%d", &nNum);
if (nNum == 87998623) {
printf("success!");
}
else {
printf("failed!");
}
system("pause");
return 0;
}

目的是输出success

先在ollydbg里找到main函数

image-20200516212446200

找到关键跳转,双击,汇编,改成我们要去的地址

image-20200516215952286

然后我随便输入个啥,都能输出success啦

image-20200516224835553

把对比对象的值改掉也行,方法不唯一

滑板指令

使用nop(没有作用的指令)把跳转改掉

还是刚才那个程序,修改结果如下:

image-20200516230516330

执行完,打印出success!这里就不放图了