crackMe

附件

步骤:

  1. 例行检查,32位程序,无壳

  2. 32位ida载入,已知用户名welcomebeijing,解密码,直接看main函数

    可以看到程序是个死循环,只有满足sub_404830函数的条件,才能跳出循环

  3. sub_404830函数里要让sub_404830函数返回1,必须要让v13=43924,v13经过了sub_401470的变换,先看sub_401470函数

_DWORD *__usercall sub_401470@<eax>(int a1@<ebx>, _BYTE *a2, _DWORD *a3)
{
int v3; // ST28_4
int v4; // ecx
_DWORD *_EAX; // eax
int v6; // edx
int v8; // ST20_4
int v9; // eax
int v10; // edi
int v11; // ST1C_4
int v12; // edx
char v13; // di
int v14; // ST18_4
int v15; // eax
int v16; // ST14_4
int v17; // edx
char v18; // al
int v19; // ST10_4
int v20; // ecx
char _AL; // al
int v23; // ST0C_4
int v24; // eax
_DWORD *result; // eax
int v26; // edx if ( *a2 == 'd' )
{
*a3 |= 4u;
v4 = *a3;
}
else
{
*a3 ^= 3u;
}
v3 = *a3;
if ( a2[1] == 'b' )
{
_EAX = a3;
*a3 |= 20u;
v6 = *a3;
}
else
{
*a3 &= 97u;
_EAX = (_DWORD *)*a3;
}
__asm { aam }
if ( a2[2] == 'a' )
{
*a3 |= 132u;
v9 = *a3;
}
else
{
*a3 &= 0xAu;
}
v8 = *a3;
v10 = ~(a1 >> -91);
if ( a2[3] == 'p' )
{
*a3 |= 276u;
v12 = *a3;
}
else
{
*a3 >>= 7;
}
v11 = *a3;
v13 = v10 - 1;
if ( a2[4] == 'p' )
{
*a3 |= 896u;
v15 = *a3;
}
else
{
*a3 *= 2;
}
v14 = *a3;
if ( *(_DWORD *)(*(_DWORD *)(__readfsdword(0x30u) + 24) + 12) != 2 )
{
if ( a2[5] == 'f' )
{
*a3 |= 732u;
v17 = *a3;
}
else
{
*a3 |= 0x21u;
}
v16 = *a3;
}
if ( a2[5] == 's' )
{
*a3 |= 2564u;
v18 = (char)a3;
v20 = *a3;
}
else
{
v18 = (char)a3;
*a3 ^= 0x1ADu;
}
v19 = *a3;
_AL = v18 - v13;
__asm { daa }
if ( a2[6] == 'e' )
{
*a3 |= 8976u;
v24 = *a3;
}
else
{
*a3 |= 0x4Au;
}
v23 = *a3;
if ( a2[7] == 'c' )
{
result = a3;
*a3 |= 35344u;
v26 = *a3;
}
else
{
*a3 &= 931u;
result = (_DWORD *)*a3;
}
return result;
}

经过计算得知,a2必须要满足所有条件才会返回43924

此时a2数组里的值是[100, 98, 97, 112, 112, 115, 101, 99] -->(dbappsec)

  1. sub_401470函数分析结束,返回到sub_401830函数

    v16就是我们刚刚在sub_401470函数里得到的a2=[100, 98, 97, 112, 112, 115, 101, 99]
    可以看到v16的值主要是在第63行赋予的,byte_416050是通过与变换后的密码异或得到v16,我们得要知道byte_416050里的值,静态分析点进去全是问号,动调看一下里面的值

调了半天没找到里面的值,原来这里有反调试语句,关于反调试具体的看下面给的文章链接
https://www.cnblogs.com/Crisczy/p/7575521.html
https://www.cnblogs.com/15157737693zsp/p/4663339.html
https://blog.csdn.net/a709046532/article/details/108323936

这边有3条反调试语句

其实就是寻找PEB结构体中的特定字段来判断是否处于被调试的状态

if ( *(_DWORD *)(*(_DWORD *)(__readfsdword(0x30u) + 24) + 12) != 2 )-->Flags字段
if ( *(_DWORD *)(__readfsdword(0x30u) + 104) & 0x70 ) --------------->NtGlobalFlag字段
if ( *(_DWORD *)(__readfsdword(0x30u) + 2) & 0xFF ) ------------------>BeingDebugged字段

为了能够成功动调程序,我们需要进行反反调试,绕过反调试代码执行函数的正常逻辑。
上述的链接3中给出几个比较常见的手段:

  1. 动调时手动修改代码,比如汇编下把jz改成jmp/jnz,我改成了jnz,机器码是74改成75
  2. 使用插件ScyllaHide了(https://github.com/x64dbg/ScyllaHide/)

绕过反动调后能够得到byte_416050 = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd],具体的绕过过程看上述的链接3
exp

import hashlib

box = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd]
a =[100,98,97,112,112,115,101,99]
flag="" for i in range(8):
flag+=(hex(a[i]^box[i])[2:])
print ('md5加密前:'+flag) m = hashlib.md5()
b = flag.encode(encoding='utf-8')
m.update(b)
flag = m.hexdigest() print ('md5加密后:'+flag)


