题目:


丢到PE里, 无壳,64bit

丢到IDA里,shift+F12,查看字符串,找到一个很可疑的字符串

跟进去看看,找到目标函数,我另外搜索了一下,没有mian函数,sub_400F8E应该就是解题的关键函数

有部分变量我修改的名字,为了方便理解

 1 __int64 __fastcall sub_400F8E(__int64 a1, int a2, int a3, int a4, int a5, int a6)
2 {
3 int v6; // edx
4 int v7; // ecx
5 int v8; // r8d
6 int v9; // r9d
7 int v10; // ecx
8 int v11; // r8d
9 int v12; // r9d
10 char v14; // [rsp+0h] [rbp-C0h]
11 char v15; // [rsp+0h] [rbp-C0h]
12 char input[136]; // [rsp+10h] [rbp-B0h] BYREF
13 int v17; // [rsp+98h] [rbp-28h]
14 char v18; // [rsp+9Fh] [rbp-21h]
15 int v19; // [rsp+A0h] [rbp-20h]
16 unsigned __int8 input_1; // [rsp+A6h] [rbp-1Ah]
17 char key; // [rsp+A7h] [rbp-19h]
18 int v22; // [rsp+A8h] [rbp-18h]
19 int v23; // [rsp+ACh] [rbp-14h]
20 int v24; // [rsp+B0h] [rbp-10h]
21 int v25; // [rsp+B4h] [rbp-Ch]
22 _BOOL4 bool_type; // [rsp+B8h] [rbp-8h]
23 int i; // [rsp+BCh] [rbp-4h]
24
25 sub_407470((unsigned int)"Give me the password: ", a2, a3, a4, a5, a6, a2);
26 sub_4075A0((unsigned int)"%s", (unsigned int)input, v6, v7, v8, v9, v14);
27 for ( i = 0; input[i]; ++i )
28 ;
29 bool_type = i == 22; // 下面要打印Congras,那if里面的bool_type必须为1
30 // i=22
31 v25 = 10;
32 do
33 {
34 v10 = (int)sub_406D90() % 22; // v10的范围0~21
35 v22 = v10;
36 v24 = 0;
37 key = byte_6B4270[v10];
38 input_1 = input[v10];
39 v19 = v10 + 1;
40 v23 = 0;
41 while ( v23 < v19 )
42 {
43 ++v23;
44 v24 = 1828812941 * v24 + 12345;
45 }
46 v18 = v24 ^ input_1;
47 if ( key != ((unsigned __int8)v24 ^ input_1) )
48 bool_type = 0;
49 --v25;
50 }
51 while ( v25 );
52 if ( bool_type )
53 v17 = sub_407470((unsigned int)"Congras\n", (unsigned int)input, v24, v10, v11, v12, v15);
54 else
55 v17 = sub_407470((unsigned int)"Oh no!\n", (unsigned int)input, v24, v10, v11, v12, v15);
56 return 0LL;
57 }
  • sub_407470((unsigned int)"Give me the password: ", a2, a3, a4, a5, a6, a2); sub_4075A0((unsigned int)"%s", (unsigned int)input, v6, v7, v8, v9, v14);我一开始猜测是输出输入用的,预防万一后面查了资料,就是根据C语言函数可变参数的特性反汇编出来的,就是普通输出输入函数
    至于为什么五个变量就第一个我修改了名称————是看后面代码,通过个人理解,推出是输入量。
  • v10 = (int)sub_406D90() % 22;可以得知v10的范围是0~21,`sub_406D90`点进去跟踪,我没有得到什么有用的东西,大佬说`v10`是一个随机数,范围也的确是0 ~ 21,但是不是顺序来取值的——就算不知道`v10`的具体数值,但是肯定是0~21中的一个,写逆向脚本的时候遍历也是可以得出的。

  • key = byte_6B4270[v10];双击byte_6B4270得到一串东西,应该是关键字符串了,结合上面可以理解为:`v10`是一个随机的下标,根据下标从`byte_6B4270`中随机抽取一个放到`key`里面
  • input_1 = input[v10];在输入中随机抽取一个放到`input_1`里面,方便后面的异或操作
  • while ( v23 < v19 ){++v23;v24 = 1828812941 * v24 + 12345;}v18 = v24 ^ input_1这就是变换的关键部分了。经过加法乘法异或一系列操作,得到`v18`

  • if ( key != ((unsigned __int8)v24 ^ input_1) )这个if的作用就是检查变换后得出的`v18`与`key`是否相等

