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 ...
随机推荐
- JS LeetCode 1423. 可获得的最大点数简单题解
壹 ❀ 引 最近也是浮躁的很,一篇redux的文章写了三千多字才算写了一半...写的泪目了.还是刷刷算法静下心,顺带记录下算法做题过程吧.今天的题来自LeetCode每日打卡,题目出自LeetCode ...
- .NET周刊【2月第2期 2024-02-11】
国内文章 C#/.NET该如何自学入门? https://www.cnblogs.com/Can-daydayup/p/18006914 随着DotNetGuide技术社区交流群的扩大,很多新成员希望 ...
- python绘图总结
1 二维图像 1.1 二维曲线 plot(x, y, ls="-", lw=1.5, label=None) x, y:横坐标和纵坐标 ls:颜色.点标记.线型列表,如 ls='r ...
- Java设计模式-代理模式Proxy
介绍 代理模式是一种比较好理解的设计模式.简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. ...
- Windows Docker Destop修改默认镜像文件位置
0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...
- 记录一个错误:Unable to find a match: python-dev
今天尝试在Linux下运行一个Python项目,在安装requirements.txt时报错 执行命令如下: [root@VM-16-8-centos cve-search]# pip3 instal ...
- Java面向对象之内部类的几类使用场景
介绍 Java内部类是一种特殊的类,它定义在另一个类的内部.内部类提供了许多有用的特性,包括访问外部类的私有成员.隐藏实现细节以及实现回调接口等.以下是Java内部类的一些常用场景及其举例说明: 回调 ...
- [Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录
问题描述 在Azure Function代码中,有默认的ILogger对象来记录函数的日志,如果函数引用了一些静态对象,是否有办法使用这个默认的ILogger对象来记录日志呢? using Syste ...
- 【Azure 应用服务】Function App中的函数(Functions)删除问题
问题描述 Function App 中的函数如何删除问题 问题分析 1)在Function App的门户上,点击"Delete"进行删除 2) 进入Function App的高级管 ...
- 使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化
本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲,主要包括以下内容: NebulaGraph 3.x 发展历程 NebulaG ...