서비스에 대한 이해도는 'Grey-Box'로 볼 수 있을 거 같다.
문제 썸네일에서는 '암호화 프로그램이 존재한다.'라고 한다.
실제 문제에서는 공개된 암호화 프로그램이 존재하고, 그 프로그램을 이용해서 나온 암호문을 제시한다. 우리는 해당 암호문을 복호화 시켜야 한다.
문제에서 비밀번호를 암호화 했다고 했지만, 프로그램을 실제로 이용해보면 이것은 암호화가 아니라 따지고보면 그냥 (인코딩/디코딩)처럼 특정 패턴에 문자를 살짝 헷갈리게 해놓은 것 이므로 패턴만 잘 파악한다면 평문 노출이 가능하다는 것을 알 수 있다. 민감한 데이터 노출에 해당하는 취약점이며, 안전한 암호화 방식을 택해야 한다.
이러한 암호화(?) 시스템의 패턴을 파악하려면 '다양한 값을 무작위로 넣어보면서 패턴을 파악'하는 방법을 생각할 수 있다.
첫번째 시도
입력값 : aaaaaaaaaa
->abcdefghij
입력값 : abbaaaaaaa
->acddefghij
똑같은 알파벳은 똑같은 알파벳을 쓴 개수만큼
각 알파벳에서 +1한 알파벳에 대응시킨다.
두번째 시도
입력값 : bbbbbb
->bcdefg
입력값 : aaaaaa
->abcdef
첫 문자는 그냥 아무것도 대응 안시키고, 그 다음 문자부터 암호화 시킨다.
그리고 각 [base] 알파벳을 가지고
[base][base + 1][base + 2][base + 3].. 처럼 동작하는 거 같다.
세번째 시도
입력값 : abcde
->acegi
b + 1 -> c
c + 2 -> e
d + 3 -> g
첫번째 문자를 base문자로 잡는게 아니라
그냥 각 문자 가져와서
순서에 맞게 +1, +2, +3을 문자에 더한다.
이런식으로 다양한 입력값을 통해 암호화 프로그램의 암호 패턴을 도출했다.
text = input("password to encrypt : ")
encrypt = text[0]
for i in range(1, len(text)):
reverse_formula = chr(ord(text[i]) + i)
print("[+]{0} + {1} = {2}\n".format(text[i], i, reverse_formula))
encrypt += reverse_formula
print("[*]result : {0}".format(encrypt))
print("-"*15)
decrypt = ""
for i in range(len(encrypt) - 1, 0, -1):
reverse_formula = chr(ord(encrypt[i]) - i)
print("[+]{0} - {1} = {2}\n".format(encrypt[i], i, reverse_formula))
decrypt += reverse_formula
print("[*]result : " + text[0] + "{0}".format(decrypt[::-1]))
위에서 발견한 패턴을 기반으로 (암호화/복호화)프로그램을 만들 수 있다.(Python 3.10.0)
#exploit code
encrypt = "0gh8;kii"
decrypt = ""
for i in range(len(encrypt) - 1, 0, -1):
reverse_formula = chr(ord(encrypt[i]) - i)
print("[+]{0} - {1} = {2}\n".format(encrypt[i], i, reverse_formula))
decrypt += reverse_formula
print("[*]result : " + encrypt[0] + "{0}".format(decrypt[::-1]))
여기서 아까 전에 문제에서 제시한 암호문을 그대로 복호화 코드에 넣어주면, 복호화 된 비밀번호가 출력되는 걸 볼 수 있다. 이번 문제는 해커의 분석적 역량을 잘 보여준 거 같다.