| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- CodeEngn
- pe format
- __stdcall
- Python
- __fastcall
- Rich Header
- 프로그래머스
- __cdecl
- __vectorcall
- 크랙미
- ABI
- crackme
- RVA
- image section header
- stack frame
- 함수 호출 규약
- Dos Stub
- Calling Convention
- x32
- 코드엔진
- 파이썬
- rev
- 32bit
- x64
- 리치헤더
- 실행파일
- 리버싱
- Image dos header
- Reversing
- Programmers
- Today
- Total
kj0on
[RCE] Basic L06 본문
0. 실행환경
0-1. 운영체제 (1)

0-2. 툴 (3)



1. 파일

password : codeengn

2. 프로그램 동작

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 |