upx手动脱壳

感谢霍爷教我upx脱壳

第一步设置入口处断点,只保留入口处断点

1

调试–>运行 ,达到pushad

2

在堆栈区下断点

3

F9运行到popad

4

看到循环F4跳过

5

接着看到一大部分寄存器初始化

6

F7单步进入

7

达到入口

8

用syclla

9

先点击转储,出现一个dump.exe在用IAT两次确定后获取导入,最后修复转储是选择刚刚的dump.exe就可以得到dump_SCY.exe,用IDA打开

10

成功脱壳。

变异upx

这个是0xGame2025的一个upx,用工具根本脱不了,手托也好难。

这里记录一下

首先这个是个elf文件只能到kali上动调,而且这里还有个细节问题,

11

e_type字段的可能值:
0x01 = ET_REL - 可重定位文件
0x02 = ET_EXEC - 可执行文件
0x03 = ET_DYN - 共享目标文件
0x04 = ET_CORE - 核心转储文件

我们这里03会导致远程连接出现问题要共享库的参数之类的,所以行不通,要把03改成02,但是放在虚拟记得文件不能改,只要改放如IDA的附件,不然也会出错。

11

11

flag长度是56

运行debug

11

用脚本dump

在IDA内运行

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# -*- coding: utf-8 -*-

from ida_bytes import get_bytes
from ida_kernwin import ask_addr, ask_file, warning, info
import ida_segment

def dump_memory_to_file():
"""
从IDA数据库中dump指定范围的内存到文件中。
"""
# 1. 获取要dump的内存范围
# 尝试获取当前光标所在的段作为默认范围
current_ea = get_screen_ea()
current_seg = ida_segment.getseg(current_ea)

default_start = current_seg.start_ea if current_seg else 0
default_end = current_seg.end_ea if current_seg else 0x10000

start_addr = ask_addr(default_start, "请输入起始地址 (start address):")
if start_addr is None:
info("操作已取消。")
return

end_addr = ask_addr(default_end, "请输入结束地址 (end address):")
if end_addr is None:
info("操作已取消。")
return

# 2. 地址合法性校验
if start_addr >= end_addr:
warning(f"起始地址 ${start_addr:x}$ 不能大于或等于结束地址 ${end_addr:x}$。")
return

size = end_addr - start_addr
print(f"准备从 ${start_addr:x}$ dump 到 ${end_addr:x}$ (大小: {size} 字节)...")

# 3. 获取内存内容
try:
content = get_bytes(start_addr, size)
if not content:
warning(f"无法从地址范围 ${start_addr:x}$ - ${end_addr:x}$ 读取到有效数据。")
return
except Exception as e:
warning(f"使用 get_bytes 时发生错误: {e}")
return

# 4. 获取保存路径
# 建议默认文件名,并允许用户修改
default_filename = f"dump_{start_addr:x}_{end_addr:x}.bin"
save_path = ask_file(1, default_filename, "请选择保存路径和文件名")

if not save_path:
info("操作已取消。")
return

# 5. 写入文件 (使用 with 语句)
try:
with open(save_path, "wb") as f:
f.write(content)
info(f"成功将 {len(content)} 字节的数据写入到:\n{save_path}")
except IOError as e:
warning(f"写入文件时发生错误: {e}")

# --- 执行脚本 ---
if __name__ == "__main__":
dump_memory_to_file()

11