感谢霍爷教我upx脱壳
第一步设置入口处断点,只保留入口处断点

调试–>运行 ,达到pushad

在堆栈区下断点

F9运行到popad

看到循环F4跳过

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

F7单步进入

达到入口

用syclla

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

成功脱壳。
变异upx
这个是0xGame2025的一个upx,用工具根本脱不了,手托也好难。
这里记录一下
首先这个是个elf文件只能到kali上动调,而且这里还有个细节问题,

e_type字段的可能值:
0x01 = ET_REL - 可重定位文件
0x02 = ET_EXEC - 可执行文件
0x03 = ET_DYN - 共享目标文件
0x04 = ET_CORE - 核心转储文件
我们这里03会导致远程连接出现问题要共享库的参数之类的,所以行不通,要把03改成02,但是放在虚拟记得文件不能改,只要改放如IDA的附件,不然也会出错。


flag长度是56
运行debug

用脚本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
|
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指定范围的内存到文件中。 """ 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
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} 字节)...")
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
default_filename = f"dump_{start_addr:x}_{end_addr:x}.bin" save_path = ask_file(1, default_filename, "请选择保存路径和文件名")
if not save_path: info("操作已取消。") return
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()
|
