kj0on

[RCE] Basic L06 본문

Reversing/CodeEngn

[RCE] Basic L06

kj0on 2025. 6. 29. 19:14
목차 접기

0. 실행환경

 

0-1. 운영체제 (1)

Window 11 Home


0-2. 툴 (3)

x32dbg
Detect it easy
upx.exe


1. 파일

https://codeengn.com/challenge/rce_basic
06.7z
0.02MB

 

password : codeengn


2. 프로그램 동작

[이미지1] Basic 06

프로그램 실행 시 위의 GUI가 나타난다.

 

[이미지2] Basic 06

Check Serial 버튼 클릭시 "Wrong serial!!!" 메시지를 출력한다.


3. Detect It Easy

[이미지3] DIE 실행 결과

32비트 실행파일, UPX 패킹 된 것을 확인할 수 있다.

 

[이미지4] DIE 실행 결과 (언패킹)

언패킹 후 실행결과 Microsoft Visual C/C++로 작성된 프로그램 인 것을 확인할 수 있다.


4. 분석

[이미지5] UPX

upx 언패킹 후 분석을 진행했다.

 

[이미지6] 문자열 참조

문자열 참조 시 [이미지2]의 문자열을 확인할 수 있다.

 

[이미지7] 문자열 참조

비교적 간단한 코드를 확인할 수 있다.

 

[이미지8] GetDlgItemTextA

GetDlgItemTextA로 TextBox에 있는 문자열을 가져온다. 그 뒤 06.401320 함수를 통해 ESP오류를 체크한다(Debug로 컴파일 시 자동추가). 06.401290으로 두 문자열을 비교한다. 값이 다르면 0xFFFFFFFF를 반환, 값이 같으면 0x00을 반환한다. 이때 비교하는 값은 사용자 입력값과 "AD46DFS547"이다.

 

[이미지9] 조건부 분기

이후 분기를 통해 "Wrong serial!!!"을 출력할지, "You got it ;)"을 출력할지를 결정한다. 문자열이 같으면 "Good Job!"이 있는 저 성공 메시지가 출력된다.

 

[이미지10] Basic 06

Serial이 일치하면 성공메시지가 출력된다. "AD46DFS547"은 하드코딩된 값으로 변하지 않는다.

 

[이미지11] Error

[이미지8]의 06.401320 함수는 ESP값을 체크하는 함수다. 저번에도 설명했듯이 ESP 값을 수정하면 위의 에러가 출력된다. 프로그램 실행에는 크게 중요하지 않기 때문에 넘어간다. 


5. 풀이

[이미지12] OEP(언패킹)

문제에서 OEP + Serial 값을 묻고 있다. OEP의 경우 언패킹을 하면 나타난다. EntryPoint의 주소를 보면 알 수 있는데 0x00401360이다.

 

[이미지13] 패킹 EP

패킹된 상태에서 디버거로 열어보면 EntryPoint가 다르게 나타난다. 이는 OEP로 접근하기 전 언패킹을 하는 추가루틴이 있기 때문이다.

 

[이미지14] 패킹 OEP

루틴 종료후 OEP로 jmp해보면 처음 언패킹 시 나타난 EntryPoint의 주소가 나타난다(패킹은 다른 글에서 자세히 다룰예정).

 

[이미지15] GetDlgItemTextA

Serial 값은 [이미지8]에서 살펴봤듯이 "AD46DFS547"이다. 따라서 OEP + Serial은 "00401360AD46DFS547"이다.


 

'Reversing > CodeEngn' 카테고리의 다른 글

[RCE] Basic L08  (0) 2025.07.11
[RCE] Basic L07  (0) 2025.07.11
[RCE] Basic L05  (0) 2025.06.29
[RCE] Basic L04  (0) 2025.06.29
[RCE] Basic L03  (0) 2025.06.28