s1986q 发表于 2024-11-5 17:44

这个ctf怎么解

本帖最后由 s1986q 于 2024-11-5 20:24 编辑

//
// Decompiled by Jadx (from NP Manager)
//
package com.ctf.dadroid;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Arrays;

public class MainActivity extends ActionBarActivity {
    private void crack(String str) {
      char[] b = new char[]{'M', '=', '+', 198, 250, 192, 226, 254, 236, 232, 224, 233, 214, 227, 255, 171, 254, 209, 225, 255, 229, 205, 231, 252, 240, 201, 229, 253, 248, 246, 196, 250, 241, 255, 248, 255, 201, 195, 203, 197, 205, 199, 207, 201, 193, 203, 195, 205, 197, 207, 210};
      System.out.println(b.length);
      char[] c = str.toCharArray();
      int l = c.length;
      char m = c;
      for (int i = 0; i < l; i++) {
            int i2 = (c ^ m) & 255;
            m = (char) (m + 1);
            c = (char) i2;
      }
      result(c, b);
    }

    private void result(char[] cArr, char[] cArr2) {
      if (Arrays.equals(cArr, cArr2)) {
            Toast.makeText(this, "yes", 1).show();
      } else {
            Toast.makeText(this, "no", 1).show();
      }
    }

    public void confirm(View view) {
      crack(((EditText) findViewById(2131296320)).getText().toString());
    }

    public boolean onOptionsItemSelected(MenuItem menuItem) {
      return menuItem.getItemId() == 2131296321 ? true : super.onOptionsItemSelected(menuItem);
    }

    protected void onCreate(Bundle bundle) {
      super.onCreate(bundle);
      setContentView(2130968599);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(2131558400, menu);
      return true;
    }
}

这个ctf可以逆推吗

__▂寒江雪▂__ 发表于 2024-11-5 21:44

本帖最后由 __▂寒江雪▂__ 于 2024-11-5 21:47 编辑

题目意思是输入的字符串通过一系列计算后,能够和预先给出的char字符一致

这个题关键点在于m值假设是最后一次循环,那最后一次计算是 x ^(x+50)&255= 210,写个0-255的循环爆破能算出来一堆x值,其中一个x值就是循环第一次的m值
那这么多m哪个才是呢?其实这里靠脑子,CTF flag答案一般是以}结尾的, } 的字符值是125 所以猜m是125

有了m的值,爆破flag的每个字符即可

chars =

size = len(chars)
key = []
def crack(index, m):
    for x in range(256):
      if x ^ (m+index) & 255 == chars:
            key.append(chr(x))


index = 0
while index < size:
    crack(index, 125)
    index += 1

print "".join(key)



结果:0CTF{Bazinga_it's_not_the_real_flag_hahahahahahaha}
emmmm算了半天,好像你走错路了

syzry 发表于 2024-11-5 21:44

可以逆推,但你这推出来的是fake flag啊,是0CTF{Bazinga_it's_not_the_real_flag_hahahahahahaha}。
真正的flag藏在你那题的其他地方吧

s1986q 发表于 2024-11-5 21:54

__▂寒江雪▂__ 发表于 2024-11-5 21:44
题目意思是输入的字符串通过一系列计算后,能够和预先给出的char字符一致

这个题关键点在于m值假设是 ...

谢谢你的回复
页: [1]
查看完整版本: 这个ctf怎么解