BUUCTF-[RoarCTF2019]polyre

news2024/9/24 15:28:46

题目下载:下载

这道题目是一个关于控制流平坦化和虚假流程。

首先了解一下控制流平坦化:利用符号执行去除控制流平坦化 - 博客 - 腾讯安全应急响应中心https://www.cnblogs.com/zhwer/p/14081454.htmlbuuctf RoarCTF2019 polyre writeup - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

1.1控制流平坦化:

控制流平坦化(control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程 

 经过控制流平坦化后的执行流程就如下图

这样可以模糊基本块之间的前后关系,增加程序分析的难度

OLLVM 的控制流平坦化是一种常见的代码混淆方式,其基本原理是添加分发器来控制流程的执行。针对这种混淆方式的还原也有了许多研究和工具, 

简单来说,OLLVM会添加一个用于控制跳转的状态变量和分发器:当一个真实块执行完成后,会把状态变量的值进行更新,回到分发器进行检查,再根据状态变量的值跳转到下一个真实块执行;

如果原本的执行流程中存在条件跳转,则会在各条件下对状态变量设置不同的值,再回到分发器进行检查和跳转。

 知道了控制流平坦化的一些相关概念,做可以做题了。

查壳,无壳 (有的版本的查壳工具可以查出LLVM这个关键信息)载入IDA,找到主函数,看一下流程图,体会一下什么是控制流平坦化再看一下代码

发现是一堆while嵌套,发现真的很乱,真的是让代码之间关系混乱,经过查阅资料知道可以用deflat.py除去控制流平坦化。

下载deflat,百度网盘 请输入提取码 提取码u2g0

下载完后注意:deflat.py文件中的sys.path.append()后的地址是你下载的am_graph.py的地址,注意修改。

然后进行去除控制流平坦化操作:

python3 deflat.py attachment 0x400620   #python版本+脚本名+文件名+起始地址(main())

(注意在angr环境下运行)

如图

等待几分钟后就会出现下图

然后载入出现的attachment_recovered文件,看一下主函数流程图

 明显流程清晰很多,看一下主函数,发现有一堆while,do...while循环。并且变量在.bss区。

.bss区:存放未初始化的全局变量或者静态变量。值为0

所以可以进而判断这些循环只执行一次甚至不执行,所以可以把他们删去让代码更清晰。查阅资料发现都是用的官方wp的脚本,而在b站上看到了一个手动删除这些循环的方法。

反汇编窗口->右键->Synchronize with->Pseudocode-A,然后在伪代码中选中你要删除的,在返回反汇编窗口就会提醒你要删除的代码,nop掉它们操作就可以。

虚假流程消除后,代码如下:

void __fastcall main(int a1, char **a2, char **a3)
{
  signed __int64 v3; // [rsp+1E0h] [rbp-110h]
  int j; // [rsp+1E8h] [rbp-108h]
  int i; // [rsp+1ECh] [rbp-104h]
  int k; // [rsp+1ECh] [rbp-104h]
  char s1[48]; // [rsp+1F0h] [rbp-100h] BYREF
  char input[60]; // [rsp+220h] [rbp-D0h] BYREF
  int v9; // [rsp+25Ch] [rbp-94h]
  char *v10; // [rsp+260h] [rbp-90h]
  int v11; // [rsp+26Ch] [rbp-84h]
  bool v12; // [rsp+272h] [rbp-7Eh]
  unsigned __int8 v13; // [rsp+273h] [rbp-7Dh]
  int v14; // [rsp+274h] [rbp-7Ch]
  char *v15; // [rsp+278h] [rbp-78h]
  int v16; // [rsp+284h] [rbp-6Ch]
  int v17; // [rsp+288h] [rbp-68h]
  bool v18; // [rsp+28Fh] [rbp-61h]
  char *v19; // [rsp+290h] [rbp-60h]
  int v20; // [rsp+298h] [rbp-58h]
  bool v21; // [rsp+29Fh] [rbp-51h]
  __int64 v22; // [rsp+2A0h] [rbp-50h]
  bool v23; // [rsp+2AFh] [rbp-41h]
  __int64 v24; // [rsp+2B0h] [rbp-40h]
  __int64 v25; // [rsp+2B8h] [rbp-38h]
  __int64 v26; // [rsp+2C0h] [rbp-30h]
  __int64 v27; // [rsp+2C8h] [rbp-28h]
  int v28; // [rsp+2D0h] [rbp-20h]
  int v29; // [rsp+2D4h] [rbp-1Ch]
  char *v30; // [rsp+2D8h] [rbp-18h]
  int v31; // [rsp+2E0h] [rbp-10h]
  int v32; // [rsp+2E4h] [rbp-Ch]
  bool v33; // [rsp+2EBh] [rbp-5h]

  v9 = 0;
  memset(input, 0, 0x30uLL);
  memset(s1, 0, sizeof(s1));
  printf("Input:");
  v10 = input;
  __isoc99_scanf("%s");
  for ( i = 0; ; ++i )
  {
    v11 = i;
    v12 = i < 64;
    if ( i >= 64 )
      break;
    v13 = input[i];
    v14 = v13;
    if ( v13 == '\n' )                          // 回车就break
    {
      v15 = &input[i];
      *v15 = 0;
      break;
    }
    v16 = i + 1;                                // 没用
  }
  for ( j = 0; ; ++j )                          // 每次循环6次
  {
    v17 = j;
    v18 = j < 6;
    if ( j >= 6 )
      break;
    v19 = input;
    v3 = *(_QWORD *)&input[8 * j];              // 每8个字符一组
    for ( k = 0; ; ++k )                        // 每次循环64次
    {
      v20 = k;
      v21 = k < 64;
      if ( k >= 64 )
        break;
      v22 = v3;                                 // 没用
      v23 = v3 < 0;                             // 没用
      if ( v3 >= 0 )                            // 非负数
      {
        v26 = v3;                               // 没用
        v27 = 2 * v3;                           // 没用
        v3 *= 2LL;                              // 相当于左移,最后一位是0
      }
      else                                      // 负数
      {
        v24 = 2 * v3;                           // 没用
        v25 = 2 * v3;                           // 没用
        v3 = (2 * v3) ^ 0xB0004B7679FA26B3LL;   // 计算后最后一位是1
      }
      v28 = k;
    }
    v29 = 8 * j;                                //flag长度 6*8==48
    v30 = &s1[8 * j];
    *(_QWORD *)v30 = v3;
    v31 = j + 1;
  }
  v32 = memcmp(s1, qword_402170, 0x30uLL);      // 变化结果给了s1
  v33 = v32 != 0;
  if ( v32 )
    puts("Wrong!");
  else
    puts("Correct!");
}

然后代码流程:第一个for循环没用,从第二个看外循环6次,内循环64次,把flag看为8个字节一组,然后如果是非负数就乘2(相当左移),如果是负数就乘2(相当左移)在异或一个数。

这里的关键是如何判断是前一个数是正数还是负数,这里有个技巧,如果是正数就左移一位,所以最后一位是0,而要是负数就会左移并异或一个数,最后一位会是1,所以可以通过这个判断前一个数是正数还是负数,所以代码如下:

 flag:flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}

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

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

