攻防世界 reverse 进阶 12 ReverseMe-120

程序流程很清晰

 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 }
View Code

识别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=

 

 


转载于:https://www.cnblogs.com/DirWang/p/11447515.html

堆栈解题练习二 惶惶乎如遗世独立,羽化而登仙。。。。。 阅读详情

相关推荐

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 634

xctf攻防世界 REVERSE 薪手练习区(二)

6. re1 进入环境,下载附件后发现给出的是一个exe文件,运行一下如图: 6.1 查看文件 我们用Exeinfo PE打开查看文件信息,如图: 没有加壳,丢入IDA Pro中: 6.2 反编译 对mian函数进行反编译(这个反编译好坑,一定要用IDA32位的程序打开才行,MD搞了好久) int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax __int128 v5; // [esp+

l8947943的博客 2396

四自由度SCARA机器人的运动学和动力学MATLAB建模与仿真

本文介绍了四自由度SCARA机器人的运动学和动力学建模,使用MATLAB进行了相应的建模与仿真。通过正运动学和动力学分析,可以了解机器人在不同状态下的运动特性和力学特性。这为后续的控制算法设计和性能优化打下了基础。希望本教程对学习SCARA机器人有帮助。

小蜗牛的珍贵百宝箱 3569

攻防世界刷题】Misc-9-reverseMe

攻防世界刷题】Misc-9-reverseMe

vivishkx的博客 516

攻防世界-misc】reverseMe

反转后的图片,将值提取并上传。1.下载后,得到这样一张图片。2.利用在线翻转网站获取值,

weixin_73625393的博客 861

2022CTF培训(六)逆向题目选讲

分析可知,函数首先调用 sub_4017C0 初始化 v4 数组,之后根据 v4 数组中的内容依次调用 funcs_4018AB 数组中的函数对输入的 1 到 32 字节进行变换。通过改变断点位置可以判断出,该函数表中 sub_B232A0 函数的前一个函数 sub_AD1000 同样存在反调试。必然会触发除零异常,因此会执行 loc_4010BE 处的代码,将局部变量 a0 和 a1 分别异或 dword_41F038 和 dword_41F03C。并用魔改的 tea 对其进行加密。

sky123博客 1696

攻防世界 Reverse高手进阶区 2分题 ReverseMe-120

继续ctf的旅程,攻防世界Reverse高手进阶区的2分题,本篇是ReverseMe-120的writeup

闵行小鱼塘 612

攻防世界 Reverse ReverseMe-120

