One's Knowledge

CodeEngn basic 14번 문제 풀이 본문

리버싱/CodeEngn 문제풀이

CodeEngn basic 14번 문제 풀이

coveter 2025. 6. 7. 14:00
SMALL

CodeEngn basic 14번

Name이 CodeEngn 일때 Serial을 구하시오 (이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) Ex) 11111

UPX로 패킹되어있다.

언패킹하였다.

Name이 CodeEngn일때 serial을 찾는거라 이렇게 해보았다.

당연히 실패가 뜨고 성공구문과 실패구문이 있는것을 알았다.

성공구문과 실패구문을 찾았고 분기점에 breakpoint를 걸었다. 

보면 EAX랑 ESI를 비교한다.

EAX에는 내가 serial로 넣은 0x1234가 있고, ESI에는 0x129A1이 있다.

일단 정답은 0x129A1을 10진수로 바꿔 76193인것을 알수 있다

쉽게 찾았다. 하지만 이대로는 아쉬우니 serial 생성원리를 알아보자.

다시 분기점으로 가보면 pop esi를 한것을 알수 있다.

스택과 같이 보면 먼저 push esi를 해서 129A1이 스택에 들어갔고, 1234를 다시 스택에 넣고 call 00401383을 한것을 볼수 있다. call 00401383 실행되고 나서 esp는 다시 129A1을 가리키고 있다.

정리하면 다음과 같다.

1. esi를 백업

2. 1234를 스택에 넣어 함수 인자로 사용

3. 00401383함수 호출

4. 1234까지 반납

5. 백업해뒀던 esi를 esi에 복원

1234반납을 한번 확인해보자. 

00401383가서 보니 함수 나올때 RETN 4가 있다. 함수나오고 4바이트 반납한다는것이다.

결국 129A1은 이미 만들어져 있다는것이다.

더 위로 올라가보자

 00401300에 ESI를 0으로 초기화하는 부분이 있다.

ESI가 반복문을 통해 값이 생성되고 0040132E에 스택에 넣는것을 볼 수 있다. 

그 위에 함수를 보니 CodeEngn의 길이를 ECX에 넣었다. 8번 반복할 생각인것 같다.

주석으로 좀 달아뒀다. 정리하면 다음과 같다. id는 NAME을 의미한다.(잘못적음 ㅠㅜ)

ECX = 8

EAX = 1

do{

EDX = Name[eax-1]

EBX = EDX

EBX = EBX * EDX

ESI += EBX

EBX = EDX

EBX >> 1

ESI += EBX

ESI -= EDX

EAX++

ECX-- 

}while(ECX != 0)

 

이래서 결국 답은 76193이다.

답 : 76193

LIST