le0s1mba

[CodeEngn] Advance L10 본문

Security Challenges/CodeEngn

[CodeEngn] Advance L10

le0s1mba 2025. 7. 20. 18:36

https://codeengn.com/challenge/rce_advance


파일을 실행시키면 Name과 Serial을 입력받는다.

Serial이 WWWCCCJJJRRR이기 때문에 Name만 구해주면 된다.

 

exeinfo로 보면 packing은 안되어 있고, C++로 제작되었다.

 

문자열 참조를 하면 위에 AJXGRFV . . . 하면서 긴 문자열과 Enter Your Name: 문자열이 있다.

그 밑에는 Good job이 있는데, 저기로 가보자.

 

바로 위에 cmp byte ptr ss:[ebp-A5], 0으로 [ebp-A5] 값이 0이면 Wrong serial. Keep trying. 문자열이 출력된다.

때문에 [ebp-A5]의 값은 0이면 안된다.

그럼 이제 [ebp-A5]의 값이 어디에서 정해지는지 찾아보자.

 

좀 올리다 보면 0x401FBF에서 ebp-A5에 al의 값들을 넣어주고 있다.

eax 값은 바로 위의 call 10.40144C 함수에서 결정되므로 해당 함수 안으로 이동해 보겠다.

 

해당 함수 안에서 밑으로 쭉 내리다 보면 0x401C8D에서 ret을 발견할 수 있다.

그럼 이제 여기에서 위로 조금씩 올리면서 eax 값을 설정하는 곳을 찾아보겠다.

 

0x401C80에서 eax는 ebp-C4 값으로 설정된다.

이제 ebp-C4 값이 어디에서 설정되는지 확인해 보겠다.

 

0x401BC8에서 ebp-C4 값이 edx 값으로 설정된다.

해당 edx는 바로 위의 0x401BC2에서 ebp-10C의 값으로 설정된다.

 

0x401B7D에서 ebp-10C 값이 eax 값으로 설정되고, eax 값은 바로 위에서 ebp-69 값으로 설정된다.

 

해당 ebp-69는 0x401B1에서 0으로 설정되기 때문에 바로 위의 0x401B5F에서 jmp를 안 하게 되면 wrong serial이 출력되게 된다.

때문에 Good job이 출력되려면 eax 값이 5 이하여야 한다. 

 

eax 값은 여기서 설정된다.

그럼 우리는 또 ebp-7C의 값과 ebp-78의 값이 어디서 설정되는지 찾아야 한다.

 

가장 먼저 ebp-7C의 값은 여기서 저 위의 call 10.401406 함수가 끝난 후 설정된다.

 

ebp-78의 값은 여기서 설정되는데, 바로 위에 호출하는 함수가 똑같다.

때문에 해당 함수가 어떤 역할을 하는 애인지 알아야 할 필요가 좀 있다.

 

이런 코드가 나오게 되는데, 마지막 eax 값을 설정하는 곳은 저 0x40143A에 있는 call 10.414B10 함수에서 결정된다.

 

해당 함수에 들어가면 또 이러한 코드가 나오게 되는데, 여기서 eax는 call 10.414AA0 함수에 의해 결정된다.

 

해당 함수에 들어가면 이러한 코드가 나온다.

지금부터는 동적 분석을 해야 한다.

 

eax 값은 0x414AFD와 0x414AF3에서 결정되는데, eax에 0xFFFFFFF를 넣는 건 아무리 봐도 아니기에 우리는 0x414AFD에 있는 mov eax, dword  ptr ss:[ebp+10]으로 이동해야 한다.

 

0x414AFD에 bp를 걸고 실행시킨 후, 값을 보면 eax에 들어갈 값은 B이다.

 

간단하게 저 코드가 어떤 작동을 하는지 설명하자면 AJXGRFV . . . 문자열에서 특정 위치를 찾는 코드로 보인다.

1씩 증가하면서 repe cmpsb가 0이면 jmp를 하는데, AJXGRFV . . . 문자열에서 11(0xB)의 위치에는 W 문자가 있다.

즉, ebp-78에는 우리가 입력한 serial의 인덱스가 들어간다.

 

여기선 eax에 0이 들어가는데, 이는 내가 입력한 Name의 글자인 A 문자가 있는 위치이다.

즉, ebp-7C는 Name의 인덱스가 들어간다.

 

이 cmp eax, 5는 내가 입력한 Name의 글자와 serial 글자의 위치 차이가 5 이하인지 확인하는 명령어다.

그럼 이제 여기서 문제 설명에 주어진 hint2가 사용된다.

 

W, C, J, R에서 5 이하인 문자들 중에 가장 적은 문자를 찾으면 된다.

W에서는 3이 나온다.

C에선 1이 나오며

J에서는 A가 나온다.

R에서는 6이 나온다.

 

즉, Name은 31A6이다.


더보기

31A6

'Security Challenges > CodeEngn' 카테고리의 다른 글

[CodeEngn] Advance L11  (1) 2025.07.20
[CodeEngn] Advance L09  (0) 2025.07.20
[CodeEngn] Advance L08  (1) 2025.07.20
[CodeEngn] Advance L07  (0) 2025.07.20
[CodeEngn] Advance L06  (0) 2025.07.20