hackme 【攻防世界】Reverse
题目:

丢到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的更多相关文章
- 攻防世界 reverse 进阶 10 Reverse Box
攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...
- 攻防世界 reverse evil
这是2017 ddctf的一道逆向题, 挑战:<恶意软件分析> 赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件.随后IT部门发现小A的电脑发出了异常网络访问请求,进 ...
- 攻防世界 reverse tt3441810
tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...
- 攻防世界 reverse 进阶 APK-逆向2
APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...
- 攻防世界 reverse hackme
hackme XCTF 3rd-GCTF-2017 __int64 __fastcall sub_400F8E(__int64 a1, __int64 a2) { char input[136]; / ...
- 攻防世界 reverse Windows_Reverse2
Windows_Reverse2 2019_DDCTF 查壳: 寻找oep-->dump-->iat修复 便可成功脱壳 int __cdecl main(int argc, con ...
- 攻防世界 reverse BabyXor
BabyXor 2019_UNCTF 查壳 脱壳 dump 脱壳后 IDA静态分析 int main_0() { void *v0; // eax int v1; // ST5C_4 char ...
- 攻防世界 reverse parallel-comparator-200
parallel-comparator-200 school-ctf-winter-2015 https://github.com/ctfs/write-ups-2015/tree/master/sc ...
- 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017
8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...
- 攻防世界 reverse easy_Maze
easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...
随机推荐
- NC15065 小牛vs小客
题目链接 题目 题目描述 小牛和小客玩石子游戏,他们用n个石子围成一圈,小牛和小客分别从其中取石子,谁先取完谁胜,每次可以从一圈中取一个或者相邻两个,每次都是小牛先取,请输出胜利者的名字(小牛获胜输出 ...
- UTF-8 的理解
举个简单的例子: Unicode 只是一个业界标准,具体一个字符占多少字节,取决于编码方式,包括 UTF-8 UTF-16 GB2312 等 "汉" 在 UTF-8 中占到 3 个 ...
- git回退至指定版本,并更新远程仓库
1. git log 查到commit记录 2.复制 commit 后面的id 3. git reset --hard commit 后面的id // 回退 4. 强制更新远程仓库 git ...
- sql更改表结构并将老数据导入(触发器)
1 --1.旧表改名 2 ALTER TABLE APP_MULTI_PARAM_test RENAME TO APP_MULTI_PARAM_test_bk; 3 4 --2.创建新表 5 CREA ...
- mp4v2开发笔记(一): mp4v2库介绍,mp4v2在ubuntu上交叉编译移植到海思Hi35xx平台
前言 在海思上需要将h264码流封装成mp4可使用mp4v2库. 其他相关 <Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译> ...
- .NET周刊【2月第3期 2024-02-25】
国内文章 4.1k Star!全面的C#/.NET/.NET Core学习.工作.面试指南 https://www.cnblogs.com/Can-daydayup/p/18027117 DotNet ...
- 【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
问题描述 Azure Event Hub支持 kafka,所以为了测试消息生产者所在环境与Azure Event Hub之间发送消息的性能如何,特别使用 kafka 官方测试生产者,消费者的性能工具 ...
- 如何设计一个高性能的图 Schema
本文整理自青藤云安全工程师--文洲在青藤云技术团队内部分享,分享视频参考:https://www.bilibili.com/video/BV1r64y1R72i 图数据库的性能和 schema 的设计 ...
- Spring Cloud跟Dubbo区别?
Spring Cloud是一个微服务框架,提供了微服务中很多功能组件,Dubbo一开始时RPC调用框架,核心是解决服务调用间的问题, Spring Cloud是一个大而全的框架,Dubbo更侧重于服务 ...
- Java 包装类的使用(自动装箱+自动拆箱)+Vector
1 package com.bytezreo.ut; 2 3 import java.util.Scanner; 4 import java.util.Vector; 5 6 /** 7 * 8 * ...