相关文章

单点登录的几种实现方式探讨

单点登录&#xff08;Single Sign On&#xff09;&#xff0c;简称为 SSO&#xff0c;是解决企业内部的一系列产品登录问题的方案。SSO 的定义是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统&#xff0c;用于减少用户重复的登录操作&#…

PyTorch的自动微分(autograd)

PyTorch的自动微分(autograd) 计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素&#xff1a;结点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09; 结点表示数据&#xff0c;如向量、矩阵、张量 边表示运算&#xff0c;如加减乘除卷积等 用计算…

共话开源 | 开放原子开源基金会专题调研openKylin社区!

3月8日&#xff0c;开放原子开源基金会秘书长冯冠霖、运营部部长李博、业务发展部部长朱其罡、研发部副部长周济一行莅临openKylin社区调研交流&#xff0c;麒麟软件高级副总经理韩乃平、副总裁董军平、终端研发部副总经理陆展、产品规划部经理常亚武、市场与政府事务部高级经理…

力扣sql简单篇练习(二十五)

力扣sql简单篇练习(二十五) 1 无效的推文 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT tweet_id FROM Tweets WHERE CHAR_LENGTH(content)>151.3 运行截图 2 求关注者的数量 2.1 基本题目内…

【Linux实战篇】二、在Linux上部署各类软件

一、实战章节&#xff1a;在Linux上部署各类软件 二、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统&#xff08;后续简称MySQL&#xff09;&#xff0c;是一款知名的数据库系统&#xff0c;其特点是&#xff1a;轻量、简单、功能丰富。 MySQL数据库可谓是…

在矩池云运行 Stable Diffusion web UI,使用v1.5模型和 ControlNet 插件

今天给大家介绍下如何在矩池云使用 Stable Diffusion web UI v1.5 模型和 Stable Diffusion ControlNet 插件。 租用机器 租用机器需要选择内存大于8G的机器&#xff0c;比如 A2000&#xff0c;不然 Stable Diffusion web UI 启动加载模型会失败。&#xff08;Killed 内存不足…

近20个省市加快房屋网签备案,君子签电子签章助推掌上办理

2020年以来&#xff0c;上海、北京、深圳、长沙、武汉、杭州、山东、郑州、西安、佛山、青岛、江门、昆明、韶关、南京、石家庄等全国近20个省市纷纷响应住建部政策要求&#xff0c;鼓励使用电子签名、电子签章等技术加快推动商品房、二手房或租赁房交易合同网签备案&#xff0…

是面试官放水,还是公司实在是太缺人?这都没挂,字节原来这么容易进...

