开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 23274|回复: 4
收起左侧

[交流] 钉钉CTF瞎分析一波~

[复制链接]
结帖率:100% (3/3)
发表于 2018-10-12 20:48:51 | 显示全部楼层 |阅读模式   浙江省杭州市
本帖最后由 Breathless 于 2018-10-12 20:50 编辑

一、说明
钉钉CTF是一个网友昨晚给我的,比较简单,但是思路和AliCTF非常像,所以就放在一起了,一些坛友问工具怎么使用
其实很简单,在这也稍微加下使用说明,自己技术比较菜,全程靠猜~~~~~有什么不对的地方,还请各位师傅指点.

二、钉钉CTF
这一题比较简单,先打开app看下

随便输入

错了,但是有个welcome to flag blank!根据题目意思,尝试什么都不输入

什么??????居然就对了!!!!!
好了,开始看Ali的吧...............

算啦算啦,还是看看内部怎么实现的这么牛逼的功能的吧
  1. protected void onCreate(Bundle arg3) {
  2.         super.onCreate(arg3);
  3.         this.setContentView(2130968603);
  4.         this.text = this.findViewById(2131427416);
  5.         this.textView1 = this.findViewById(2131427418);
  6.         this.button = this.findViewById(2131427415);
  7.         this.button.setOnClickListener(new View$OnClickListener() {
  8.             public void onClick(View arg4) {
  9.                 MainActivity.this.c = new CheckClass();
  10.                 MainActivity.this.c.a(MainActivity.this.text.getText().toString());  //先获取输入的字符串
  11.                 if(MainActivity.this.c.check()) {  //关键点
  12.                     MainActivity.this.textView1.setText("flag is XMAN{" + MainActivity.this.text.getText().toString() + "}");   
  13.                 }
  14.                 else {
  15.                     MainActivity.this.textView1.setText("WORING!");
  16.                 }
  17.             }
  18.         });
  19.     }
复制代码

onCreate方法中,先看MainActivity.this.c.a
  1. public void a(String arg5) {
  2.         int v1 = 30;
  3.         this.A = new byte[v1];
  4.         this.B = arg5.getBytes();
  5.         int v0;
  6.         for(v0 = 0; v0 < arg5.length(); ++v0) {
  7.             this.A[v0] = this.B[v0];
  8.         }

  9.         this.B = new byte[v1];
  10.     }
复制代码

获取输入的字符串,再看MainActivity.this.c.check()
  1. public boolean check() {
  2.         boolean v9 = false;
  3.         int[] v0 = new int[]{40, 42, 65, 67, 68, 2, 64, 70, 96, 98, 181, 7, 10, 64, 23, 17, 37, 20, 45, 91, 74, 72, 135, 33, 57, 43, 87, 99, 147, 53};
  4.         byte[] v5 = new byte[]{52, 111, 102, 113, 52, 52, 98};
  5.         int v2 = 0;
  6.         int v4 = 0;
  7.         int v7 = 0;
  8.         int v1;
  9.         for(v1 = 0; v1 < v0.length; ++v1) {
  10.             int v8 = this.b(v0[v1]);
  11.             new String();
  12.             Log.d("now array:", String.valueOf(v8));
  13.             switch(v8) {
  14.                 case 0: {
  15.                     this.A[v7] = ((byte)(this.A[v7] ^ v7));
  16.                     break;
  17.                 }
  18.                 case 1: {
  19.                     if(this.A[v4] != 0) {
  20.                         ++v4;
  21.                     }
  22.                     else {
  23.                     }

  24.                     break;
  25.                 }
  26.                 case 2: {
  27.                     v5[v4] = ((byte)(v5[v4] ^ v4));
  28.                     ++v4;
  29.                     break;
  30.                 }
  31.                 case 3: {
  32.                     if(v5[v7] == this.A[v7]) {
  33.                         ++v7;
  34.                     }
  35.                     else {
  36.                     }

  37.                     break;
  38.                 }
  39.                 case 4: {
  40.                     if(v7 == v4) {
  41.                         v9 = true;
  42.                     }

  43.                     return v9;
  44.                 }
  45.                 case 5: {
  46.                     if(v4 != v5.length) {
  47.                         v1 = v0.length - 3;
  48.                     }
  49.                     else {
  50.                         v4 = 0;
  51.                     }

  52.                     break;
  53.                 }
  54.                 default: {
  55.                     ++v2;
  56.                     break;
  57.                 }
  58.             }
  59.         }

  60.         return v9;
  61.     }

  62. public int b(int arg4) {
  63.         int v0 = 181 & arg4;
  64.         return (v0 & 1) + ((v0 & 4) >> 2) + ((v0 & 16) >> 4) + ((v0 & 32) >> 5) + ((v0 & 128) >> 7);
  65.   }
复制代码

此函数为关键点,看着挺复杂的,只要返回为true即可
  1. case 4: {
  2.                     if(v7 == v4) {
  3.                         v9 = true;
  4.                     }
  5.                     return v9;
  6.                 }