解题脚本

 1 key = [95,242,94,139,78,14,163,170,199,147,129,61,95,116,163,9,145,43,73,40,147,103]
2 flag = ""
3
4 for j in range(22):
5 v23 = 0
6 v24 = 0
7 v19 = j + 1
8 while v23 < v19:
9 v23 += 1
10 v24 = 1828812941 * v24 + 12345
11 flag += chr((v24 ^ key[j])&0xff)
12
13 print(flag)

flag: flag{d826e6926098ef46} 

hackme 【攻防世界】Reverse的更多相关文章

  1. 攻防世界 reverse 进阶 10 Reverse Box

    攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...

  2. 攻防世界 reverse evil

    这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...

  3. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  4. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  5. 攻防世界 reverse hackme

    hackme XCTF 3rd-GCTF-2017 __int64 __fastcall sub_400F8E(__int64 a1, __int64 a2) { char input[136]; / ...

  6. 攻防世界 reverse Windows_Reverse2

    Windows_Reverse2   2019_DDCTF 查壳: 寻找oep-->dump-->iat修复   便可成功脱壳 int __cdecl main(int argc, con ...

  7. 攻防世界 reverse BabyXor

    BabyXor     2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...

  8. 攻防世界 reverse parallel-comparator-200

    parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...

  9. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...

  10. 攻防世界 reverse easy_Maze

    easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...

随机推荐

  1. JS Leetcode 208. 实现 Trie (前缀树) 题解分析,第一次了解前缀树(字典树)

    壹 ❀ 引 本题来自LeetCode 208. 实现 Trie (前缀树),难度中等,题目描述如下: Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地 ...

  2. Python 装饰器解析(一)

    装饰器用于在源码中"标记"函数,以增强函数的行为. 我们先来看下面的例子,现有一个求和函数add,现在要求统计函数执行的时长 def add(a, b): print(a+b) 最 ...

  3. 开年!5 款令人惊艳的开源项目「GitHub 热点速览」

    朋友们开工大吉啊!我刚从假期模式切换回来,完全无心工作有些不在状态,比如开机密码错了好几次.闲话少叙,下面就让我们一起看看,春节这段时间 GitHub 上又出了什么有趣.好玩的开源项目. 今年上来就是 ...

  4. windows 上 cmake 添加 vcpkg 选项

    使用 cmake 编写相关的工程时,工程有时会使用 vcpkg 添加的第三方库,比如 zip 库 查看一些案例后,我发现有些回答不太准确,遂记录下 现在,我们需要在工程中使用 zip_open 函数执 ...

  5. Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC

    前言   前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了.  重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...

  6. Qt开发技术:QtCharts(一)QtCharts基本介绍以及图表框架详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. Jenkins+maven+svn+tomcat持续集成环境

    前言 团队最近要把项目发布的工作拿过来,所以需要一个持续集成发布系统 直接上步骤. 下载 http://mirrors.jenkins-ci.org/war/latest/ 直接下载war包,我下载的 ...

  8. STM32FATFS文件系统移植

    STM32FATFS文件系统移植 1. FATFS简介 FATFS文件系统是一个用于在微控制器上运行的开源文件系统,支持FAT/FATFS.NTFS.exFAT等主流文件系统,且一直保持更新.在此以F ...

  9. Java 常见的两个错误 -------1.栈溢出 java.lang.StackOverflowError 2.堆溢出 java.lang.OutOfMemoryError /OOM

    1 package com.bytezero.exception; 2 3 /** 4 * 5 * @Description Error 6 * @author Bytezero·zhenglei! ...

  10. Linux 系统编程从入门到进阶 学习指南

    引言 大家好,我是小康 ,今天我们来学习一下 Linux 系统编程相关的知识.Linux 系统编程是连接高级语言和硬件的桥梁,它对深入理解计算机系统至关重要.无论你是打算构建高性能服务器还是开发嵌入式 ...