您的位置:首页 > 教育 > 培训 > 淄博网站建设详细策划_员工微信管理系统_网络推广项目计划书_今日热搜榜排名

淄博网站建设详细策划_员工微信管理系统_网络推广项目计划书_今日热搜榜排名

2025/3/14 1:55:56 来源:https://blog.csdn.net/weixin_59166557/article/details/143344240  浏览:    关键词:淄博网站建设详细策划_员工微信管理系统_网络推广项目计划书_今日热搜榜排名
淄博网站建设详细策划_员工微信管理系统_网络推广项目计划书_今日热搜榜排名

UPX

UPX(Ultimate Packer for Executables) 并不是一种加密工具,而是一种可执行文件压缩工具。它的工作原理类似于文件压缩,但通过特定技术使压缩后的文件能够直接运行,并在运行时解压缩数据。在某些情况下,UPX的压缩方法对代码和数据进行了“伪加密”处理,这可能让逆向工程变得更复杂,因此被视为一种“轻度的加密”或“混淆”形式。

UPX的“加密”原理详解

在可执行文件的压缩和解压过程中,UPX的操作步骤如下:

1. 压缩阶段(打包)
  • UPX会将目标可执行文件的可执行代码段和数据段读取,并对这些内容进行压缩处理。压缩使用了高度优化的算法(例如LZ77),通过在代码段和数据段中查找重复的内容来实现高度的压缩率。
  • 在生成的压缩文件中,UPX还嵌入了一个解压缩代码(也称为解压缩stub),它负责在程序启动时解压缩数据。
  • 压缩后,这些段数据在文件中存储为一种二进制压缩形式,这意味着从外部直接读取该文件时,代码和数据已经不是原始形式,增加了对逆向分析的难度。
2. 伪加密效果
  • UPX的压缩过程虽然主要是为了减小文件体积,但其压缩后的数据在表面上看起来是一种“加密数据”,因为二进制数据已被编码为压缩格式。
  • 由于传统逆向分析工具通常识别标准的PE(Portable Executable)或ELF文件格式,对于UPX压缩后的文件,逆向工程人员可能需要首先手动或自动解压缩文件,才能获得可分析的原始代码。
  • 这种被压缩后的二进制数据在某种程度上形成了一种伪加密效果,让解压缩前的可执行代码变得不可读。
3. 解压缩阶段(运行时解压)
  • UPX在压缩后的文件中包含了解压缩代码,这段代码在程序加载到内存后优先执行。
  • 该解压缩代码首先负责将被压缩的代码段和数据段解码为原始内容,并将其放入适当的内存位置。
  • 解压完成后,程序的执行会跳转到原始入口点,让程序继续按原样执行。

UPX的解压过程直接在内存中进行,不需要写入磁盘文件,因此不会影响执行效率。这种方式也避免了产生临时文件。

怎么让脱壳的内存运行起来?

让脱壳后的内存能够正确运行,需要执行一系列操作,以确保被解压的代码和数据在内存中的布局、修复和执行过程完全恢复到原始状态。以下是详细的步骤:

1. 定位脱壳后内存的起始地址

  • 在使用工具(如x64dbg)进行动态调试时,当程序运行到UPX的解压缩代码部分时,设置一个内存断点来捕捉解压完成的瞬间。
  • 这个内存断点通常设置在解压后的入口点(OEP,Original Entry Point)处,确保能够在程序跳转到原始代码段前捕获到正确的内存状态。

2. 提取脱壳后的内存镜像

  • 在内存断点处,可以使用调试器的内存转储功能(Memory Dump)将解压后的完整内存镜像导出为一个新的可执行文件。
  • 导出内存时,需要确保所有重要的段(如代码段、数据段等)都包含在导出的文件中。

3. 修复导出的内存镜像

脱壳后的内存镜像还需要修复一些关键部分才能运行:

  • 修复PE头或ELF头:导出的内存镜像可能缺少完整的PE头或ELF头,需要使用工具(如LordPE、PE-bear等)手动修复头部信息,确保它是一个有效的可执行文件。
  • 修复IAT(导入地址表)
    • UPX在解压缩过程中,可能会保留原始的导入表,但也有可能对其进行压缩或重新定位。
    • 需要通过手动或自动工具(如Scylla)修复导入表,以确保所有API调用能够正确解析和调用。
  • 修复重定位表:如果程序启用了重定位表,则需要确保重定位信息被正确恢复,避免程序在加载时发生地址冲突。

4. 调整入口点(OEP)

  • 脱壳后的入口点(OEP)需要重新设置为原始程序的入口点。
  • 可以在调试器中找到OEP,然后将导出的PE文件的入口点修复为该地址,以确保程序在加载后能够从正确的地址开始执行。

5. 检查代码和数据的完整性

  • 验证解压后的代码段是否可以正常执行,数据段是否完整且无误。
  • 可以通过手动测试和分析解压后代码的执行路径,确保所有指令和数据能够正确运行。

6. 重生成新的可执行文件

  • 完成修复和调整后,可以使用工具(如PE Editor、Scylla)将修复后的内存镜像保存为新的可执行文件。
  • 确保新的可执行文件具有完整的PE头/ELF头、导入表、重定位表和正确的入口点。

7. 测试运行脱壳后的文件

  • 运行生成的新可执行文件,观察程序是否能够正常启动和执行。
  • 需要特别注意测试中可能出现的异常、崩溃或错误,并根据需要进行进一步修复。

实战!NewStarCTF 公开赛赛道 Likemyasp

在ida中打开,我们直接从汇编角度理解

看一眼段

