UPX加壳:

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

压缩后FILE size明显变小

image-20240313131357499

image-20240313131914264

image-20240313200435441

查壳,发现已经加上了壳、

过了一些查杀,

image-20240313132033359

自动脱壳方法(一般不灵)

1
upx -d /path/to/file

手动脱壳

用ada打开,发现加壳后发生了很大变化

image-20240313133646334

找到OPE(原始程序入口地址)

设置硬件断点(不会修改原有代码)hardwware

c++程序的OEP特征

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
00408027 >/$  55             push ebp

00408028 |. 8BEC mov ebp,esp

0040802A |. 6A FF push -0x1

0040802C |. 68 F0F14000 push C++.0040F1F0

00408031 |. 68 84AF4000 push C++.0040AF84 ; SE 处理程序安装

00408036 |. 64:A1 00000000 mov eax,dword ptr fs:[0]

0040803C |. 50 push eax

0040803D |. 64:8925 000000>mov dword ptr fs:[0],esp

00408044 |. 83EC 58 sub esp,0x58

00408047 |. 53 push ebx

00408048 |. 56 push esi

00408049 |. 57 push edi ; ntdll.7C930228

0040804A |. 8965 E8 mov [local.6],esp

0040804D |. FF15 E4F04000 call dword ptr ds:[<&KERNEL32.GetVersion>; kernel32.GetVersion

00408053 |. 33D2 xor edx,edx ; ntdll.KiFastSystemCallRet

00408055 |. 8AD4 mov dl,ah

00408057 |. 8915 D06B4100 mov dword ptr ds:[0x416BD0],edx ; ntdll.KiFastSystemCallRet

0040805D |. 8BC8 mov ecx,eax

0040805F |. 81E1 FF000000 and ecx,0xFF

00408065 |. 890D CC6B4100 mov dword ptr ds:[0x416BCC],ecx

0040806B |. C1E1 08 shl ecx,0x8

有点奇怪,dump出来是kernel的dll

image-20240313211616996

单步跟踪法

平衡堆栈法

一般可以通过判断ESP,在pop ESP后一般会出现程序的入口点。

ESP 堆栈指针(Stack Point)寄存器 只做堆栈的栈顶指针; 不能用于算术运算与数据传

汇编指令复习

指令 名称 示例 备注
MOV 传送指令 MOV dest, src 将数据从src移动到dest
PUSH 进栈指令 PUSH src 把源操作数src压入堆栈
POP 出栈指令 POP desc 从栈顶弹出字数据到dest
指令 名称 示例 备注
JNE 条件转移指令 zf =0 时跳转到标号为label的位置
JMP 无条件转移指令 JMP lable 无条件地转移到标号为label的位置
CALL 过程调用指令 CALL labal 直接调用label
JE 条件转移指令 JE lable zf =1 时跳转到标号为label的位置

内存镜像法

alt+m 看内存信息 UPX2处F2下断点,F9运行

image-20240313214147894

出现下图所示,根据OPE特征判断jmp artifact。。。处为程序入口点

image-20240313214536442

使用Scylla插件脱壳

image-20240313214917067

成功

秒到ope

直接CTRL+F,输入popad //在这里不行

]]