首页 > 其他分享 >Reverse花指令及反混淆

Reverse花指令及反混淆

时间:2024-12-10 20:53:30浏览次数:2  
标签:混淆 Reverse jz 指令 byte emit asm 字节

花指令及反混淆

1.花指令

  花指令是反调试的一种基本的方法。其存在是干扰选手静态分析,但不会影响程序的运行。实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中,花指令被作为一种手段来增加静态分析的难度。IDA并不能正常识别花指令,导致可看可分析代码被破坏,因此需要我们自己去分析一下。花指令主要分为两类:可执行花指令和不可执行花指令。

  • 可执行花指令:花指令在程序正常运行的时候被执行,但不会影响程序正常运行
  • 不可执行花指令:花指令在程序正常运行的时候不会被执行

常见混淆的字节码:

机器码 汇编语言
9A CALL immed32
E8 CALL immed16
E9 JMP immed16
EB JMP immed8

2.常见花指令分析

(1)单字节

#include <stdio.h>
int main()
{
    __asm {
        jz start; //jz 和 jnz 同时出现,导致永恒跳转
        jnz start;
        _emit 0xE8; //这个地方就是故意插入的花指令 CALL + 地址
    }
start:
    printf("ok!");
    return 0;
}





例如:[NSSRound#3 Team]jump_by_jump

发现main函数编译不了 向下观察发现花指令

去除花指令 按D快捷键 先将call 转成硬编码 E8

再将光标放到 db 0E8上 将E8改成 nop(90) 再次按C键 点yes 将硬编码修复成代码

然后向下逐⼀修复 将光标放置在⻩⾊⾏上 按C修复 直到没有⻩⾊地址

将光标放置到函数开始的位置按 P键⽣成函数 最后tab转成伪代码



(2)永恒跳转

int main()
{
    __asm {
    xor eax, eax;// eax ^ eax = 0 
    jz s; // 必然成立跳转,一定会跳转
    _emit 0x11; //填充垃圾指令 byte类型
    _emit 0x22; //填充垃圾指令 byte类型
    _emit 0x33; //填充垃圾指令 byte类型
    s:
    }
	printf("test \n");
}

(3)更改ESP

int main()
{
    __asm {
        xor eax, eax;
        jz s;
        add esp, 0x11; // IDA 会把此指令识别对函数堆栈进行操作,导致识别函数失败
    s:
    }
    printf("test \n");
}

(4)jmp跳转插入无效垃圾指令

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    _asm {
    
        jmp $+5
        _emit 0x71
        _emit 2
        _emit 0xE9
        _emit 0xED
   }
 lable:
    printf("ok2");

    return 0;
}

(5)嵌套永恒跳转

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    _asm {
        jz Label3;
        jnz Label3;
        _emit 0xE8;
    }
Label2:
    _asm {
        jz Label4;
        jnz Label4;
        _emit 0xE8;
    }


Label3:
    _asm {
        jz Label1;
        jnz Label1;
        _emit 0xE9;
    }
Label1:
    _asm {
        jz Label2;
        jnz Label2;
        _emit 0xE9;
    }
Label4:
    printf("ok2");

    return 0;
}





3.反混淆

方法一:手动恢复

适用条件:混淆少且类型单一
  为了尽快解除题目,我们一般选择先手动去除混淆,迅速拿到flag
这里需要掌握IDA的基本快捷键:U、C、P

  1. U: 在IDA Pro中,按“U”重新定义汇编,转换为字节码格式
  2. C: 在IDA Pro中按“C”,转换字节码为汇编形式
  3. P: 在IDA Pro中,按“P” 转换汇编语言为高级语言函数视图

方法二:IDA-Python脚本恢复

适用条件:混淆大量,手工基本不可去除
  需要拿到混淆的字节码组成,利用脚本去除大量混淆。

例如:[GFCTF 2021]wordy

出现大量机器码为EBFF的花指令,如果手动nop很费,所以这里用idapython

import idc
import ida_bytes

