CodeEngn advance 08
코드엔진 advance 08번 문제풀이
파일을 실행해보면 name과 시리얼 값을 입력하는 창이 나타나고 문제는 시리얼 값이 5D88-53B4-52A 87D27-1D0D-5B09인 name(알파벳 or 숫자 2자리)을 찾는 문제였으니 시리얼 값을 입력하고 name을 아무 값이나 입력한 뒤 시작하니 아래와 같은 문자열이 나왔다.
이제 PEiD로 프로그램을 실행하여 패킹 여부를 찾아보면 패킹은 되어있지 않았기 때문에 바로 올리 디버거를 사용하여 파일을 연 뒤 위에서 확인한 문자열인 Please Enter More Chars를 찾아보니 아래와 같이 찾을 수 있었다.
찾은 문자열을 클릭하여 문자열이 있는 위치로 이동한 뒤 주변을 분석해보니 이 문제는 basic17번에서 풀었던 문제와 비슷한 형식임을 확인할 수 있었다. 이 문제 역시 입력한 값의 글자 수가 3자리보다 낮으면 Please Enter More Chars 문자열을 나타내고 30(1Eh) 자리보다 크면 Please Enter More Then 30 Chars를 나타내는 것을 볼 수 있었다.
우리가 원하는 값은 2자리 이므로 주소 0045BB27의 JGE문을 JMP문으로 패치하고 패치한 파일을 다시 실행하였다.
이제 파일을 분석하면서 아래로 내려가다 보면 아래와 같이 0045BB9B에서 입력한 name값을 시리얼 값으로 변환시키고 0045BBA4에서 그 변환한 값과 5D88-53B4-52A 87D27-1D0D-5B09 값을 비교하는 것을 확인할 수 있었다.’
Basic17번 문제에서는 요구하는 값이 한자리 문자였으므로 일일이 입력해서 정답을 찾았지만 이번에는 2자리를 요구하므로 0045BB9B에서 어떻게 name값이 변환하는지 살펴보면 총 4번의 변환을 하는데 우선 첫 번째를 살펴보면 아래와 같다.
위의 알고리즘을 분석하기 전에 값이 어떻게 변하는지 살펴보니 11을 입력했을 경우 A0262F0가 들어있었고 이 값을 확인해 보니 입력 값인 11이 변환된 시리얼 첫 번째 문자열임을 확인할 수 있었다.
이 앞의 시리얼 첫번째 4자리 문자열이 5d88이 되어야 하므로 파이썬을 이용하여 brute force를 해보았다.
이렇게 알고리즘을 수행한 뒤 txt 파일에 저장하여 메모장으로 연 후 5d88과 동일한 값이 있는지 찾아보니 C6, OU, g3 3개의 문자를 찾을 수 있었다.
값이 같은 3개의 문자들을 찾았으니 이제 두 번째를 살펴보면 아래와 같다.
위의 알고리즘에 처음에 찾았던 3개의 값인 C6, OU, g3를 넣어보면 두번째 시리얼 값 4자리인 53b4값이 되는 것은 C6하나 밖에 없었고 이 값을 입력하니 성공 메시지를 확인할 수 있었다.
플래그는 C6을 md5암호화 한 7E8B9F5CAB4A8FE24FAD9FE4B7452702이다.
파이썬 스크립트를 작성하면서 많은 공부를 할 수 있었던 문제였다.