【逆向分析】BUUCTF 逆向题目 findit

admin 2023年12月10日08:22:15评论24 views字数 3394阅读11分18秒阅读模式

BUUCTF 逆向题目 findit

题目地址:

https://buuoj.cn/challenges#findit

【逆向分析】BUUCTF 逆向题目 findit

https://files.buuoj.cn/files/41f7c51e14897f707e3855352e386da1/6a428ff2-25d7-403c-b28e-3f980a10a5a2.apk.zip

【逆向分析】BUUCTF 逆向题目 findit

差生文具多,比拼工具的时候到了

【逆向分析】BUUCTF 逆向题目 findit

综合对比下,选用jadx-gui

【逆向分析】BUUCTF 逆向题目 findit

package com.example.findit;
import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;
/* loaded from: classes.dex */public class MainActivity extends ActionBarActivity { /* JADX INFO: Access modifiers changed from: protected */ @Override // android.support.v7.app.ActionBarActivity, android.support.v4.app.FragmentActivity, android.app.Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.widget3); final EditText edit = (EditText) findViewById(R.id.widget2); final TextView text = (TextView) findViewById(R.id.widget1); final char[] a = {'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e'}; final char[] b = {'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}'}; btn.setOnClickListener(new View.OnClickListener() { // from class: com.example.findit.MainActivity.1 @Override // android.view.View.OnClickListener public void onClick(View v) { char[] x = new char[17]; char[] y = new char[38]; for (int i = 0; i < 17; i++) { if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) { x[i] = (char) (a[i] + 18); } else if ((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z')) { x[i] = (char) (a[i] - 'b'); } else { x[i] = a[i]; } } String m = String.valueOf(x); if (m.equals(edit.getText().toString())) { for (int i2 = 0; i2 < 38; i2++) { if ((b[i2] >= 'A' && b[i2] <= 'Z') || (b[i2] >= 'a' && b[i2] <= 'z')) { y[i2] = (char) (b[i2] + 16); if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') { y[i2] = (char) (y[i2] - 26); } } else { y[i2] = b[i2]; } } String n = String.valueOf(y); text.setText(n); return; } text.setText("答案错了肿么办。。。不给你又不好意思。。。哎呀好纠结啊~~~"); } }); }
@Override // android.app.Activity public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}

分析上述代码,

直接比对上面代码依葫芦画瓢编写C++代码

#include<iostream>
using namespace std;
int main() { char a[] = {'T', 'h', 'i', 's', 'I', 's', 'T', 'h', 'e', 'F', 'l', 'a', 'g', 'H', 'o', 'm', 'e'}; char b[] = {'p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}'};
int x[17] = {0}; int y[38] = {0};

for (int i = 0; i < 17; i++) { if ((a[i] < 'I' && a[i] >= 'A') || (a[i] < 'i' && a[i] >= 'a')) { x[i] = (char) (a[i] + 18); } else if ((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z')) { x[i] = (char) (a[i] - 'b'); } else { x[i] = a[i]; } }

for (int i = 0; i < 17; i++) cout << (char) x[i];
putchar('n'); for (int i2 = 0; i2 < 38; i2++) { if ((b[i2] >= 'A' && b[i2] <= 'Z') || (b[i2] >= 'a' && b[i2] <= 'z')) {            y[i2] = (b[i2] + 16);  //特别注意:此处使用(char)容易超出有效的字符范围,导致字符溢出或乱码 if ((y[i2] > 'Z' && y[i2] < 'a') || y[i2] >= 'z') { y[i2] = (char) (y[i2] - 26); } } else { y[i2] = b[i2]; } }

for (int i = 0; i < 38; i++) cout << (char) y[i];
return 0;}

【逆向分析】BUUCTF 逆向题目 findit

避坑指南

1.

int x[17] = {0};int y[38] = {0};

这里的 x y 数组要用整型 int ,如果用 char 数据会越界,出现乱码。

2.

在某些情况下,(char) (b[i2] + 16) 的结果可能会超出有效的字符范围,导致字符溢出或乱码。这是因为加法运算可能使字符的 ASCII 值超出表示字符的范围。

在这种情况下,你可以考虑使用无符号字符(unsigned char)类型,以确保不会发生符号溢出问题。这是因为char的默认是有符号类型,如果发生溢出,可能导致负数的结果。

y[i2] = static_cast<unsigned char>(b[i2] + 16);

在这里,使用static_cast<unsigned char>将 b[i2] + 16 的结果转换为无符号字符,以避免符号溢出问题。

flag{c164675262033b4c49bdf7f9cda28a75}

原文始发于微信公众号(利刃信安攻防实验室):【逆向分析】BUUCTF 逆向题目 findit

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月10日08:22:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【逆向分析】BUUCTF 逆向题目 findithttps://cn-sec.com/archives/2284170.html

发表评论

匿名网友 填写信息