start_add=0x1144
end_add=0x3100
for address in range(start_add, end_add):
  new_byte = ida_bytes.get_byte(address)
  next = ida_bytes.get_byte(address + 1)
  nnext = ida_bytes.get_byte(address + 2)
  if new_byte == 0xeb and next == 0xff and nnext == 0xc0:  
    ida_bytes.patch_byte(address, 0x90)

  首先循环遍历从 0x11440x3100 的地址。在每个地址处,检查当前字节是否是 0xeb,下一个字节是否是 0xff,再下一个字节是否是 0xc0。如果匹配到 0xeb 0xff 0xc0 这个字节序列,就将当前地址处的字节 0xeb 修改为 0x900x90 在汇编语言中是 NOP 指令,表示“无操作”,即这个指令不会对程序执行产生影响。

标签:混淆,Reverse,jz,指令,byte,emit,asm,字节
From: https://www.cnblogs.com/PaperPlaneFly/p/18598009/Flower_Instructions_and_Anti_Confusion

相关文章

  • 一些常用的 Windows 指令
    win系统激活   跳过win11联网按键:Shift+F10指令:oobe\bypassnro  删除计算机中显示的7个文件夹,复制,另存为.regWindowsRegistryEditorVersion5.00;恢复我的电脑/此电脑里面的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyC......
  • 代码瘦身与防护:JavaScript 打包中的代码混淆和代码压缩
    前言在前端开发中,JavaScript是构建动态和交互式网页应用的核心技术。然而,随之而来的代码体积和安全性挑战也不容忽视。代码混淆和代码压缩作为两种主要的解决方案,通过不同的手段提高了代码的安全性和执行效率。本文将深入探讨JavaScript打包过程中如何实现代码混淆和代......
  • window 服务相关指令
    1.安装服务sccreateServiceR binPath="%~dp0Service.exe"start=autoDisplayName="DisPlay ServiceName"scdescription ServiceR"ServiceDes"pause 解释【以下图为例】:ServiceR(服务名称),Service.exe(要安装成服务的exe应用程序的名字,注意:这个bat文件需要和该exe在同......
  • CPU的指令周期
    本文分享自天翼云开发者社区《CPU的指令周期》,作者:冯****怡指令周期(InstructionCycle)CPU中会有存器、指令寄存器、控制器等多类单元。指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。如果......
  • 【Linux探索学习】第三弹——Linux的基础指令
    前言:在前面我们已经讲了有十几个Linux的基础指令及相关的知识了,今天我们再补充几个重点的基础指令,给基础指令收个尾,为下面的内容做准备目录一、date指令时间显示设定时间时间戳二、cal指令三、find指令find指令which指令whereis指令四、grep指令五、zip/unzip指......
  • HECTF网络安全挑战赛个人题解,主Reverse部分
    ReverseezAndroid比较难的一个题。java层用rc4解出一张图片知道flag的格式so层注册了d0func和stringFromJNI两个函数其中d0func给两个全局变量赋了值,还有两个小函数也对这两个变量进行了操作,交叉引用全部找出来即可解密得到1vxyzmissonD1key和go1denG08aTJYcxk在stringFro......
  • RTL:指令的处理
    在RTL里,由于我将指令的分析与处理拆成了两个单元,所以指令的拆解也被分到了两个元件。由于指令的opcode部分没有重叠,所以我直接在组合逻辑里用case来区分指令opcode,在内部再根据funct3funct7等值进行区分。nemu里的指令分析用到了正则匹配,但在这里我们不需要考虑。always(*)beg......
  • Chromium CDP 开发(六):注册自己的指令(下)
    引言在这一章节中,我们将详细讲解如何将新定义的TimerSend指令和TimerLog事件添加到项目的inspector_protocol_config.json文件中,从而使这些功能能够在CDP(ChromeDevToolsProtocol)中被识别并正常使用。inspector_protocol_config.json是CDP的核心配置文件之一,......
  • Linux -初识 与基础指令2
    博客主页:【夜泉_ly】本文专栏:【Linux】欢迎点赞......
  • 【嵌入式】-VMware-Ubuntu-Linux- 基础指令 | 使用工具安装 | 常见问题
    ### 本篇博客主要记录我在学习过程中用到的比较好的工具以及遇到的一些问题及解决办法。###   目录一、常用Shell命令及快捷键##shell命令##文件操作快捷键二、VIM编辑器三、OpenVMTools安装(1)更新软件包列表(2)安装open-vm-tools-desktop(3)安装必要的依赖项......