攻防世界安卓刷题笔记(新手模式)1-4

1.基础android

进入后是这样的页面。查看源代码看看。首先要注意这个软件并没有加壳,所以我们可以直接着手分析。搜索错误提示"Failed"定位到关键代码,看样子就是检验输入的内容

注意到这里有一行关键代码,cond_39对应的正是failed那个地方,我们直接采用修改跳转条件的方法,看看会不会直接提示出flag。

进去是进去了,结果还有第二关,看样子貌似和图片隐写相关?这里先存疑,继续分析代码 。这里并没有错误提示,不太好直接定位。那么我们就从图片入手,看看图片本身是否存在问题。

并没有直接找到图片,而是找到了一个压缩包。怀疑压缩包内部有猫腻,但是解压失败,利用winhex分析文件头,可知这其实是一个jpg文件。用电脑打开后就是flag。软件故意让图片显示不完全,因为flag其实被用文字的方式放在原图女士裙子上,如下图所示

2. android2.0

老办法定位到了关键代码, 看来关键就是在type!本来在上面看到一个pwd的资源id挺开心的,结果发现原来这只是代表输入框,那么思路还需要改变一下,如何改变呢?

其实,只要输入的内容符合great的要求,就会提示great,因此我们要找到特定的算法

看看这个就像是函数的东西干了什么事

问了AI,意思是调用了一个so文件。so文件在IDA里面打开就行了,锁定到一个JAVA开头的函数,反编译得到:

看样子v4就是目标字符串 。查看WP,这是一种分组加密。(原谅我逆向功底差,只能看wp)

下面代码估计是分组的实现,由%3推测是分了3组,v5一直在加一,应该是实现索引的。

第一组的关键代码

注意这里传的参数是指针,也就是v5这个字符串已经变成加密后的了。这个会影响第二组的操作。

根据算法,要让a1==那个字符串。a1就是经过异或后的v5,反向操作以下就行。简单编写python得到:

python 复制代码
a='LN^d'
b=''
i=0
#原c++循环在4终止 等于说剩下一个l没有异或
while(i<4):
    b+=(chr(int((ord(a[i])^128)/2)))
    i+=1
print(b+'l')

得到结果fgorl

第二组:

a5就是图示的byte_2888!

首先双击a5,选中a5的所有元素,点击shift+e导出。然后继续在python里面写exp!

python 复制代码
a=[32, 53, 45, 22, 97]
b='LN^dl'
for i in range(0,4):
    a[i]=a[i]^ord(b[i])
    print(chr(a[i]),end='')
print(chr(a[4]))

得到l{sra。

V7则和第二组一样的解密思路。结果是asoy}

第三组解题代码如下:

python 复制代码
#只需要前四组就好
a=[32, 53, 45, 22]
b='AFBo'
c=''
for i in range(0,4):
    c+=chr(a[i]^ord(b[i]))
print(c)

三组字符进行栅栏解密就好啦/

3.APK逆向

这道题很直白,而且进去就让输入flag。我们直接用MT管理器打开看。这道题并没有加固,所以可以直接分析dex文件。

在arsc搜索错误提示,定位到代码位置。

改一个这里的代码看看会不会扭转提示。提示确实变了,但是没有弹出来flag,转变思路

java 复制代码
//
// Decompiled by Jadx - 562ms
//
package com.example.crackme;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MainActivity extends Activity {
    private Button btn_register;
    private EditText edit_sn;
    String edit_userName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(0x7f040019);
        setTitle(0x7f06001d);
        this.edit_userName = "Tenshine";
        this.edit_sn = (EditText) findViewById(0x7f0c0051);
        this.btn_register = (Button) findViewById(0x7f0c0052);
        this.btn_register.setOnClickListener(new MainActivity$1(this));
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(0x7f0d0000, menu);
        return true;
    }

    public boolean checkSN(String userName, String sn) {
        if (userName == null) {
            return false;
        }
        try {
            if (userName.length() == 0 || sn == null || sn.length() != 22) {
                return false;
            }
            MessageDigest digest = MessageDigest.getInstance("MD5");
            digest.reset();
            digest.update(userName.getBytes());
            byte[] bytes = digest.digest();
            String hexstr = toHexString(bytes, "");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hexstr.length(); i += 2) {
                sb.append(hexstr.charAt(i));
            }
            String userSN = sb.toString();
            return new StringBuilder().append("flag{").append(userSN).append("}").toString().equalsIgnoreCase(sn);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return false;
        }
    }

    private static String toHexString(byte[] bytes, String separator) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 255);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex).append(separator);
        }
        return hexString.toString();
    }
}

但是浏览到MAINactivity,确实发现了关键代码,看起来就是MD5加密。分析代码查看。

注意看这一块代码,首先对指定的消息md5加密,而后通过循环,每2次循环就取出一个数,当作flag。用PY的切片秒了

4.人民的名义:抓捕赵德汉

点进去,映入眼帘的就是一个main函数。

大致意思就是获取用户输入的字符串,然后调用checkPassword方法进行检查,如果正确就是提示正确,否则让你检查。

定位到checkPassword方法。

看一下boolean方法,结尾是返回hashbytes是否等于后面的那一串(怀疑是MD5加密后的结果),大胆猜测是先对输入的数据进行md5摘要计算,然后再进行下面方法的计算,最后看计算的结果是否等于给定的数值

(错误做法!!!)

询问豆包验证了自己的猜想,那么接下来就是分析如何实现的算法。

首先定义了一个循环,循环内首先求解出halfbyte,然后看do...while。这个do...while只会进行两次,因为第一次,计数器i会被two_halfs计算为0,而后第二次i就会变成1,不满足条件,终止循环。在这个循环之中,根据half byte的不同规则,添加进了最终的数组。

要想倒回去,就要逆向分析。原代码的forxunhuanl多少次?每循环一次for,do..while进行两次,也就是添加两个数进结果。结果的十六进制一共是32位,因此for循环进行16次。下面根据for循环来写出解题代码:

解出来有负数?

正确思路

其实下面的方法的用处不是对md5进行复杂的操作,而是把字节数组转为十六进制。我也是参考了wp才发现这一个问题!所以直接对md5进行解密就可以了。

相关推荐
悟空非空也26 分钟前
178K⭐排名第一计算机面试笔记
笔记·面试·职场和发展
Eshin_Ye1 小时前
transformer学习笔记-自注意力机制(1)
笔记·学习·transformer·attention·注意力机制
索然无味io2 小时前
SQL注入--Access注入
数据库·笔记·sql·学习·mysql·网络安全
Octopus20772 小时前
【Linux】git操作
linux·笔记·git·学习
从善若水2 小时前
【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片
笔记·学习·rust
荷逸同学2 小时前
小红书笔记采集链接版 | 同步飞书
笔记·飞书
努力学习的少女2 小时前
linux/centOS7用户和权限管理笔记
linux·运维·笔记
阿龍17873 小时前
个人ffmpeg笔记(一)
笔记·ffmpeg
Jozky864 小时前
Carla自带样例:automatic_control.py解析
笔记·carla