直接写吧

-函数!strcmp()返回值才为1
-逆向分析倒着来,flag往往是通过一系列加密等方式得来,从后向前分析可以防止头脑爆炸ಠ_ರೃ。一定要注意加密解密之间的关系,不要加密再加密>ᯅ<
-memcpy()函数用于:复制内存块

C连续定义变量分配

  • 基本类型变量:int(4字节)、char(1字节)、double(8字节)、float(4字节)连续定义变量分配后,先定义的变量在高位,后定义的变量在低位。
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
int a;
int b;
int c;
printf("address: %p\n",&a);
printf("address: %p\n",&b);
printf("address: %p\n",&c);
//%p按十六进制输出,可以用于打印地址
return 0;
}

这是运行代码

  • 数组:a[0]地址比a[1]地址低,与基本类型相反
    先定义的数组地址比后定义的数组地址高
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
char a[2];
char b[2];
char c[2];
printf("address: %p\n",&a);
printf("address: %p\n",&b);
printf("address: %p\n",&c);
//%p按十六进制输出,可以用于打印地址
return 0;
}

这是运行代码
修改一下

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(){
char a[2];
char b[2];
printf("address: %p\n",&a[0]);
printf("address: %p\n",&b[2]);
//%p按十六进制输出,可以用于打印地址
return 0;
}

这是运行代码,a[0]和b[2]地址相同
可见,连续定义数组的内存分配是连续的,且先定义的数组地址比后定义的数组地址高。

工具

jd-gui:Java 反编译工具

jadx-gui:Android反编译gui工具

upx: 脱壳工具使用方法

- 1.打开upx脱壳工具  
     upx.exe(upx应用层程序名) -h
-2.一大串字符…(⊙_⊙;)…  
-3.输入脱壳指令
      upx-d (文件位置)    -tips:要加入后缀名

exeinfo PE:程序检查器 (ida未动,exeinfo PE先行)

手动脱壳(OD)

1
2
3
4
5
6
7
8
关键汇编指令(pushad,popad)
一、单步跟踪法
F8(单步步过),向下跳转可以实现,向上跳转不能实现(F4跳到下一汇编代码)
二、ESP定律法(平衡堆栈法)
在数据窗口跟随——>设置硬件访问断点(word,dword)——>F9——>删除硬件断点——>单步跟踪法找到入口OEP
三、二次内存镜像法
alt+M查看内存
四、一步直达法

最后一步:鼠标右键——>用OllyDump脱壳调试进程——>脱壳

x64/x32 dbg (快捷键)

F8 单步步过 F4跳到光标处 F9运行到断点处

脱壳三步法

不管是哪种脱壳方法,都需要遵循脱壳三步法,脱壳三步法分为以下三步:

① 寻找原始OEP

这一步骤的主要作用就是要确定原始程序代码到底在哪里,能找到原始程序的代码,说明壳代码执行完了,我们只有找到原始OEP才能进行下一步的动作。

② dump内存到文件

当我们找到原始OEP,调试运行到原始OEP时,只要代码被还原,我们就可以在这个地方进行dump内存,将内存中被还原的代码和数据抓取下来,重新保存成一个文件,这样脱完壳时,我们就可以用静态分析工具分析程序了。

③ 修复文件

这一步主要就是修复IAT,对从内存中转储到本地的文件进行修复。

使用x64dbg脱壳之开源壳upx - 知乎 (zhihu.com)