程序流程很清晰

 1 int __cdecl main(int argc, const char **argv, const char **envp)
2 {
3 unsigned int v3; // edx
4 unsigned int i; // ecx
5 __m128i v5; // xmm1
6 unsigned int v6; // esi
7 const __m128i *v7; // eax
8 __m128i v8; // xmm0
9 int v9; // eax
10 char sc; // [esp+0h] [ebp-CCh]
11 char str; // [esp+1h] [ebp-CBh]
12 char s_; // [esp+64h] [ebp-68h]
13 char v14; // [esp+65h] [ebp-67h]
14 unsigned int de_s_len; // [esp+C8h] [ebp-4h]
15
16 printf("please input your flah:");
17 sc = 0;
18 memset(&str, 0, 0x63u);
19 scanf("%s", &sc);
20 s_ = 0;
21 memset(&v14, 0, 0x63u);
22 sub_401000(&de_s_len, &s_, (unsigned __int8 *)&sc, strlen(&sc));// base64解码
23 v3 = de_s_len; // 解码后长度
24 i = 0;
25 if ( de_s_len )
26 {
27 if ( de_s_len >= 0x10 )
28 {
29 v5 = _mm_load_si128((const __m128i *)&xmmword_414F20);
30 v6 = de_s_len - (de_s_len & 0xF);
31 v7 = (const __m128i *)&s_;
32 do
33 {
34 v8 = _mm_loadu_si128(v7);
35 i += 16;
36 ++v7;
37 _mm_storeu_si128((__m128i *)&v7[-1], _mm_xor_si128(v8, v5));
38 }
39 while ( i < v6 );
40 }
41 for ( ; i < v3; ++i )
42 *(&s_ + i) ^= 0x25u; // 异或
43 }
44 v9 = strcmp(&s_, "you_know_how_to_remove_junk_code");
45 if ( v9 )
46 v9 = -(v9 < 0) | 1;
47 if ( v9 )
48 printf("wrong\n");
49 else
50 printf("correct\n");
51 system("pause");
52 return 0;
53 }

关键比较

strcmp(&s_, "you_know_how_to_remove_junk_code")向上跟踪,发现sub_401000(&de_s_len, &s_, (unsigned __int8 *)&sc, strlen(&sc));

进入函数分析可以发现是base64解码

  1 signed int __usercall sub_401000@<eax>(unsigned int *a1@<edx>, _BYTE *a2@<ecx>, unsigned __int8 *sc, unsigned int size)
2 {
3 int j; // ebx
4 unsigned int k; // eax
5 int v6; // ecx
6 unsigned __int8 *v7; // edi
7 int v8; // edx
8 bool v9; // zf
9 unsigned __int8 v10; // cl
10 char v11; // cl
11 _BYTE *v12; // esi
12 unsigned int v13; // ecx
13 int v14; // ebx
14 unsigned __int8 v15; // cl
15 char v16; // dl
16 _BYTE *v18; // [esp+Ch] [ebp-Ch]
17 unsigned int *v19; // [esp+10h] [ebp-8h]
18 int v20; // [esp+14h] [ebp-4h]
19 unsigned int v21; // [esp+14h] [ebp-4h]
20 int sizea; // [esp+24h] [ebp+Ch]
21
22 j = 0;
23 v18 = a2;
24 k = 0;
25 v6 = 0;
26 v19 = a1;
27 v20 = 0;
28 if ( !size )
29 return 0;
30 v7 = sc;
31 do
32 {
33 v8 = 0;
34 v9 = k == size;
35 if ( k < size )
36 {
37 do
38 {
39 if ( sc[k] != ' ' )
40 break;
41 ++k; // 不含空格
42 ++v8;
43 }
44 while ( k < size );
45 v9 = k == size;
46 }
47 if ( v9 )
48 break;
49 if ( size - k >= 2 && sc[k] == '\r' && sc[k + 1] == '\n' || (v10 = sc[k], v10 == '\n') )
50 {
51 v6 = v20;
52 }
53 else
54 {
55 if ( v8 )
56 return 0xFFFFFFD4;
57 if ( v10 == '=' && (unsigned int)++j > 2 )
58 return 0xFFFFFFD4;
59 if ( v10 > 0x7Fu )
60 return 0xFFFFFFD4;
61 v11 = byte_414E40[v10];
62 if ( v11 == 0x7F || (unsigned __int8)v11 < '@' && j )
63 return 0xFFFFFFD4;
64 v6 = v20++ + 1;
65 }
66 ++k;
67 }
68 while ( k < size );
69 if ( !v6 )
70 return 0;
71 v12 = v18;
72 v13 = ((unsigned int)(6 * v6 + 7) >> 3) - j;
73 if ( v18 && *v19 >= v13 )
74 {
75 v21 = 3;
76 v14 = 0;
77 for ( sizea = 0; k; --k )
78 {
79 v15 = *v7;
80 if ( *v7 != '\r' && v15 != '\n' && v15 != ' ' )
81 {
82 v16 = byte_414E40[v15]; // 关键处理
83 v21 -= v16 == '@';
84 v14 = v16 & 0x3F | (v14 << 6);
85 if ( ++sizea == 4 )
86 {
87 sizea = 0;
88 if ( v21 )
89 *v12++ = BYTE2(v14);
90 if ( v21 > 1 )
91 *v12++ = BYTE1(v14);
92 if ( v21 > 2 )
93 *v12++ = v14;
94 }
95 }
96 ++v7;
97 }
98 *v19 = v12 - v18;
99 return 0;
100 }
101 *v19 = v13;
102 return -42;
103 }