Name	Start	End	R	W	X	D	L	Align	Base	Type	Class	AD	es	ss	ds	fs	gs
ASP0	0000000140001000	0000000140008000	R	W	X	.	L	para	0001	public	CODE	64	0000	0000	0001	FFFFFFFFFFFFFFFF	FFFFFFFFFFFFFFFF
ASP1	0000000140008000	000000014000A000	R	W	X	.	L	para	0002	public	CODE	64	0000	0000	0001	FFFFFFFFFFFFFFFF	FFFFFFFFFFFFFFFF

非常简洁,来看看段1

ASP1:0000000140008000 ASP1            segment para public 'CODE' use64
ASP1:0000000140008000                 assume cs:ASP1
ASP1:0000000140008000                 ;org 140008000h
ASP1:0000000140008000                 assume es:nothing, ss:nothing, ds:ASP0, fs:nothing, gs:nothing
ASP1:0000000140008000
ASP1:0000000140008000 loc_140008000:                          ; DATA XREF: start+4↓o
ASP1:0000000140008000                 and     [rbp-70h], bl
ASP1:0000000140008003                 dec     dword ptr [rax-73h]
ASP1:0000000140008006                 add     eax, 3659h
ASP1:000000014000800B                 retn
ASP1:000000014000800B ; ---------------------------------------------------------------------------
ASP1:000000014000800C                 db 0CCh
ASP1:000000014000800D                 db 0Fh, 41h, 0DFh
ASP1:0000000140008010                 dq 20244C894C7F6FFDh, 2454894818244404h, 38EC8348080E4810h
ASP1:0000000140008028                 dq 0FFC3E8EDDBB175h, 50092148580D8B48h, 48482604ADE5B7EDh
ASP1:0000000140008040                 dq 211915FF0804408Bh, 38C42A6EC97B3747h, 0B162E7774A40004Bh
ASP1:0000000140008058                 dq 2F2F7905364F5E54h, 1748C433775ADBFBh, 1B9280958048630h
ASP1:0000000140008070                 dq 0D44C006DCAFF7C15h, 5062C03345286420h, 1C1AE8C8BBAE6DCEh
ASP1:0000000140008088                 dq 0F6EEDD2628C74023h, 0CC333F94208000BAh, 0CA375A487F4C031Dh
ASP1:00000001400080A0                 dq 9032E43A0C4BCF26h, 203AC8D601C8B0EDh, 852EA9CFB644E403h

这是一堆数据,我们可以直接在这下执行断点,但是先不着急,看看start(通过流程图找到开头结尾)

ASP1:0000000140009180 ; __int64 __fastcall start(__int64, __int64)
ASP1:0000000140009180                 public start
ASP1:0000000140009180 start           proc near
ASP1:0000000140009180                 push    rbx
ASP1:0000000140009181                 push    rsi
ASP1:0000000140009182                 push    rdi
ASP1:0000000140009183                 push    rbp

开头建栈,结尾退栈加跳转

ASP1:00000001400093AC                 pop     rbp
ASP1:00000001400093AD                 pop     rdi
ASP1:00000001400093AE                 pop     rsi
ASP1:00000001400093AF                 pop     rbx
ASP1:00000001400093B0                 lea     rax, [rsp-30h+var_50]
ASP1:00000001400093B5
ASP1:00000001400093B5 loc_1400093B5:                          ; CODE XREF: sub_1400091F0+1CA↓j
ASP1:00000001400093B5                 push    0
ASP1:00000001400093B7                 cmp     rsp, rax
ASP1:00000001400093BA                 jnz     short loc_1400093B5
ASP1:00000001400093BC                 sub     rsp, 0FFFFFFFFFFFFFF80h
ASP1:00000001400093C0                 jmp     near ptr dword_1400015D4
ASP1:00000001400093C0 sub_1400091F0   endp ; sp-analysis failed

直接在jmp这里下断点,运行,看看他跳转到了哪里

ASP0:00007FF7F34D15D4 sub_7FF7F34D15D4 proc near              ; CODE XREF: sub_7FF7F34D91F0+1D0↓j
ASP0:00007FF7F34D15D4                 sub     rsp, 28h
ASP0:00007FF7F34D15D8                 call    sub_7FF7F34D19B4
ASP0:00007FF7F34D15DD                 add     rsp, 28h
ASP0:00007FF7F34D15E1                 jmp     near ptr qword_7FF7F34D1000+458h

尝试直接dump此处内存并修复,在ida打开,发现恢复出了main

int __fastcall main(int argc, const char **argv, const char **envp)
{__int64 *v3; // rdx__int64 v4; // r8int i; // [rsp+20h] [rbp-158h]int j; // [rsp+28h] [rbp-150h]_QWORD v8[30]; // [rsp+50h] [rbp-128h]_BYTE v9[32]; // [rsp+140h] [rbp-38h] BYREFsub_7FF7F34D1070(qword_7FF7F34D3240, argv, envp);sub_7FF7F34D1140(&qword_7FF7F34D3250, v9, 30LL);for ( i = 0; i < 24; i += 4 ){v3 = (__int64 *)((i >> 31) & 3);v8[i / 4] = (unsigned __int8)~v9[i + 3] | (((char)v9[i + 2] ^ 0x1ELL) << 14) | (((char)v9[i + 1] ^ 0x14LL) << 23) | (((char)v9[i] ^ 0xALL) << 37);}for ( j = 0; j < 6; ++j ){v3 = qword_7FF7F34D4038;if ( v8[j] != qword_7FF7F34D4038[j] ){sub_7FF7F34D1070(qword_7FF7F34D3258, qword_7FF7F34D4038, v4);return 0;}}sub_7FF7F34D1070(qword_7FF7F34D3268, v3, v4);return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com