ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BSidesSF-pinlock
    CTF&Wargame/Android 2017.02.20 21:13

    대회 때 못풀어서 풀이를 참고하여 풀었다.

    2가지 방법으로 풀어보겠다.



    첫 번째

    pin 번호를 요구한다. 아무거나 입력했더니


    틀렸다고 나오게된다. 소스를 보면


    내가 입력한 pin을 sha1로 암호화해서 pinDB에 있는 값과 같으면 시크릿 클래스 실행


    소스를 보면 DatabaseUtilities에 secretsDBv1 이 값을 디크립트하고 CryptoUtilities 함수에 v1과 내가 입력한 pin을 넘겨준다.

    그리고 이 값을 화면에 표시하는데 우슨 pindb를 확인해봐야겠다.


    여기서 pin값은 sha1이라서 디코딩을 해보면 7498이란 값을 가지게된다.


    입력해도 이렇게 나온다.



    보니까 DB가 3개가 있다. (secretsDBv2가 있는데 소스에서는 보이질 않는다 준 이유가 있겠지)


    그리고 readme에 이런 파일이 있다. (v2만 보면될거같다)


    pin을 맞추면 거기선 v1을 인자로 준다. v1을 인자로 받으면 v1인지 비교하고  sha-1하고 t0ps3kr3tk3y로 aes를한다. 

    이건 무시하도록하자 입력한 pin과 관련 없는 코드다. 

    실제로 값을 돌려보면


    Here is what the data will look like

    이런 결과가 나오니 flag라고 할 수 없다.


    그럼 DBv2의 값이 유력한데 바로 밑에 pin과 salt를 이용한 암호화가 보인다. 검색해보니 sha1+salt 암호란다.

    뭔가 이게 더 맞을거같단 생각이 든다.


    그럼 이것들을 가지고 역연산 코드를 짜야하는데 DBv2의 값과 7498을 이용하면된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    import javax.crypto.Cipher;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
     
    public class test
    {
        public static void main(String args[]) throws Exception
        {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
     
            String pin = "7498";
            String flag1 = "Bi528nDlNBcX9BcCC+ZqGQo1Oz01+GOWSmvxRj7jg1g=";
            byte[] salt = "SampleSalt".getBytes();
            byte[] flag2 = DatatypeConverter.parseBase64Binary(flag1);
     
            SecretKeySpec key = new SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(new PBEKeySpec(pin.toCharArray(), salt, 1000128)).getEncoded(), "AES");
            cipher.init(2, key);
     
            System.out.println(new String(cipher.doFinal(flag2)));
        }
    }

    cs

    이렇게 소스를 짤 수 있다.

    실행하면 Flag:OnlyAsStrongAsWeakestLink


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import hashlib
    from Crypto.Cipher import AES
     
    pin = '7498'
    encrypted = 'Bi528nDlNBcX9BcCC+ZqGQo1Oz01+GOWSmvxRj7jg1g='.decode('base64')
    salt = 'SampleSalt'
     
    key = hashlib.pbkdf2_hmac('sha1', pin, salt, 100016)
    cipher = AES.new(key, AES.MODE_ECB)
    print str(cipher.decrypt(encrypted))
    cs

    https://st98.github.io/diary/posts/2017-02-14-bsides-sf-ctf.html

    다른 풀이를 보니 이렇게 짠 소스도 있다.




    두 번째


    이 방법은 시크릿 디스플레이에 스말리 코드 패치를 통해 v2의 값을 인자로 전달하는 방법이다.


    이렇게 v1로 되어있는 부분을 v2로 수정해준다.


    그리고 가져올 db도 DBv2로 바꿔준다.


    이제 설치를 해보면


    뭐 접근법은 여러가지니 다른 풀이도 있겠지만 여기서 마쳐야겠다.




    'CTF&Wargame > Android' 카테고리의 다른 글

    Reto Android Crackme #1  (0) 2017.03.05
    Hashdays 2012 Android Challenge  (0) 2017.02.26
    Insomni’hack 2012 InsomniDroid CrackMe  (0) 2017.02.24
    BSidesSF-pinlock  (0) 2017.02.20
    holyshield sound  (0) 2016.12.20
    SHARIF CTF DMD android app  (0) 2016.02.08

    댓글 0

Designed by Tistory.