One's Knowledge

CodeEngn advanced 3번 문제 풀이 본문

리버싱/CodeEngn 문제풀이

CodeEngn advanced 3번 문제 풀이

coveter 2025. 7. 3. 14:09
SMALL

CodeEngn advanced 3번

Name이 CodeEngn 일때 Serial은 무엇인가

일단 패킹은 되어있지 않다.

실행하면 Name이랑 Serial을 입력하라고 나온다.

CodeEngn일때 serial 찾는거라 Name에 CodeEngn 넣으면되서 간단해보인다.

문자열중에 성공구문 찾았다. 이동하겠다.

위로 올려보니 분기점이 없다...

성공구문 출력은 함수호출로 하나보다. 실패구문으로 가보자

다행히 실패구문위에는 값을 받는 함수도 있고 분기점도 있어보인다.

GetlgItemTextA로 입력 받은 값을 403238에 넣는다.

보니 CodeEngn이 들어갔다.

그리고 길이가 3보다 큰지 비교해서 작으면 실패 성공하면 넘어간다.

그 후 시리얼을 403000에 생성된 FA 76 A7 C2(3265754874)가 403264에 33 32 36 35 37 35 34 38 37 34 00 문자열로 들어간다. 그 후 입력받은 serial값을 403264에 넣고 최종 비교한다. 

403264에 1234가 들어갔다.

최종적으로 1234랑 3265754874랑 비교한다. 

serial은 3265754874이다. 한번 해보자

다시 디버깅해서 해보면 멈춘다.

lstrcmpA는 str1이랑 str2가 같으면 0을 출력하고 다르면 1을 출력한다.

CDQ

IDIV EAX

CDQ는 EAX의 32비트 값을 부호 확장해서 EDX에 채워서 EDX:EAX꼴로 64비트 피연산자를 만든다.

그리고 IDIV EAX를 통해 EDX:EAX / EAX를 한다. 해서 몫은 EAX 나머지는 EDX에 넣는 명령어이다.

 

그런데 보면 str1이 str2랑 다르면 eax값이 0이 아니라 연산이 되서 실패구문이 나오고

str1이 str2랑 같으면 eax값이 0이라 /0을 못해 멈춰버린다.

이 값이 맞는지 디버거에서 안하고 한번 일반 실행해서 해보겠다.

성공 뜬것을 볼 수 있다.

디버거는 예외가 발생시 디버거가 가로채 중단한다고 한다.

/0을 해서 예외가 발생했고 디버거가 중단한것이다.

실제로 예외가 발생하면 SEH chain에 있는 함수들을 하나씩 실행한다.

그럼 SEH chain을 보자

보면 401392가 먼저 실행되는것을 볼수 있다.

가보자

아까 봤던 성공구문 위치였다.

종합해보면 이 프로그램은 Name의 값을 받아 serial을 생성하고

사용자 입력을 받은 serial과 생성한 serial을 비교해서 같으면 의도적으로 /0 연산을 통해 예외상황을 만들고 

SEH로 성공구문을 출력하게 한다.

정답 : 3265754874

 

예외처리로 성공구문을 띄우네;;

LIST