주어진 압축파일에는 run이라는 이름의 실행파일과 file이라는 이름의 파일이 보인다
이외에도 dll파일이 있지만, 우선 readme를 보자
파일을 복호화하하는 의미로 보인다
주어진 file을 살펴보면 실행파일이 아니라고 나타난다
문제에 주어진 대로 파일을 복호화하면 실행파일로 읽혀서 답을 확인할 수 있을 것 같다
run파일을 실행해보면 파일을 복호화하기 위한 key를 요구한다
올리로 바로 확인하면 실행파일에서 보았던 key를 입력하는 부분을 볼 수 있다
얼마안가서 작은 루프문과 fopen을 볼 수 있다
fopen에서는 'file'을 바이너리 읽기 형식으로 여는것을 확인 할 수 있다
fopen을 지나서 루프문을 볼 수 있는데, 확인해보면 'file'의 내용을 한글자씩 (getc) 받아오는 부분임을 알 수 있다
토탈 2400번 루프를 돈다
그 밑으로 큰 루프문이 있는데, key를 확인 할 수있는 핵심부분이다
총 2번의 XOR연산을 통해 'file'의 hex값을 바꿔주는데,
먼저 0044A8CF에서 ECX(파일의 한 바이트)와 EDX(입력한 key의 첫글자 hex)를 XOR해주고
다음으로 0044A8E9에서 이전의 XOR연산 값과 0xFF를 XOR해준다
일단 계속 확인해보자
'file'을 바이너리 쓰기로 열어주고 한글자 씩 넣어주는것을 확인할 수 있다
여기까지 확인했을 때, 2번의 XOR연산을 통해 'file'의 바이너리를 한 바이트씩 바꿔주는 것으로 이해할 수 있다
따라서, 올바른 key를 입력해줬을때 (힌트에 나와있듯이) 실행파일의 형태로 나타난다고 생각할 수 있다
우선 'file'을 실행파일형태로 만들기 위해 일반적인 exe파일과 바이너리 값을 비교해보자
역연산이 가능한 XOR을 고려하며 key를 구하는 방법을 생각해보자
바이너리의 앞부분을 약간 긁어와서 코드를 짰다
반복되는 부분이 보이는데 key값이 반복된다는 점을 생각하면 key를 알 수 있다
끝