대회 때 못풀어서 풀이를 참고하여 풀었다.
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, 1000, 128)).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, 1000, 16) 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 |