[BUUCTF]REVERSE——crackMe
crackMe
步骤:
例行检查,32位程序,无壳

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

可以看到程序是个死循环,只有满足sub_404830函数的条件,才能跳出循环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)
- 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中给出几个比较常见的手段:
- 动调时手动修改代码,比如汇编下把jz改成jmp/jnz,我改成了jnz,机器码是74改成75
 - 使用插件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的更多相关文章
- [BUUCTF]REVERSE——[ACTF新生赛2020]Oruga
		
[ACTF新生赛2020]Oruga 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索字符串,根据提示来到关键函数 14行~18行就是让字符串的前5位是 actf{ ,sub_78A( ...
 - [BUUCTF]REVERSE——firmware
		
firmware 附件 步骤: 检查文件没有看出什么,ida载入一堆乱码,看了其他师傅的wp才知道要先binwalk对文件进行提取 120200.squashfs这是一个linux的压缩文件 我们需要 ...
 - [BUUCTF]REVERSE——[WUSTCTF2020]Cr0ssfun
		
[WUSTCTF2020]Cr0ssfun 附件 步骤: 例行检查,无壳儿,64位程序,直接ida载入,检索程序里的字符串,根据提示跳转 看一下check()函数 内嵌了几个检查的函数,简单粗暴,整理 ...
 - [BUUCTF]REVERSE——[FlareOn6]Overlong
		
[FlareOn6]Overlong 附件 步骤: 例行检查,32位程序,不懂是个啥 32位ida载入,main函数很简单 处理函数 sub_401000 程序只对unk_402008的28位进行了处 ...
 - [BUUCTF]REVERSE——[WUSTCTF2020]level3
		
[WUSTCTF2020]level3 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,找到关键函数 看样子是个base64加密,但又感觉没那么简单,再翻翻左边的函数,找到了base64加 ...
 - [BUUCTF]REVERSE——[MRCTF2020]hello_world_go
		
[MRCTF2020]hello_world_go 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索程序里的字符串,有很多,直接检索flag 一个一个点过去,找到了flag 按a,提取 ...
 - [BUUCTF]REVERSE——[GKCTF2020]BabyDriver
		
[GKCTF2020]BabyDriver 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,检索程序里的字符串,看到提示flag是md5(input),下方还看到了类似迷宫的字符串 找到关 ...
 - [BUUCTF]REVERSE——[MRCTF2020]Xor
		
[MRCTF2020]Xor 附件 步骤: 例行检查,32位程序,无壳 32位ida载入,首先检索程序里的字符串,根据字符串的提示,跳转到程序的关键函数 根据flag,跳转到sub_401090函数 ...
 - [BUUCTF]REVERSE——[FlareOn4]IgniteMe
		
[FlareOn4]IgniteMe 附件 步骤: 例行检查,32位程序,无壳 32位ida载入 当满足第10行的if条件时,输出G00d j0b!提示我们成功,看一下sub_401050函数 3.s ...
 
随机推荐
- [loj2473]秘密袭击
			
容易发现答案即$\sum_{S}\sum_{u=1}^{W}[u\le val(S)]=\sum_{u=1}^{W}\sum_{S}[u\le val(S)]$,那么可以枚举权值$u$,并将点权$va ...
 - vue-if和show
			
<template> <div> <div v-if="flag">今晚要上课</div> <div v-else> 今 ...
 - Linux中shell去除空行的几种方法
			
有时我们在处理和查看文件时,经常会有很多空行,为了美观或是有需要时,就有必要把这些除行去掉了,方法如下: #如需将结果输出加入重定向 > 文件名 1)用tr命令 代码如下: cat ...
 - illumina SNP 芯片转基因型矩阵
			
一.芯片数据 此次拿到的illumina芯片数据并不是原始的数据,已经经过GenomeStudio软件处理成了finalreport文件,格式如下: 之前没处理过芯片数据,对于这种编码模式(Forwa ...
 - Python三元表达式,列表推导式,字典生成式
			
目录 1. 三元表达式 2. 列表推导式 3. 字典生成式 3.1 字典生成式 3.2 zip()方法 1. 三元表达式 """ 条件成立时的返回值 if 条件 else ...
 - oracle 将电话号码中间4位数以星号*代替
			
select replace('17665312355',substr('17665312355',4,4),'****') as phone, #类似E ...
 - Python中类的各式方法介绍
			
本文类的方法介绍包括类方法.属性方法.静态方法.修改属性方法等内置装饰器装饰的方法,以及类的一些特殊成员方法 1. 类的特殊成员方法 1.1 构造方法 # -*- coding:utf-8 -*- # ...
 - 29-Regular Expression Matching-leetcode
			
'.' Matches any single character. '*' Matches zero or more of the preceding element. The matching sh ...
 - 使用Postman轻松实现接口数据关联
			
Postman Postman是一款非常流行的HTTP(s)接口测试工具,入门简单,界面美观,功能强大.作为一个测试/开发工程师,这是一款必须要会用的工具.今天以一个实际的案例,来介绍下Postman ...
 - 日常Javaweb 2021/11/19
			
Javaweb Dao层: //连接数据库,实现增查功能 package dao; import java.sql.Connection; import java.sql.DriverManager; ...