flag{d2be2981b84f2a905669995873d6a36c}

[BUUCTF]REVERSE——crackMe的更多相关文章

  1. [BUUCTF]REVERSE——[ACTF新生赛2020]Oruga

    [ACTF新生赛2020]Oruga 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索字符串,根据提示来到关键函数 14行~18行就是让字符串的前5位是 actf{ ,sub_78A( ...

  2. [BUUCTF]REVERSE——firmware

    firmware 附件 步骤: 检查文件没有看出什么,ida载入一堆乱码,看了其他师傅的wp才知道要先binwalk对文件进行提取 120200.squashfs这是一个linux的压缩文件 我们需要 ...

  3. [BUUCTF]REVERSE——[WUSTCTF2020]Cr0ssfun

    [WUSTCTF2020]Cr0ssfun 附件 步骤: 例行检查,无壳儿,64位程序,直接ida载入,检索程序里的字符串,根据提示跳转 看一下check()函数 内嵌了几个检查的函数,简单粗暴,整理 ...

  4. [BUUCTF]REVERSE——[FlareOn6]Overlong

    [FlareOn6]Overlong 附件 步骤: 例行检查,32位程序,不懂是个啥 32位ida载入,main函数很简单 处理函数 sub_401000 程序只对unk_402008的28位进行了处 ...

  5. [BUUCTF]REVERSE——[WUSTCTF2020]level3

    [WUSTCTF2020]level3 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,找到关键函数 看样子是个base64加密,但又感觉没那么简单,再翻翻左边的函数,找到了base64加 ...

  6. [BUUCTF]REVERSE——[MRCTF2020]hello_world_go

    [MRCTF2020]hello_world_go 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索程序里的字符串,有很多,直接检索flag 一个一个点过去,找到了flag 按a,提取 ...

  7. [BUUCTF]REVERSE——[GKCTF2020]BabyDriver

    [GKCTF2020]BabyDriver 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索程序里的字符串,看到提示flag是md5(input),下方还看到了类似迷宫的字符串 找到关 ...

  8. [BUUCTF]REVERSE——[MRCTF2020]Xor

    [MRCTF2020]Xor 附件 步骤: 例行检查,32位程序,无壳 32位ida载入,首先检索程序里的字符串,根据字符串的提示,跳转到程序的关键函数 根据flag,跳转到sub_401090函数 ...

  9. [BUUCTF]REVERSE——[FlareOn4]IgniteMe

    [FlareOn4]IgniteMe 附件 步骤: 例行检查,32位程序,无壳 32位ida载入 当满足第10行的if条件时,输出G00d j0b!提示我们成功,看一下sub_401050函数 3.s ...

随机推荐

  1. [bzoj1101]Zap

    1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50001 4 int t,n,m,k,ans,mu[N],vis ...

  2. [luogu6702]Path

    维护每一个点到根路径的异或和(记作$d_{k}$),根据异或自反性,$(x,y)$的异或和即$d_{x}\oplus d_{y}$ 考虑两条路径的lca,选择其中深度较大的点,另一条路径必然在其子树外 ...

  3. [noi1994]海盗

    令$a_{i,j}(j\le i)$表示第i个人的方案中给第j个人$a_{i,j}$的钱,有以下性质: 1.如果第j个人一定同意(否则就会死)第i个人的方案,那么$a_{i,j}=0$(容易发现一定同 ...

  4. ceph rgw的使用,dashboard和监控

    1.部署RadosGW 服务 将ceph-mgr1.ceph-mgr2 服务器部署为高可用的radosGW 服务 1.1 安装radosgw 服务 root@mgr1:~# apt install r ...

  5. [Bzoj 1192][HNOI2006]鬼谷子的钱袋(二进制优化多重背包)

    (人生第一篇bzoj题解有点激动 首先介绍一下题目: 看它题目那么长,其实意思就是给定一个数a,求将其拆分成n个数,通过这n个数可以表示出1~a中所有数的方案中,求最小的n. 您看懂了嘛?不懂咱来举个 ...

  6. 洛谷 P3676 - 小清新数据结构题(动态点分治)

    洛谷题面传送门 题目名称好评(实在是太清新了呢) 首先考虑探究这个"换根操作"有什么性质.我们考虑在换根前后虽然每个点的子树会变,但整棵树的形态不会边,换句话说,割掉每条边后,得到 ...

  7. Eigensoft-smartpca分析PCA报错:warning (mapfile): bad chrom: Segmentation fault

    目录 问题 解决 问题 一直以来用Eigensoft的smartpca来做群体遗传的PCA分析很顺畅,结果也比较靠谱. 但今天报错如下: $ ~/miniconda3/bin/smartpca -p ...

  8. Perl 语言入门1-5

    第一章 简介 perl -v 文字处理,编写小型CGI脚本(Web服务器调用程序)的最佳语言 CPAN: Perl综合典藏网 shebang: #! /usr/bin/perl 或#! /usr/lo ...

  9. Docker-原理解析

    容器! Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件.容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有 ...

  10. HDFS01 概述

    HDFS 概述 目录 HDFS 概述 HDFS的产生背景和定义 HDFS产生背景 HDFS定义 优缺点 优点 缺点 组成 NameNode DataNode Secondary NameNode(2n ...