Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가
힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)
peid로 봤을때 일단은 델파이로 만들어진 프로그램.
일단 답이 한 자리라고 했는데
한자리 넣으면 more chars..문자열 나온다.
이를 패치해주고 다시 올리디버거로 띄움.
한 자리니까 그냥 a~z, A~Z, 0~9를 다 넣어서 확인할 수도 있긴 한데,
제대로 풀어보자.
시리얼 생성 규칙을 확인해야 한다.
Name : A라고 설정하고 시리얼 규칙을 파악해보자.
스택에 공간을 만든다.
ECX=7인데 push 0 을 두 번씩 한다.
스택에 총 14개 공간을 만든다.
IMUL이 나오는 루틴 분석.
ESI에 A값인 41을 넣는다.
ADD ESI, EDX로
41+0 = 41
IMUL ESI, ESI, 772 = 1E3F2
EDX에 ESI 값을 넣는다.
IMUL EDX, ESI = 92DB10C4
ADD ESI, EDX = 92DCF4B6
OR ESI, ESI = 92DCF4B6 (변하지않음)
IMUL ESI, ESI, 474 = FFF1BA78
ADD ESI, ESI = FFE374F0
MOV EDX, ESI = FFE374F0
여기서 FFE3이 키 값의 첫 번째가 된다.
대충 어떤 루틴인지 알았으니 쉽게쉽게
코드를 짜서 얻어내보자.
파이썬이 편할 것 같아서 파이썬으로 짰다.
#CodeEngn basic 17
str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
chr = list(str)
for i in range (len(chr)):
#print(chr[i])
esi = ord(chr[i])
edx = 0
esi = esi+edx
esi = esi * 0x772
edx = esi
edx = edx*esi
esi = esi+edx
esi = esi * 0x474
esi = esi+esi
#print(hex(esi))
result = list(hex(esi))
# print(result[-8:])
if (result[-8] == 'b'):
print(chr[i])
print(result[-8:])
키 값의 처음 부분과 일치하는건 F뿐이다.
따라서 F문자를 md5로 encrypt시키면 flag를 얻을 수 있다.
'Reversing' 카테고리의 다른 글
[코드엔진] basic 19 (0) | 2020.02.24 |
---|---|
[코드엔진] basic 18 (0) | 2020.02.24 |
[코드엔진] basic 16 (0) | 2020.02.19 |
[코드엔진] basic 15 (0) | 2020.02.18 |
[코드엔진] basic 14 (0) | 2020.02.18 |