复制代码

case 4里的判断执行,下面再接着分析v8
[Java] 纯文本查看 复制代码
int v8 = this.b(v0[v1]); 

由于v0是固定的,所以v8也是固定的,那么switch语句就好分析了
  1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;

  3. public class DCtf {
  4.          private static byte[] A;
  5.          private static byte[] B;
  6.         public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
  7.                 a("4");
  8.                 check();
  9.           }        
  10.         
  11.         public static void a(String arg5) {
  12.         int v1 = 30;
  13.         A = new byte[v1];
  14.         B = arg5.getBytes();
  15.         int v0;
  16.         for(v0 = 0; v0 < arg5.length(); ++v0) {
  17.             A[v0] = B[v0];
  18.         }

  19.         B = new byte[v1];
  20.     }

  21.     public static int b(int arg4) {
  22.         int v0 = 181 & arg4;
  23.         return (v0 & 1) + ((v0 & 4) >> 2) + ((v0 & 16) >> 4) + ((v0 & 32) >> 5) + ((v0 & 128) >> 7);
  24.     }

  25.     public static boolean check() {
  26.         boolean v9 = false;
  27.         int[] v0 = new int[]{40, 42, 65, 67, 68, 2, 64, 70, 96, 98, 181, 7, 10, 64, 23, 17, 37, 20, 45, 91, 74, 72, 135, 33, 57, 43, 87, 99, 147, 53};
  28.         byte[] v5 = new byte[]{52, 111, 102, 113, 52, 52, 98};
  29.         int v2 = 0;
  30.         int v4 = 0;
  31.         int v7 = 0;
  32.         int v1;
  33.         for(v1 = 0; v1 < v0.length; ++v1) {
  34.             int v8 = b(v0[v1]);
  35.             new String();
  36.             System.out.println("now array:" + String.valueOf(v8));
  37.             switch(v8) {
  38.                 case 0: {
  39.                     A[v7] = ((byte)(A[v7] ^ v7));
  40.                     break;
  41.                 }
  42.                 case 1: {
  43.                     if(A[v4] != 0) {
  44.                         ++v4;
  45.                     }
  46.                     else {
  47.                     }
  48.                     break;
  49.                 }
  50.                 case 2: {
  51.                     v5[v4] = ((byte)(v5[v4] ^ v4));
  52.                     ++v4;
  53.                     break;
  54.                 }
  55.                 case 3: {
  56.                     if(v5[v7] == A[v7]) {
  57.                             System.out.println("v5[v7] "+v5[v7]+"------A[v7] "+A[v7]+" "+v7);
  58.                         ++v7;
  59.                     }
  60.                     else {
  61.                     }
  62.                     break;
  63.                 }
  64.                 case 4: {
  65.                     if(v7 == v4) {
  66.                         v9 = true;
  67.                     }
  68.                     System.out.println("v7 "+v7+"------v4 "+v4);

  69.                     return v9;
  70.                 }
  71.                 case 5: {
  72.                     if(v4 != v5.length) {
  73.                         v1 = v0.length - 3;
  74.                     }
  75.                     else {
  76.                         v4 = 0;
  77.                     }

  78.                     break;
  79.                 }
  80.                 default: {
  81.                     ++v2;
  82.                     break;
  83.                 }
  84.                
  85.             }
  86.         }

  87.         return v9;
  88.     }
  89. }
复制代码

运行上面的代码,可以得到v8的值分别是
  1. now array:1
  2. now array:1
  3. now array:1
  4. now array:1
  5. now array:1
  6. now array:0
  7. now array:0
  8. now array:1
  9. now array:1
  10. now array:1
  11. now array:5
  12. now array:3
  13. now array:4
复制代码

最后执行的就是case 4,符合我们前面的分析,但是v7 == v4,能影响v7的只有case 3这个分支,看上面v8的值,知道下面的代码只执行了一次
  1. case 3: {
  2.                     if(v5[v7] == this.A[v7]) {
  3.                         ++v7;
  4.                     }
  5.                     else {
  6.                     }
  7.                     break;
  8.                 }
复制代码

所以要想v7 == v4,v7和v4只能为1或者0,0就是什么都不输入,++v7执行之后为1,执行之前v7为就为0,所以A[v7]=52,查找ascall码表结果为4

分析到这,你就认为完了?然后并没有结束、、、、
  1. case 5: {
  2.                                 if (v4 != v5.length) {
  3.                                         v1 = v0.length - 3;
  4.                                 } else {
  5.                                         v4 = 0;
  6.                                 }

  7.                                 break;
  8.                         }
复制代码

