Insomni’Droid

뭔지 모르겠는 프로그램이다. Nox 에 올려서 한번 보도록 하자.
디컴파일 해서 보면 그래도 난독화된거 같지는 않다.
함 봅시다
먼저 a 를 보면
package com.fortiguard.insomnihack2012.challenge; import android.view.View; final class a implements View.OnClickListener { private /* synthetic */ InsomniActivity a; a(InsomniActivity insomniActivity) { this.a = insomniActivity; } public final void onClick(View view) { if (b.a(this.a.a.getText().toString())) { this.a.b.setText("Congrats! -- FortiGuard Team"); this.a.a.setEnabled(false); return; } this.a.b.setText("Sorry, try harder!"); } }
Java
b.a 가 있어야 Congrats 가 나온다. 그럼 2개를 알아야겠다.
1) b.a 의 기능
2) 인자인 this.a.a.getText().toString()
2번이 쉬워보이니까 2번부터 해보자.
a는 insomniActivity 를 의미한다 바로 위에 코드에 나와있다.
b 클래스를 봅시다.
public final class b { public static byte[] a = {-34, -83, -66, -17, 101, 112, 105, 99, 32, 102, 97, 105, 108, 1, 2, 3}; private static final byte[] b = {97, 82, 88, 126, -34, -118, 38, -11, 63, -45, -111, -80, 85, -44, -34, 80, 30, -24, -78, 73, Byte.MAX_VALUE, -25, 79, -113, -42, -97, 44, 114, -30, -13, -29, 122}; private static final byte[] c = {-20, 52, 39, 29, 15, -105, 64, 78, -11, -23, 92, -94, -2, 13, -124, 33}; private static final byte[] d = {-81, 91, 73, 122, 125, -10, 52, 61, -44, -55, 24, -51, -112, 121, -92, 83, -119, 25, 82, 110, 106, -73, 1, 11, -90, -55, 31, -10, -84, 45, -25, 78, -103, 90, 83, 120, 125, -28, 96, 117, -36, -55, 15, -57, -99, Byte.MAX_VALUE, -31, 85, -52, 119, 72, 121, 106, -73, 41, 61, -49, -55, 110, -49, -107, 107, -23, 73, -34, 70, 23, 117, 100, -10, 43, 43, -86, -124, 109, -112, -51, 57, -79, 23}; private static final byte[] e; static { byte[] bArr = new byte[16]; bArr[1] = 1; bArr[2] = 2; bArr[3] = 3; bArr[5] = 1; bArr[6] = 2; bArr[7] = 3; bArr[15] = 1; e = bArr; } public static void a(byte[] bArr) { try { SecretKeySpec secretKeySpec = new SecretKeySpec(bArr, "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(e); Cipher instance = Cipher.getInstance("AES/CTR/NoPadding"); instance.init(2, secretKeySpec, ivParameterSpec); instance.doFinal(c); byte[] bArr2 = new byte[d.length]; for (int i = 0; i < d.length; i += 16) { instance.init(2, secretKeySpec, ivParameterSpec); instance.doFinal(d, i, 16, bArr2, i); } } catch (Exception e2) { Log.w("InsomniDroid", "compute: " + e2.toString()); } } public static boolean a(String str) { try { MessageDigest instance = MessageDigest.getInstance("SHA-256"); instance.reset(); return Arrays.equals(b, instance.digest(str.getBytes())); } catch (Exception e2) { Log.w("InsomniDroid", "checkSecret: " + e2.toString()); } } }
Java
이제 b.a 는 제일 아래에 있는 public static boolean a 부분이다. 왜냐하면 입력 자료형이 string 이기 때문이다.
간단한 해석을 해보자면 먼저 SHA 256 암호화를 기반으로 해서
b 배열과 str의 SHA256 암호화가 같은지를 비교한다.
먼저 b 배열을 보면 다음과 같은 값을 가진다.
6152587ede8a26f53fd391b055d4de501ee8b249ffe74f8fd69f2c72e2f3e37a
a = [97, 82, 88, 126, -34, -118, 38, -11, 63, -45, -111, -80, 85, -44, -34, 80, 30, -24, -78, 73, 255, -25, 79, -113, -42, -97, 44, 114, -30, -13, -29, 122] res ="" for i in a: if i < 0: res += hex(i +256)[2:] else: res += hex(i)[2:] print(res)
Java
아쉽게도 저 해시가 좀 유명해서 그런지 crack이 된다.
여담으로 좀더 진행해 보자면
str이 뭔지 좀 궁금하긴 하다. 아마 추정으로는 입력값일텐데 왜 입력값인지를 정확하게 알고싶을 수 있기때문에 찾아보자.
package com.fortiguard.insomnihack2012.challenge; import android.app.Activity; import android.os.Bundle; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class InsomniActivity extends Activity { public EditText a; public TextView b; private Button c; public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.main); this.c = (Button) findViewById(R.id.validateButton); this.a = (EditText) findViewById(R.id.textArea); this.b = (TextView) findViewById(R.id.textView1); b.a(b.a); this.c.setOnClickListener(new a(this)); } }
Java
여기서 this.a 를 가져오는 거니까. R.id의 텍스트를 가져온다
여기서 개 뜬금없는 b.a(b.a) 가 있는데
이 부분은 아까 본 부분에서 위에 있는 b.a 함수다.
그러니까 AES 로 키 생성해서 AES CTR 모드로 bArr 을 키로, e를 IV로 해서 암호화를 한다.
c를 암호화하고 (ec34271df97404ef5e95ca2fed8421)
d를 (af5b497a7df6343dd4c918cd9079a4538919526e6ab71ba6c91ff6ac2de74e995a53787de46075dcc9fc79dffe155cc7748796ab7293dcfc96ecf956be949de46177564f62b2baa846d90cd39b117) 16마다 암호화해준다.
IV랑 bArr을 담당하는