CodeEngn Advance 8
오래간만에 리버싱 해본다.
7번은 풀다가 짜증나서 던졌다.
문제 : Key 값이 5D88-53B4-52A87D27-1D0D-5B09 일때 Name은 무엇인가
힌트 : Name은 두자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)
일단 두글자라고 해서 “AA”를 입력했더니 글자수 부족 메시지가 뜬다. 문제에선 2글자라고 헀지만 나름 복잡하게 하기위해 몇글자 이하에 예외처리나 조건문을 걸어놓은 것 같다. 이부분을 해결하고 패스워드 비교부분 찾으면 끝나는 문제같다.
대놓고 문자열에 나온다.
please Enter MOre Chars… 문자열 바로 직전에서 S플래그 바꿔주면 글자수 부분은 넘어가진다.
적당히 브레이크포인트 걸어주고 구석구석 까진 아니고 입력한 AA의 아스키를 갖고 노는 듯한 함수내부에 들어가보니 AA의 아스키값을 갖고 이런저런 연산을 총 4번한다.
입력받은 name의 문자열을 갖고 key값을 만드는 부분으로 판단된다.
연산내용을 다 볼필요 없고 쭉쭉 진행하면 위와 같이 AA를 이용한 문자열이 생성된걸 확인 할 수 있다.
4번의 연산 결과값의 8비트중 앞부분 4비트만 따와서 만드는 문제라 그냥 코드로 저 연산 짜준다음에 아스키 1~a까지 전부 넣어주면 되겠지만 귀찮으니까 다른방법을 찾아봤다.
라고 했지만 그냥 코드 짜는게 가장 빠를것 같다.
첫번째 연산의 결과값은 F23ABBF0 이다.
위에서 본 AA의 첫 코드값과 앞4비트가 동일하다.
그럼 이 첫번째 연산만 아스키값으로 숫자 영대 영소 쭉 돌려서 정답 앞부분 값인
“5D88,+4비트” 뜨는 애를 찾으면된다..
아 그리고 두글자니까 name을 AB로 넣어서 ‘B’는 어느 연산에서 시작하는지도 찾아서 똑같이 코드짜면 된다.
AB로 넣어서 보니까 첫번째 연산에서 처음에는 A(41) 로 연산하고 그결과값에 두번째문자열B(42)를 넣어서 만드는걸 확인했다.
대신 00~zz까지 싹다 넣고 결과값의 앞4글자만 5D88과 비교연산 해줘서 출력해주면 끝!
이제 코드를 짜보자.
파이썬으로 대충 짜봤다.
0x30 (0) ~ 0x7A (z) 까지 모두대입한다.
5D88 이 -8:-4 인 부분 그냥 찾기로 검색해봤다
“ C6 “ 과 “ g3 “
두개의 결과가 나왔다.
스샷 찍고나서 봤는데 g3은 -9:-5다. C6만 딱맞음
글자수 제한하는 부분은 알아서 패치하고
C6을 넣었더니 정답이다
쉬운 문제지만 귀찮은 문제다.