CodeEngn Reversing Advance_Level08


프로그램 실행 모습이다. 입력한 글자 수에 따라 메시지가 뜬다.


PEiD로 조회해보니 델파이로 짜여진 프로그램이라고 한다.

문자열 찾기로 에러 메시지를 찾았다. 근처에 성공 메시지도 보인다. 이 프로그램은 name 입력 값을 이용해 key를 생성하고, 이를 입력한 key와 비교하는 프로그램이다.
문제 조건으로 key가 주어졌고 이 key를 생성하는 name을 역으로 알아내야 한다. 프로그램을 한 줄 씩 실행하며 비교할 key를 생성하는 루틴을 찾는다.

name의 길이가 3 이하일 경우 더 긴 입력을 요구한다. 문제의 힌트에서 2글자의 알파벳 또는 숫자로 이루어졌음을 알려준다. 따라서 3글자 조건을 우회하기 위해 JGE를 JMP로 바꾸었다.

위 함수가 바로 key를 생성하는 핵심 함수이다. 프로그램을 개조하여 브루트포스로 우리가 원하는 key가 나오는 name을 찾도록 했다. 00부터 ZZ까지 모든 조합을 시도해 보도록 했다. 참고로 sleep 함수가 브루트포스를 방해하기에 전부 삭제했다.
처음에는 위 함수만 호출하면 될 거라 생각했는데, 위 아래 기타 다른 코드들도 중요했다. 그래서 아예 이 함수를 호출하는 루틴을 포함하는 함수 전체를 호출하도록 했다. SetText 함수를 호출하여 프로그램이 자동으로 입력 값을 바꿔가며 넣도록 했다.

위는 브루트포스에 이용한 핵심 루틴이다. 00~ZZ를 SetText로 설정하고, key를 생성하는 루틴을 호출한다.

위 코드를 인젝션 하기 위해 원본 함수의 맨 위에 점프 코드를 넣었다.

함수의 마지막 부분(ret)에는 브루트포스를 이어하기 위한 점프 코드를 넣었다.

성공 메시지에 bp를 걸고 돌렸다. C6을 시도했을 때 bp가 걸렸다.

flag를 위해서 MD5 해시를 했다. flag는 7E8B9F5CAB4A8FE24FAD9FE4B7452702 이다.
tags: writeup, reversing, pe file, windows, bruteforce, x86asm