zoukankan      html  css  js  c++  java
  • LCTF (easy100)

    先安装跑一下,不知道为啥我这里模拟器打不开,传到手机上就可以。如下图。

    一个输入框,一个按钮,随便输入提示no。

    放入JEB反编译。

    可以看到有6个Class。大体看一遍,b和e应该和解题无关,在类a中有AES字眼,那么大致思路就有了:找KEY和加密后的字符串,通过AES对称解密的机制得到正确输入。

    不知道是出题人故意的还是编程习惯就是不好,每个类命名为abcd,类中的函数也命名为abcd,看代码会有点绕,耐心找一下其实还是挺简单的。

    先从类d开始逆向分析,调用MainActivity中的a函数,这个a传入三个形参的a,如下图

    然后接着调用两个形参的a,如下图

    再调用类c中的a函数,返回的结果与后面的字符串作比较,return一个布尔值。显然这串字符串就是要找的加密后的字符串了,如果再能找到AES中的KEY此题就解决了。

    查看类c中的a函数。

    上来先给v0赋值,用的是arg5调用类c中a函数的返回值。如下图

    这里我卡住了好一会,原因是这个参数值不知道是什么,后来在MainActicity中发现。

     

    //我是做出这个题之后查了百度才知道,一个activity启动调用的第一个函数就是onCreate,它主要做这个activity启动时一些必要的初始化工作。

    这个v是MainActicity的一个私有String变量,在p函数中进行了赋值,函数很容易理解,把url.png中的第144个字节开始的16长度的字节变成String后赋值给v。144=0x90,打开winhex直接查看,如下图

    现在KEY和字符串都已经找到(注意KEY还要经过变化的),最后写个脚本就OK了,我是用JAVA写的,直接复制黏贴JEB中反编译的代码,十分方便。。。

     1 import java.io.IOException;
     2 import java.security.InvalidKeyException;
     3 import java.security.NoSuchAlgorithmException;
     4 import javax.crypto.BadPaddingException;
     5 import javax.crypto.Cipher;
     6 import javax.crypto.IllegalBlockSizeException;
     7 import javax.crypto.NoSuchPaddingException;
     8 import javax.crypto.spec.SecretKeySpec;
     9 
    10 public class MainActivity {
    11     public static void main(String[] args) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    12         StringBuilder v1 = new StringBuilder();
    13         int v0_1;
    14         String v0_2;
    15         String arg4 = "this_is_the_key.";    //在winhex中发现
    16         for(v0_1 = 0; v0_1 < arg4.length(); v0_1 += 2) {  //对KEY进行二次变换,这是有类c中的函数分析得到的
    17             v1.append(arg4.charAt(v0_1 + 1));
    18             v1.append(arg4.charAt(v0_1));
    19         }
    20         v0_2 = v1.toString();
    21         byte key[] = v0_2.getBytes();     //转换成Bytes数组
    22         SecretKeySpec a;
    23         Cipher b;
    24         a = new SecretKeySpec(key, "AES");
    25         b = Cipher.getInstance("AES/ECB/PKCS5Padding");
    26         byte flag[] = {21, -93, -68, -94, 86, 117, -19, -68, 
    27                 -92, 33, 50, 118, 16, 13, 1, -15, -13, 3, 4, 103, -18, 81, 30, 68, 54, -93, 44, -23, 
    28                 93, 98, 5, 59};
    29         b.init(Cipher.DECRYPT_MODE,a);    //这里注意前面的参数,选择相应的解密参数
    30         
    31 //        String sflag = b.doFinal(flag).toString();   一开始我是这样写的,结果不对,必须要向下面这样转utf-8才行
    32         String AES_decode=new String(b.doFinal(flag),"utf-8");
    33         System.out.println(AES_decode);
    34     }
    35 }
  • 相关阅读:
    Ionic Cordova 环境配置window
    滚动条超出表格标题,表格标题固定
    逗号分隔查询
    sulin LuceneNet 搜索二
    LuceneNet 搜索一
    Sql 竖表转横表
    div 无缝滚动
    【bfs】【中等难度】wikioi3055 青铜莲花池
    【bfs】【中等难度】tyvj P1234
    【简单思考】noip模拟赛 NTR酋长
  • 原文地址:https://www.cnblogs.com/sweetbaby/p/10903159.html
Copyright © 2011-2022 走看看