字节是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在华为做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有10K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾讯…

UEFI开发探索101 – PCD探究(helloworld中的使用)

2 如何使用PCD PCD可以使用于UEFI存在的大部分时间&#xff0c;除了在SEC阶段、早期的PEI和DXE阶段&#xff0c;基本都可以访问。在使用前&#xff0c;我们需要搞清楚PCD的结构和类型。 2.1 PCD的类型 PCD变量的格式有点像结构体&#xff1a; TokenSpaceGuidCName.PcdCName …

【SpringCloud】SpringCloud教程之Gateway实战

目录前言SpringCloud Gatewy网关一.网关功能和工作原理二.网关的类型三.搭建网关四.路由断言工厂(Route Predicate Factory)五.路由过滤器(属于GatewayFilter)六.DefaultFilter过滤器(属于GatewayFilter)七.全局过滤器(GlobalFilter)八.过滤器执行顺序九.Gateway解决跨域问题前…

什么蓝牙耳机适合长时间佩戴?长久佩戴舒适的蓝牙耳机

因为我每天使用蓝牙耳机时间比较长&#xff0c;而且在上下班的路上经常会听听音乐&#xff0c;所以还是非常在意耳机的舒适度&#xff0c;有些耳机压迫感很明显&#xff0c;用久了感觉很不舒服&#xff0c;近期就购入了许多蓝牙耳机&#xff0c;终于整理出了一起佩戴舒适度高的…

vue+echarts.js 实现中国地图——根据数值表示省份的深浅——技能提升

最近在写后台管理系统&#xff0c;遇到一个需求就是 中国地图根据数值 展示深浅颜色。 效果图如下&#xff1a; 直接上代码&#xff1a; 1.html部分 <div id"Map"></div>2.css部分——一定要设置尺寸 #Map {width: 100%;height: 400px; }3.js部分 …

【立体匹配论文阅读】AANet: Adaptive Aggregation Network for Efficient Stereo Matching

Authors: Haofei Xu, Juyong Zhang Link: https://arxiv.org/abs/2004.09548 Years: 2020 Credit Novelty and Question set up 主流的立体匹配模型的代价聚合操作主要用了3D卷积&#xff0c;这部分操作的算力和内存消耗过大&#xff0c;因此作者提出一种新的模型AANet&#x…

C#项目--GridControl数据绑定及数据引入

系列文章 C#项目–业务单据号生成器&#xff08;定义规则、自动编号、流水号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 C#项目–开始日期结束日期范围计算&#xff08;上周、本周、明年、前年等&#xff09; 本文链接&…

KUKA机器人修改机器人名称和IP地址的具体方法示例

KUKA机器人修改机器人名称和IP地址的具体方法示例 修改机器人名称 如下图所示,首先切换用户组到管理员,输入默认密码:kuka, 如下图所示,点击菜单键—投入运行—机器人数据, 如下图所示,此时可以看到机器人的名称为rrr445, 如下图所示,修改之后,点击左侧的“”…

C#项目--打印模板解决方案(自定义模板、条形码、二维码、图片)

系列文章 C#项目–业务单据号生成器&#xff08;定义规则、自动编号、流水号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 C#项目–开始日期结束日期范围计算&#xff08;上周、本周、明年、前年等&#xff09; 本文链接&…

win11安装ubuntu子系统与桌面 填坑记录

win11安装ubuntu子系统win11可以直接从应用市场安装ubuntu子系统。详细安装步骤见参考资料。这里列出一些博主遇到的问题。填坑之路从应用市场获取ubuntu系统时会报0x80240438或者0x80072efd等错误。网络连接有问题&#xff0c;关闭windows防火墙再试&#xff0c;多试几遍安装u…

【刷题笔记】--二分-P2440 木材加工

题目&#xff1a; 思路&#xff1a; 先在所有树中找到最长的树&#xff0c;从 1 到 这个最长的树的长度 的所有数作为二分查找的值&#xff0c;让每棵树除这个值&#xff0c;表示可以切出几段出来&#xff0c;累加在一起得到s&#xff0c;s表示一共有几段。s与k比较&#xf…

windows如何安装两个版本的mysql的方法

Windows上安装两个版本的mysql 背景&#xff1a;在学习项目的时候&#xff0c;项目中使用mysql5.7的版本&#xff0c;而自己的windows系统中安装的是mysql8.0版本&#xff0c;在尝试将项目中的mysql5.7版本的代码更改到8.0版本后仍然报错&#xff0c;故尝试更改windows系统中的…

低代码有哪些典型应用场景?

低代码有哪些典型应用场景&#xff1f; 低代码是一种全新的应用开发方式&#xff0c;它通过可视化的拖拽式界面&#xff0c;将传统的繁琐代码编写转化为简单的拖拽操作&#xff0c;让非技术人员也能够快速地开发出应用程序。 随着数字化转型的不断加速&#xff0c;低代码平台…