https://ctf.tamu.edu/scoreboard
threads - 100
스트링을 보면 플래그가 보인다
전체적으로 문제들이 매우 쉬웠다.
threads2 - 100
md5값이 보여서 바로 복호화했더니
바로나온다
fancy bear - 100
after func0을 출력한다
함수중에 func0이란 함수명이있는데 한번보자
0x66
0x66보다 크면 넘어가게된다.
이런식으로 함수가 func0~func37까지 있는데
헥스레이의 저부분을 다 리스트화해서 1씩 더한값을 출력하면된다.
1 2 3 4 5 6 | a = [0x66, 0x68, 0x66, 0x64, 0x6c, 0x7a, 0x63, 0x78, 0x6d, 0x60, 0x6c, 0x68, 0x62, 0x5e, 0x64, 0x65, 0x65, 0x6e, 0x71, 0x73, 0x5e, 0x33, 0x36, 0x2f, 0x63, 0x64, 0x32, 0x63, 0x63, 0x64, 0x35, 0x34, 0x34, 0x35, 0x31, 0x62, 0x34, 0x7c] result = "" for x in a: result += chr(x+1) print result | cs |
1 | gigem{dynamic_effort_470de3dde65562c5} | cs |
SEDNIT - 200
원래 풀이를 안쓸려고 했는데 이 문제 때문에 쓴다
우선 문자열을 봤더니 별게 없다
이렇게 문자들이 보였는데 바이너리에서 저부분을 쫙 뽑았다
(이렇게 안해도 f2() 함수에서 알아서 출력해주더라...)
아무튼 문자들을 다 구하면
이렇게 base64가 보이게되는데 첫번째는 패스하고 나머지 2개를 복호화하면
RSA라는 것을 알게된다
첫번째는 RSA 복호화 할 문자열인데 참 좋게 private key을 줬다
원래 생각한 RSA는 n e p q 이런걸로 푸는건줄 알았는데
openssl이라는것을 알 수 있었다 openssl을 처음써봤는데
한번에 안풀렸다 계속 삽질을 하다가 ddddh형의 도움으로 풀수있었다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP from base64 import b64decode def decrypt_RSA(privkey, message): key = open(privkey, "r").read() rsakey = RSA.importKey(key) # rsakey = PKCS1_OAEP.new(rsakey) decrypted = rsakey.decrypt(b64decode(message)) return decrypted flag = "qheRHIyKE/tFq4aDh0x8uvPsaWefzmbWgbCD1ogaTiRSftMnrbFpSigVdYw5UVxwmcUWWIypVLGMco7i4O5uNadtTq++I5bEKl9LyXL7XIMLF2gu6VvRYi7DAe3L8sGlVrji/msWTzyIJhm6BxKuqp7lliRhgfmgjR0LgkCowEQ=" print decrypt_RSA('test.key', flag) | cs |
이렇게 소스를 검색하다 찾았는데 제대로된 키를 얻을 수 없었다
PKCS1_OAEP
PKCS1_v1_5.new 이부분을 주석처리하고 돌리게되면 제대로된 키값을 구할 수 있다.
1 | gigem{feels_g00d_2b_a_pIrate__b061efc2712c4109} | cs |
'CTF > Write-up' 카테고리의 다른 글
hust 2017 참가 후기 & 풀이 (1) | 2017.05.28 |
---|---|
defcon 2017 (0) | 2017.05.01 |
Reto Android Crackme #2 (0) | 2017.03.05 |
Reto Android Crackme #1 (0) | 2017.03.05 |
pragyan ctf MI6 (0) | 2017.03.03 |