花指令基础

news2024/11/16 4:47:52

花指令基础

偶尔更新。。。

默认会一点cpp和汇编。

文章目录

  • 花指令基础
    • 1. 简介
    • 2. 常见类型
      • 1. jx+jnx
      • 2. call+add [esp]+ret
    • 3. 等价解析
      • 1. push pop
      • 2. jmp call retn
      • 3. enter leave
      • 4. and
    • MoeCTF 2022 chicken_soup
    • 参考

1. 简介

花指令可以误导反汇编,但不影响程序正常执行(运行时花指令位于不可执行的代码路径)。

反汇编算法主要可以分为两类:递归下降算法和线性扫描算法。

线性扫描算法扫描整个数据段,对每条指令进行反汇编,无法区分数据与代码,导致代码段的数据误解释为指令。

递归下降法强调控制流的概念,控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编,遇到非控制转移指令时顺序进行反汇编,而遇到控制转移指令时则从转移地址处开始进行反汇编。

call机器码0E8h

nop机器码90h

retn先进行esp加n操作,而ret没有此项操作

先来个简单例子

visual studio 2022编译一下,exe用ida打开

#include<iostream>
using namespace std;
int main() {
    int x;
    _asm {//vc内联汇编插入花指令
        jz label;
        jnz label;
        _emit 0xE8;//立即数_emit:表示在这插入一个数据
    label:
    }
    cin>>x;
    cout<<x;
    system("pause");
    return 0;
}

main函数一个明显的JUMPOUT,应当是有花指令

在这里插入图片描述

在这里插入图片描述

按U,然后把E8 patch成90 ,再按C转成code

在这里插入图片描述

在开头按p,再按F5,反汇编成功

在这里插入图片描述

2. 常见类型

1. jx+jnx

jnz和jz的互补跳转

_asm{
    jz Label;
    jnz Label;
    _emit 0xC7;//这行patch成90,然后按C
    Label:
}

跳转指令构造花指令

 __asm {
         push ebx;
         xor ebx, ebx;
         test ebx, ebx;//zf为1,执行jz
         jnz LABEL7;
         jz    LABEL8;//永真条件跳转
     LABEL7:
         _emit 0xC7;//显示为db,影响反汇编(p和F5失效)
     		//上面这行patch成90,然后按C
     LABEL8:
         pop ebx;
     }

2. call+add [esp]+ret

call与ret构造花指令

__asm {
         call LABEL9;//下一条"指令" db 0x83地址压栈
         _emit 0x83;
     LABEL9:
         add dword ptr ss : [esp] , 8;//这行改了esp指向的栈顶数据
    		//003D186A+8=003D1872
         ret;//但是ret从栈顶拿出数据给eip,所以能正常到mov esi,esp处运行
         __emit 0xF3;
     }

在这里插入图片描述

如下图,在爆红那一行按U,把83h patch掉,
在这里插入图片描述

然后看 0F3,8B,0F4 ->rep mov esi, esp,前面没有操作ecx寄存器,估计F3是花指令,patch掉。
在这里插入图片描述

然后成功报错,Options-General-Disassembly-Stack pointer,打开堆栈指针,没看出什么东西

把36h到C3h那一段全nop掉就行,然后在main开头按U,C,P,F5。

3. 等价解析

1. push pop

push 0x1111
在x86等价于
sub esp,0x4;
mov [esp],0x11111;

pop eax;
在x86程序里面就等价于
mov eax,[esp];
add esp,0x4;
//可以用多个pop代替add esp,0x4

2. jmp call retn

jmp addr
相当于
mov eip,addr

call addr
相当于
push next opcodeAddr; 一般4字节
jmp addr

call 0h
16进制为:E8 00 00 00 00
用于获取下一行地址,也可获取EIP的值

retn 0x5;
相当于
mov eip,[esp]
add esp,0x4+0x5

3. enter leave

enter 8,0
相当于
push ebp;
mov ebp,esp;
sub esp,8;

leave
相当于
mov esp, ebp;
pop ebp;

4. and

常用来栈对齐

16位对齐
and esp,0xfffffff0

MoeCTF 2022 chicken_soup

ida打开,找到main函数

在这里插入图片描述

loc_401000和loc_401080加了花指令,两处E9改成90

