buuctf [RoarCTF2019]polyre

本文介绍了RoarCTF2019的Polyre题目,涉及控制流平坦化和虚假控制流程的概念。作者首先通过ida64分析文件,然后使用deflat.py脚本进行控制流平坦化,接着处理虚假控制流程。加密原理是基于CRC32的查表法,通过对数据逆向操作得到查表法的表,再进行CRC64计算以获得flag。
摘要由CSDN通过智能技术生成

今天刷的这个题是关于平坦化和虚假控制流程的题目。第一次见到所以写篇wp记录一下。

1.处理文件

1.1 控制流平坦化

将文件直接拖入ida64中,查看main函数的控制流程图(CFG)
在这里插入图片描述

得到的代码是一个多重循环,我们需要对代码进行控制流平坦化。

可以参考:https://security.tencent.com/index.php/blog/msg/112

deflat.py脚本
https://pan.baidu.com/s/1Tuw2ITns1bI05nWfTpwNag提取码:u2g0

使用时需要注意哦!!在这里插入图片描述

使用deflat.py执行控制流平坦化脚本命令:

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

(ps:使用脚本需要安装angr库。不会安装的小伙伴可以看看我的这篇文章:Kali angr环境配置

在这里插入图片描述
需要等待几分钟!!!。

1.2 处理虚假控制流程

得到的文件使用拖入ida64中,查看main函数,得到反汇编代码:

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

  v10 = 0;
  memset(s, 0, 0x30uLL);
  memset(s1, 0, 0x30uLL);
  printf("Input:", 0LL);
  v11 = s;
  if ( dword_603058 >= 10 && (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) != 0 )
    goto LABEL_43;
  while ( 1 )
  {
   
    __isoc99_scanf("%s", v11);
    v6 = 0;
    if ( dword_603058 < 10 || (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 & 1) == 0 )
      break;
LABEL_43:
    __isoc99_scanf("%s", v11);
  }
  while ( 1 )
  {
   
    do
      v12 = v6;
    while ( dword_603058 >= 10 && (((_BYTE)dword_603054 - 1) * (_BYTE)dword_603054 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值