上面的分析的是v4 != v5.length结果,如果v4 = v5.length呢,继续往下分析吧,也就是输入的字符串为7位
  1. now array:1
  2. now array:1
  3. now array:1
  4. now array:1
  5. now array:1
  6. now array:0
  7. now array:0
  8. now array:1
  9. now array:1
  10. now array:1
  11. now array:5
  12. now array:2
  13. now array:0
  14. now array:0
  15. now array:3
  16. v5[v7] 52------A[v7] 52 v7 0
  17. now array:2
  18. now array:3
  19. now array:2
  20. now array:3
  21. now array:2
  22. now array:0
  23. now array:0
  24. now array:3
  25. now array:2
  26. now array:3
  27. now array:2
  28. now array:3
  29. now array:2
  30. now array:3
  31. now array:4
  32. v7 1------v4 7
复制代码

控制v7的的case只有一个
  1. case 3: {
  2.                                 if (v5[v7] == A[v7]) {
  3.                                         System.out.println("v5[v7] " + v5[v7] + "------A[v7] " + A[v7] + " v7 " + v7);
  4.                                         ++v7;
  5.                                 } else {
  6.                                 }
  7.                                 break;
  8.                         }
复制代码

根据上面的代码循环,可以慢慢倒推出来结果为4ndr01d,真是一波三折呀。。。

放下分析的代码
  1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;

  3. public class ctf1 {
  4.         private static byte[] A;
  5.         private static byte[] B;

  6.         public static void main(String[] args) throws InvalidKeyException, NoSuchAlgorithmException {
  7.                 a("4ndr01d");
  8.                 check();
  9.         }

  10.         public static void a(String arg5) {
  11.                 int v1 = 30;
  12.                 A = new byte[v1];
  13.                 B = arg5.getBytes();
  14.                 int v0;
  15.                 for (v0 = 0; v0 < arg5.length(); ++v0) {
  16.                         A[v0] = B[v0];
  17.                 }

  18.                 B = new byte[v1];
  19.         }

  20.         public static int b(int arg4) {
  21.                 int v0 = 181 & arg4;
  22.                 return (v0 & 1) + ((v0 & 4) >> 2) + ((v0 & 16) >> 4) + ((v0 & 32) >> 5) + ((v0 & 128) >> 7);
  23.         }

  24.         public static boolean check() {
  25.                 boolean v9 = false;
  26.                 int[] v0 = new int[] { 40, 42, 65, 67, 68, 2, 64, 70, 96, 98, 181, 7, 10, 64, 23, 17, 37, 20, 45, 91, 74, 72,
  27.                                 135, 33, 57, 43, 87, 99, 147, 53 };
  28.                 byte[] v5 = new byte[] { 52, 111, 102, 113, 52, 52, 98 };
  29.                 int v2 = 0;
  30.                 int v4 = 0;
  31.                 int v7 = 0;
  32.                 int v1;
  33.                 for (v1 = 0; v1 < v0.length; ++v1) {
  34.                         int v8 = b(v0[v1]);
  35.                         new String();
  36.                         System.out.println("now array:" + String.valueOf(v8));
  37.                         switch (v8) {
  38.                         case 0: {
  39.                                 A[v7] = ((byte) (A[v7] ^ v7));
  40.                                 break;
  41.                         }
  42.                         case 1: {
  43.                                 if (A[v4] != 0) {
  44.                                         ++v4;
  45.                                 } else {
  46.                                 }
  47.                                 break;
  48.                         }
  49.                         case 2: {
  50.                                 v5[v4] = ((byte) (v5[v4] ^ v4));
  51.                                 ++v4;
  52.                                 break;
  53.                         }
  54.                         case 3: {
  55.                                 if (v5[v7] == A[v7]) {
  56.                                         System.out.println("v5[v7] " + v5[v7] + "------A[v7] " + A[v7] + " v7 " + v7);
  57.                                         ++v7;
  58.                                 } else {
  59.                                 }
  60.                                 break;
  61.                         }
  62.                         case 4: {
  63.                                 if (v7 == v4) {
  64.                                         v9 = true;
  65.                                 }
  66.                                 System.out.println("v7 " + v7 + "------v4 " + v4);
  67.                                 return v9;
  68.                         }
  69.                         case 5: {
  70.                                 if (v4 != v5.length) {
  71.                                         v1 = v0.length - 3;
  72.                                 } else {
  73.                                         v4 = 0;
  74.                                 }

  75.                                 break;
  76.                         }
  77.                         default: {
  78.                                 ++v2;
  79.                                 break;
  80.                         }

  81.                         }
  82.                 }

  83.                 return v9;
  84.         }
  85. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1好评 +1 精币 +2 收起 理由
aib + 1 + 2 新技能已get√

查看全部评分

发表于 2020-8-20 11:41:25 | 显示全部楼层   河南省开封市
感谢分享
谁有CTF移动比较多的网站 私聊我下呗
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 1 天

发表于 2020-8-10 15:43:36 | 显示全部楼层   福建省厦门市
什么鬼?  这是做什么用
回复 支持 反对

使用道具 举报

结帖率:80% (33/41)
发表于 2018-10-12 22:57:23 | 显示全部楼层   广东省广州市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 24 天

发表于 2018-10-12 20:55:26 | 显示全部楼层   广东省云浮市
没看懂的举个爪子表示我们存在过。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表