buu 逆向 刮开有奖 [ACTF新生赛2020]easyre 简单注册器

刮开有奖

这题写的比较抽象(刚刚开始学re)

感觉没有明显的字符串的提示,最后的flag都有种猜的感觉

首先在main函数种找到flag藏的关键位置

image-20250219112545573

看到这里有可疑的字符串,基本上就可以确定flag在这里有,起码部分是有的

点开 sub_4010F0函数,发现是一个排序的函数

image-20250219112732995

这里把伪代码转换成c语言

int __cdecl sub_4010F0(char *a1, int a2, int a3)
{
  int result; // eax
  int i; // esi
  int v5; // ecx
  int v6; // edx

  result = a3;
  for ( i = a2; i <= a3; a2 = i )
  {
    v5 = i;
    v6 = i[a1];
    if ( a2 < result && i < result )
    {
      do
      {    
        if (v6 > (a1[result] ))
        {
          if ( i >= result )
            break;
          ++i;
          a1[v5] = a1[result];
          if ( i >= result )
            break;
          while ( a1[i]<= v6 )
          {
            if ( ++i >= result )
              goto LABEL_13;
          }
          if ( i >= result )
            break;
          v5 = i;
          (a1[result]) = (a1[i]);
        }
        --result;
      }
      while ( i < result );
    }
LABEL_13:
    (a1[result]) = v6;
    sub_4010F0(a1, a2, i - 1);
    result = a3;
    ++i;
  }
  return result;
}

注意伪代码的反汇编有些地址和数组之间的转换还是要注意的

把上面的字符串填进去得到

image-20250219112950310

接着进入sub_401000这个函数,仍入ai发现是base64编码

放到赛博厨子里面

image-20250219111749861

image-20250219112214916

此时,我们只要做最后的flag拼接就好了

image-20250219113253506

注意这里的v8 v13 v7都是换完顺序后的编码

a=chr(ord('3') + ord('\x22'))
print(a)
a=chr((ord('\x8D')+3*ord('\x45'))//4)
print(a)

b=chr(int(ord('Z')/9)*8)
print(b)

最后因为WP这两个字符出现了所以我们可以去先拼接第二个base64出来的字符串得到flag{UJWP1jMp}

[ACTF新生赛2020]easyre

[【每日逆向】BUUCTF–ACTF新生赛2020] easyre (mfbz.cn)

首先这个需要脱壳,万能脱壳秒了

image-20250219193335073

接着我们打开ida

image-20250219193418354

把在前面的字符按y整理一下

这里是一个映射的关系

image-20250219193829698

image-20250219193942547

点进去可以找到对应的表,因为我们是逆向flag,所以问你只需+1找对应的表

key='~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'
encrypt=[42,70,39,34,78,44,34,40,73,63,43,64]

x=[]
flag=''
for i in encrypt:
    x.append(key.find(chr(i))+1)

for i in x:
    flag+=chr(i)

print(flag)

简单注册器

chatgpt可以直接写出这题,卡在这题的可以去问问ai

这是个安卓逆向

用jadx打开软件

image-20250219210613706

 public void onClick(View v) {
                int flag = 1;
                String xx = editview.getText().toString();
                if (!(xx.length() == 32 && xx.charAt(31) == 'a' && xx.charAt(1) == 'b' && (xx.charAt(0) + xx.charAt(2)) - 48 == 56)) {
                    flag = 0;
                }
                if (flag == 1) {
                    char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray();
                    x[2] = (char) ((x[2] + x[3]) - 50);
                    x[4] = (char) ((x[2] + x[5]) - 48);
                    x[30] = (char) ((x[31] + x[9]) - 48);
                    x[14] = (char) ((x[27] + x[28]) - 97);
                    for (int i = 0; i < 16; i++) {
                        char a = x[31 - i];
                        x[31 - i] = x[i];
                        x[i] = a;
                    }
                    textview.setText("flag{" + String.valueOf(x) + "}");
                    return;
                }

可以看到。这里对flag进行了加密之类的

我们用python还原一下代码

def generate_flag():
    x = list("dd2940c04462b4dd7c450528835cca15")

    # 按照 Java 代码修改字符
    x[2] = chr((ord(x[2]) + ord(x[3])) - 50)
    x[4] = chr((ord(x[2]) + ord(x[5])) - 48)
    x[30] = chr((ord(x[31]) + ord(x[9])) - 48)
    x[14] = chr((ord(x[27]) + ord(x[28])) - 97)

    # 反转前 16 位字符
    for i in range(16):
        x[i], x[31 - i] = x[31 - i], x[i]

    return "flag{" + "".join(x) + "}"

print(generate_flag())

) + ord(x[9])) - 48)
x[14] = chr((ord(x[27]) + ord(x[28])) - 97)

# 反转前 16 位字符
for i in range(16):
    x[i], x[31 - i] = x[31 - i], x[i]

return "flag{" + "".join(x) + "}"

print(generate_flag())


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值