ReverseMe-120 打开是个可执行文件,先随便输入 ida打开,查看main函数,反汇编 int __cdecl main(int argc, const char **argv, const char **envp) { unsigned int v3; // edx unsigned int v4; // ecx __m128i v5; // xmm1 unsigned int v6; // esi const __m128i *v7; // eax __m128i v

XFox_的博客 372

攻防世界 re ReverseMe-120

得到flag: XEpQek5LSlJ6TUpSelFKeldASEpTQHpPUEtOekZKQUA=知道了要解密的字符串和加密逻辑了但感觉少了点什么毕竟都说sub_401000里有东西了。将下载好的题目附件查壳用DE什么都没有(不放图了,偷个懒~)将附件放入ida里找到main函数直接f5反汇编。打开一看这代码是真的长啊往下翻看到了熟悉的东西。跟进sub_401000函数看看里面有什么。看到了byte_414E40跟进看看。越来越难了题目感觉力不从心了~熟悉的东西base64。

2401_83736531的博客 310

攻防世界-RE-ReverseMe-120(主要是对Base64再深入熟悉一下)

前言 今天随机做了三题,但是感觉都是简单题,基本完成了pediy18-10,但是最后的shellcode执行上遇到了一点问题没有解决。其中有一道题,跟国赛中遇到的一题,让我很深的认识到base64加密算法的重要性。 分析 在IDA中打开,查看main函数,从最后的strcmp可以猜到是输入一个字符串,然后处理一下再与已知明文对比。 虽然有很多垃圾指令,但是通过动态调试可以知道哪些操作是有用的。动...

WocW的博客 1823

逆向-攻防世界-ReverseMe-120

无壳,ida载入,发现最终比较是和you_know_how_to_remove_junk_code这个字符串,那么这个程序中应该有垃圾代码。我们往上分析。 可以发现对v13进行处理的函数,跟进。这个函数我没有头绪,好垃圾。 看了大佬们的思路,才知道这段主要是base64解密。 这个地址是解码表, 我太菜了,过几天算法实验写完好好看看base64.以后遇到不懂得一定得弄懂...

weixin_30672019的博客 266

buu题解

逆向

m0_73393932的博客 471

BUUCTF pwn wp 11 - 15

ciscn_2019_n_8 int __cdecl main(int argc, const char **argv, const char **envp) { int v4; // [esp-14h] [ebp-20h] int v5; // [esp-10h] [ebp-1Ch] var[13] = 0; var[14] = 0; init(); puts("What's your name?"); __isoc99_scanf("%s", var, v4, v5);

fa1c4的blog 581

攻防世界 - Misc - Level 1 | reverseMe

本题考察的就是对本机画图工具的一个利用,Flag 给你了,咋让它变清晰就是你的问题了(妙用 “画图”)。

Blue17 の 小窝 1157

攻防世界pwn题--stack2

查看保护机制 (有栈不可执行NX,有canary保护) 用IDA分析(查看伪代码) int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax unsigned int v5; // [esp+18h] [ebp-90h] unsigned int v6; // [esp+1Ch] [ebp-8Ch] int v7; // [esp+20h] [ebp-88h] unsigned

L0g1c的博客 815

XCTF攻防世界MISC--reverseMe

得到一个图片直接水平反转就行

2402_87950092的博客 355

xctf攻防世界getit writeup

下载查看: ida64打开,f5分析: int __cdecl main(int argc, const char **argv, const char **envp) { char v3; // al@4 int result; // eax@10 __int64 v5; // rbx@10 __int64 v6; // [sp+0h] [bp-40h]@0 int i; // [sp+4h] [bp-3Ch]@7 FILE *stream; // [sp+8h] [..

qq_42983283的博客 695

BUU pwn 刷题

这里基本都是栈溢出题,没什么技术含量,只作为记录 [第五空间2019 决赛]PWN5 查看保护 开启了canary和栈不可执行保护 IDA反编译得到main函数 int __cdecl main(int a1) { unsigned int v1; // eax int fd; // ST14_4 int result; // eax char nptr; // [esp+4h] [ebp-80h] char buf; // [esp+14h] [ebp-70h] unsigned

qq_36495104的博客 1705

BUUCTF-逆向[GXYCTF2019]luck_guy1题解

BUUCTF-逆向[GXYCTF2019]luck_guy1题解,有关伪随机数知识和小端序存储知识

m0_62584974的博客 2700

z3求解器脚本(CTF-reverse必备)

CTF-reverse中有一类题目是通过约束方程求解变量的值,然后转化为对应的ASCII码,最终获得flag,约束方程以及要求解的未知数往往非常多,因此手算十分不现实,借助python中的z3模块可以很快完成求解!下面是某道CTF-reverse原题的反汇编代码,可以看到约束方程非常多,要求解的未知数也是多达16个,因此本篇用于记录z3求解器脚本方便使用。

这个博主不懒,但Ta什么也没写~(私信互关24小时必回) 3119

一眼就会用的KNN手写数字识别+字母识别代码+详细解读

包含了实验采用数据集;生成模型的源代码和模型;用于部署检测的识别代码;部分未完善代码;详细解读代码的pdf文案。

上一篇: 攻防世界 reverse 进阶 10 Reverse Box
下一篇: IgniteMe -高校网络信息安全运维挑战赛
deyou0823
博客等级 码龄12年 3粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值