欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019UNCTF-RE-very_easy_re

程序员文章站 2022-05-15 11:51:01
...


每天一题,只能多不能少

very_easy_re

题目解析

的确是very easy,不过不是对我。base64再加简单的转换。

开始

1.题目

给出一个exe程序。

2.查壳

32位,无壳

3.IDA静态分析

丢进IDA。习惯性查字符,找到input。跟踪,交叉,伪代码,得到

sub_411320(&unk_423025);
  i = 0;
  v9 = 1;
  sub_411299(std::cout, "Please input your key:");
  sub_411136(std::cin, &Str);
  v0 = j_strlen(&Str);
  v8 = (char *)sub_4114FB((int)&Str, v0);
  if ( j_strlen(v8) >= 0x18 )
  {
    for ( i = 0; ; ++i )
    {
      v2 = j_strlen(v8);
      if ( i >= v2 )
        break;
      if ( i < 8 )
        ++v8[i];
      if ( i >= 8 && i < 16 )
        v8[i] += 3;
      if ( i >= 16 && i < 24 )
        v8[i] += 3;
      if ( i >= 24 && i < 32 )
        v8[i] += 4;
    }
    strcpy(v6, "WV6EWF[8dGU5]Y<pQZ8iPZ8iSKk7gnh=");
    for ( i = 0; ; ++i )
    {
      v3 = j_strlen(v8);
      if ( i >= v3 )
        break;
      if ( v8[i] != v6[i] )
      {
        sub_411299(std::cout, "Oh,there is the last step.But you are wrong");
        goto LABEL_23;
      }
    }
    sub_411299(std::cout, "Congratulations!!!You Get The Flag!!!");
  }
  else
  {
    sub_411299(std::cout, "It's a long walk~~~~");
  }

流程很清楚,输入的字符,经过一个子程序的加密后,再经过中间一段的处理,得到的结果与已系统存储的字符串比对,相同的话就表扬你。那就是把系统保存的字符串进行逆向处理就可以了。
先看下处理子程序。
2019UNCTF-RE-very_easy_re
2019UNCTF-RE-very_easy_re
像不像base64?反正我觉得很像。
再回到主函数看下下面的处理部分

for ( i = 0; ; ++i )
    {
      v2 = j_strlen(v8);
      if ( i >= v2 )
        break;
      if ( i < 8 )
        ++v8[i];
      if ( i >= 8 && i < 16 )
        v8[i] += 3;
      if ( i >= 16 && i < 24 )
        v8[i] += 3;
      if ( i >= 24 && i < 32 )
        v8[i] += 4;
    }

很简单吧?

4.上脚本

#!python3
# -*- coding: utf-8 -*-
# @Time : 2020/11/13 16:23
# @Author : A.James
# @FileName: very_easy_re_exp.py
import base64
'''
for ( i = 0; ; ++i )
    {
      v2 = j_strlen(v8);
      if ( i >= v2 )
        break;
      if ( i < 8 )
        ++v8[i];
      if ( i >= 8 && i < 16 )
        v8[i] += 3;
      if ( i >= 16 && i < 24 )
        v8[i] += 3;
      if ( i >= 24 && i < 32 )
        v8[i] += 4;
    }
'''
cipher = 'WV6EWF[8dGU5]Y<pQZ8iPZ8iSKk7gnh='
print(len(cipher))
cipher1 = ''
for i in range(len(cipher)):
    if i < 8:
        cipher1 += chr(ord(cipher[i] ) - 1)
    if i >= 8 and i < 16:
        cipher1 += chr(ord(cipher[i]) - 3)
    if i >= 16 and i < 24:
        cipher1 += chr(ord(cipher[i]) - 3)
    if i >= 24 and i < 32:
        cipher1 +=chr(ord(cipher[i]) - 4)
print(cipher1)
flag = base64.b64decode(cipher1)
print(flag)

5.get flag

UNCTF{h4ve_f5n_1n_8h7r7}

结语

十分适合我这种菜鸡的re签到题。

相关标签: REVERSE