본문 바로가기

CTF/Write-up

BSidesSF-pinlock

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

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 > Write-up' 카테고리의 다른 글

Hashdays 2012 Android Challenge  (0) 2017.02.26
Insomni’hack 2012 InsomniDroid CrackMe  (0) 2017.02.24
BSidesSF Reversing  (0) 2017.02.14
codegate 2017 angrybird  (2) 2017.02.11
AlexCTF Reverse Engineering  (0) 2017.02.06