CodeEngn Reversing Basic_Level10

OEP 구하고 분기점 찾기이다. OEP를 구하라는 것을 보니 패킹이 되어있을 것 같다.

실행 모습이다. 입력값을 입력해보려 했지만 아무 것도 입력되지 않는다.

PEiD로 알아보니 ASPack으로 패킹되어 있다.

하드웨어 bp를 이용하여 POPAD에서 멈췄다. 바로 뒤에서 PUSH하는 곳으로 점프한다. 점프한 뒤 RETN한다. 이러면 함수를 호출하고 원래 자리로 되돌아가는 것처럼 그 주소로 점프하게 된다. 따라서 OEP는 00445834이겠다.

이런 곳으로 점프하게 된다. ctrl + a 를 눌러 다시 분석해주었다.

그래도 잘 되지 않아 그냥 덤프를 떠서 따로 저장했다. Ollydbg로 IAT를 잡지 않고 Import REConstructor를 이용했다.

예쁘게 저장된 새 EXE로 분석할 수 있다.

GUI 창이 뜨는 지점을 찾아 bp를 걸었다.

referenced string에서 쓸만한 문자열에 bp를 걸었다. cm5.dat는 파일 이름으로 보인다. 키 파일일 수도 있겠다.

그냥 진행하면 이런 에러메시지가 뜬다. 이 에러를 띄우기 위해 cmp, jnb하는 코드가 문자열 바로 위에 있다.
입력 란에 값이 입력되지 않으니 cm5.dat 파일에 5개 이상의 문자를 써 실행해 보았다. name123 문자열을 사용하였다.

에러 메시지를 출력하지 않고 넘어가는 것을 확인할 수 있다.

에러 메시지 출력 코드를 넘어간 후 위 루틴을 반복한다.

이 루틴이 무엇을 하는지 살펴보기 위해 일단 몇 번 반복하는 지 보았다. 처음에 MOVZX로 ESI에 스택 값을 가져온다. 저 스택에 무엇이 들어있는지 확인해 보았다.

스택으로 가져오는 값은 7이다. 입력 값(name123)의 길이와 같다. 그렇다면 글자 수만큼 어떤 작업을 반복한다는 의미이다. 아무래도 key를 만드는 것 같다.
더 진행해 보았다.

분기하는 부분은 성공 메시지의 조금 위에서 찾을 수 있다. JNZ이니 위에서 cmp하는 부분이 있을 것 같다.
어디서 flag를 세팅하는지 보니 바로 위의 함수이다. 함수를 call하기 전에 EAX와 EDX에 스택의 값을 넣는다.
EBP - 4에는 숫자들이 적혀있다. EBP -208에는 0만 있다.
아무래도 key를 비교하는 것 같다. 0만 있는 것은 내가 key로 입력한 값이 없어서가 아닐까?
EBP -4에 있는 값은 6354721이다. 이 값을 파일의 다음 줄에 써 보았다.

성공메시지가 뜬다. 그리고 자동으로 파일에 써 놓은 이름과 시리얼이 입력 란에 표시된다. 참고로 이 부분은 수정이 안 된다. 파일로만 입력 할 수 있는 것 같다.
성공문으로 분기하는 분기점의 OPCODE는 7555이다. 따라서 flag는 004458347555이다.

괜히 오기가 생겨서 key를 만드는 루틴을 분석했다. 대충 설명하자면 프로그램에 이미 있는 숫자 string과 name, 그리고 name의 길이을 이용하여 key를 만든다. name의 길이만큼 루틴을 반복한다. 그 결과를 버퍼에 저장한다.
tags: writeup, reversing, pe file, windows, packing, keygen, x86asm