识别base64解码函数是这题主要的考点,之后的操作就很简单

流程:

base64解码-->异或-->strcmp(&s_, "you_know_how_to_remove_junk_code")

1 import base64
2
3 s = 'you_know_how_to_remove_junk_code'
4 tmp = ''
5 for i in range(len(s)):
6 tmp += chr(ord(s[i]) ^ 0x25)
7 print(base64.b64encode(tmp.encode('utf-8')))
XEpQek5LSlJ6TUpSelFKeldASEpTQHpPUEtOekZKQUA=
												

攻防世界 reverse 进阶 12 ReverseMe-120的更多相关文章

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

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

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

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

  3. 攻防世界 reverse 进阶 9-re1-100

    9.re1-100 1 if ( numRead ) 2 { 3 if ( childCheckDebugResult() ) 4 { 5 responseFalse(); 6 } 7 else if ...

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

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

  5. 攻防世界 reverse 进阶 notsequence

    notsequence  RCTF-2015 关键就是两个check函数 1 signed int __cdecl check1_80486CD(int a1[]) 2 { 3 signed int ...

  6. 攻防世界 reverse 进阶 easyre-153

    easyre-153 查壳: upx壳 脱壳: 1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 int ...

  7. 攻防世界 reverse 进阶 -gametime

    19.gametime csaw-ctf-2016-quals 这是一个小游戏,挺有意思的 's'-->' '    'x'-->'x'   'm'-->'m' 观察流程,发现检验函 ...

  8. 攻防世界 reverse 进阶 15-Reversing-x64Elf-100

    15.Reversing-x64Elf-100 这题非常简单, 1 signed __int64 __fastcall sub_4006FD(__int64 a1) 2 { 3 signed int ...

  9. 攻防世界 reverse 进阶5-7

    5.re-for-50-plz-50  tu-ctf-2016 流程很简单,异或比较 1 x=list('cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ') 2 y=0x37 3 z= ...

随机推荐

  1. 如何获取豆瓣电影 API Key

    如何获取豆瓣电影 API Key 豆瓣 API Key 不能使用了 ! solutions & !== ? https://frodo.douban.com/api/v2/subject_co ...

  2. how to publish a UMD module

    how to publish a UMD module 如何发布UMD模块 npm https://github.com/xgqfrms/umd-npm-package https://www.npm ...

  3. css dark theme & js theme checker

    css dark theme & js theme checker live demo https://codepen.io/xgqfrms/pen/GRprYLm <!DOCTYPE ...

  4. taro & querySelector & refs

    taro & querySelector & refs delayQuerySelector https://github.com/NervJS/taro-ui/blob/dev/sr ...

  5. taro ENV & NODE_ENV & process.env

    taro ENV & NODE_ENV & process.env https://github.com/NervJS/taro-ui/blob/dev/src/common/util ...

  6. nasm win x86 hello world

    hello.asm: extern MessageBoxA extern ExitProcess section .data title db "caption.",0 messa ...

  7. windows 设置右键菜单

    编辑注册表 在文件 右键菜单中添加 xx.reg: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\vscode] &q ...

  8. servlet内置对象(传递数据)

    一个servlet向另一个servlet发送数据,可以将数据放置在一个容器中(io.数据库.servlet的内置对象),servlet的内置对象成本最小. 一共有三个内置对象. 名字 类型 reque ...

  9. 模拟web服务器 (小项目) 搭建+部署

    模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...

  10. mysql导入备份.sql文件时报错总结(还有待完善)

    错误1:ERROR Unknown character set: 'utf8mb4' utf8mb4编码集支持了表情符号,相信处理过社交网络数据的人都有了解.这个mysql5.5以后支持了utf8mb ...