unsigned int __cdecl sub_401000(const char *a1)
{
  unsigned int result; // eax
  unsigned int i; // [esp+18h] [ebp-8h]

  for ( i = 0; ; ++i )
  {
    result = strlen(a1) - 1;
    if ( i >= result )
      break;
    a1[i] += a1[i + 1];
  }
  return result;
}
unsigned int __cdecl sub_401080(const char *a1)
{
  unsigned int result; // eax
  unsigned int i; // [esp+18h] [ebp-8h]

  for ( i = 0; ; ++i )
  {
    result = i;
    if ( i >= strlen(a1) )
      break;
    a1[i] = (16 * a1[i]) | ((int)(unsigned __int8)a1[i] >> 4);
  }
  return result;
}

sub_401110是个字符串比较函数

易得

c=[0xCD, 0x4D, 0x8C, 0x7D, 0xAD, 0x1E, 0xBE, 0x4A, 0x8A, 0x7D, 0xBC, 0x7C, 0xFC, 0x2E, 0x2A, 0x79, 0x9D, 0x6A, 0x1A, 0xCC, 0x3D, 0x4A, 0xF8, 0x3C, 0x79, 0x69, 0x39, 0xD9, 0xDD, 0x9D, 0xA9, 0x69, 0x4C, 0x8C, 0xDD, 0x59, 0xE9, 0xD7]
for i in range(len(c)):
    c[i] = (  c[i]//16) | (c[i] << 4)&0xFF;#实际是交换高4位与低4位
for i in range(len(c)-2,-1,-1):
    c[i]-=c[i+1]
print(bytes(c))
#moectf{p4tch_pr0gr4m_t0_d3c0mpi1e_it!}

参考

  1. CTF逆向Reverse 花指令介绍 and NSSCTF靶场入门题目复现 znonono

  2. 逆向专辑–花指令阅读与分析 ZhaoWu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993701.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的物流管理系统(带1w+文档)

基于SpringBootVue的物流管理系统(带1w文档) 基于SpringBootVue的物流管理系统(带1w文档) 本课题研究和开发物流管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高物流管理系统信息处理速度&#xff0c;规范物流管理系统信息处理流程…

Vue - 关于v-wave 波浪动画组件

Vue - 关于v-wave 波浪动画组件 这个动画库可以在标签中添加新的v-wave属性&#xff0c;来让点击标签元素后添加漂亮的波纹效果&#xff0c;并且可以根据父元素自动形成波纹的颜色&#xff0c;也可以自定义波纹颜色&#xff0c;持续时间&#xff0c;透明度&#xff0c;触发的对…

JavaScript骚操作媒体查询攻略

背景 一讲到媒体查询&#xff0c;大家首先想到的可能都是都是CSS中media,这也没错&#xff0c;这确实是最常见的媒体查询方式&#xff0c;但是我们今天要讲的不是它&#xff0c;而是大家很少接触到的window.matchMedia()和window.resize 最近在做项目的时候拿到一个需求&…

MySQL笔记-基础篇(一):查询

博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;它基于结构化查询语言&#xff08;SQL&#xff09;来管理和操作数据。下面将依次探讨MySQL查询的各个方面&#xff0c;确保理解扎实&#xff0c;能够在实…

“阳光高考爬虫项目揭秘:增量爬虫与断点续抓的Python实战“

阳光高考项目 项目要求 爬取各大高校基本信息和招生简章&#xff08;招生简章要求存储为pdf格式并且入库&#xff09; 数据库表设计 idtask_urlstatus&#xff1a;0(未抓取)&#xff0c;1(抓取中)&#xff0c;2(抓取完毕)&#xff0c;3(错误)&#xff0c;4(更新中)&#xff…

C语言小练习(叁)

个人练习&#xff1a; 编程题&#xff1a; 1.编写一个函数&#xff0c;通过输入球的半径&#xff0c;返回球的体积&#xff1b; #include <stdio.h> #define pi 3.14 //计算球体积的函数 double v_ball(double r) {return 4.0 / 3.0 * pi * r * r * r; }int main() {d…

InfluxDB Studio 下载,时序数据库Windows图形界面操作

下载地址&#xff1a; https://github.com/CymaticLabs/InfluxDBStudio/releases解压缩后&#xff0c;双击 InfluxDBStudio.exe 运行。 参考 windows下 influxDB 操作工具 InfluxDBStudio 吐槽 现在 CSDN 太恶心了&#xff0c;动不动就让订阅或者积分下载资源。诚然&#…

【Python学习-UI界面】pyqt5页面布局

1、布局分类 序号类别描述1QBoxLayout可将小部件垂直或水平排列。它的派生类有QVBoxLayout&#xff08;用于垂直排列小部件&#xff09;和QHBoxLayout&#xff08;用于水平排列小部件&#xff09;。2QGridLayout对象呈现为行和列排列的单元格网格。该类包含addWidget()方法&am…

艾迈斯欧司朗推出突破性8通道915nm SMT脉冲激光器,开创激光雷达应用新时代

8通道915nm SMT脉冲激光器可增强自动驾驶汽车的远距离激光雷达系统&#xff1b;经过AEC-Q102认证的8通道QFN封装&#xff0c;具有高性能和高效率&#xff0c;采用艾迈斯欧司朗专有的波长稳定技术&#xff1b;基于20多年的脉冲激光器技术经验。 中国 上海&#xff0c;2024年8月8…

JAVA开发学习-day21

JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南&#xff0c;为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

那些你应该掌握的linux命令

一、路径授权 要给 a 用户 b 路径的所有操作权限,可以使用以下命令&#xff1a; sudo chown -R a:a /b sudo chmod -R 770 /b1.sudo chown -R a:a /b chown 命令用于更改文件或目录的所有者和所属组。-R 选项表示递归地应用于目录及其内部的所有文件和子目录。a:a 表示将所有…

24/8/8算法笔记 条件筛选决策树根节点

筛选决策树的根节点是建立决策树过程中的一个重要步骤&#xff0c;主要原因包括&#xff1a; 减少计算量&#xff1a;选择合适的根节点可以减少树的深度&#xff0c;从而减少模型训练和预测时的计算量。 提高模型性能&#xff1a;选择最佳分裂点可以最大化模型的性能&#xff…

更换低版本jdk8后的idea页面怎么换回来

一、问题阐述 一开始我的idea是下面的界面&#xff1a; 这个页面美观&#xff0c;简洁。后来因为工作需要&#xff0c;从jdk17切换到jdk8的时候&#xff0c;页面变了 这个没有前面的好看&#xff0c;怎么回事&#xff1f; 二、解决方案 1、file——setting 2、搜索ui——New UI…

全新博客X主题/简约WordPress主题模板/主题巴巴/免授权版源码+自适应设计

源码简介&#xff1a; 博客X这款超酷的Wordpress主题&#xff0c;是主题巴巴团队打造的设计杰作。想象一下&#xff0c;你的博客首页能展示那些炫酷的幻灯片置顶文章、还有各种精心策划的专题列表&#xff0c;这些内容模块的设计简直吸睛了&#xff0c;能让来访的用户眼前一亮…

JAVA集中学习第四周学习记录(三)

系列文章目录 第一章 JAVA集中学习第一周学习记录(一) 第二章 JAVA集中学习第一周项目实践 第三章 JAVA集中学习第一周学习记录(二) 第四章 JAVA集中学习第一周课后习题 第五章 JAVA集中学习第二周学习记录(一) 第六章 JAVA集中学习第二周项目实践 第七章 JAVA集中学习第二周学…

SSL VPN综合实验

一、实验目的及拓扑 实验目的&#xff1a;构建企业内网和企业分支站点&#xff0c;其中企业内网通过防火墙实现双机热备并且与企业分支固定站点实现站点到站点IPsec VPN互联&#xff0c;与企业分支移动站点实现SSL VPN互联&#xff0c;企业内网各主机可以实现对分支站点内网的…

可观测性(observability)

一、定义 wiki百科的定义 In software engineering, more specifically in distributed computing, observability is the ability to collect data about programs’ execution, modules’ internal states, and the communication among components.[1][2] To improve obser…

8月最新ChatGPT系统源码SparkAi系统,支持AI换脸+智能体GPTs应用+AI绘画+AI视频+文档分析

一、文章序言 人工智能技术正在快速发展&#xff0c;AI语言模型、AI绘画和AI视频已经在多个领域得到了广泛应用。这些技术不仅在科技创新方面表现出色&#xff0c;还在艺术创作、内容生产和商业应用中展示出巨大的潜力。 SparkAi创作系统是一款基于ChatGPT和Midjourney开发的…

矩阵乘法的结合律的证明

矩阵的乘法在矩阵运算中相较于加法更加复杂&#xff0c;对矩阵乘法的运算律的证明也更复杂&#xff0c;但其中对结合律的证明是最难的&#xff0c;因为它涉及到3个矩阵的相乘。本证明不同于其他一些比较粗浅的用方阵去证明或者用三个含很少元素的简单矩阵做一个例证&#xff0c…

App渗透测试(工具使用)

Python工具 在文件中打开终端&#xff0c;执行如下命令进行装库。 python3 -m pip install -r txt文件 执行如下命令扫描 python3 .py -i apk文件