| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- AWS 침해사고 사례 분석
- Amazon S3
- AWS
- AWS 사고 사례 분석
- python
- 프로그래머스
- AWS 보안 아키텍처 분석
- reversing
- network
- 리버싱
- reversing.kr
- 드림핵
- AWS Active Directory
- AWS IAM Role
- AWS 3 Tier Architecture
- AWS 보안 사고 사례 모음
- terraform
- IAM Federation
- C
- AWS 인프라 아키텍처
- 운영체제
- operating system
- 침입 차단 시스템(IPS)
- programmers
- AWS 인프라 분석
- AWS 아키텍처 분석
- dreamhack
- AWS 침해 사고 사례 분석
- 네트워크
- TryHackMe
- Today
- Total
lhywk 님의 블로그
[Reversing.kr] Replace 본문
reversing.rk의 Replace 문제를 풀이해 보겠습니다.
먼저 해당 문제의 바이너리를 실행해 보겠습니다.

입력할 수 있는 다이얼로그가 나오고 아무 값이나 입력하면 프로그램이 종료됩니다.

PE 분석을 해보면 C++로 개발되어 있고 패킹이 되어있지 않습니다.
그럼 바로 x64dbg에서 디버깅을 해보겠습니다.

다이얼로그를 띄우는 API에 중단점을 모두 걸겠습니다.

0123456789를 입력하고 Check를 누르겠습니다.

GetDlgItemInt API로 EIP가 이동합니다. GetDlgItemInt는 Windows API에서 대화 상자(Dialog Box) 내의 컨트롤(주로 에디트 컨트롤)에 입력된 텍스트를 정수 값으로 변환하여 가져오는 함수입니다.
함수를 호출하고 반환값이 담겨있는 eax 레지스터 값을 확인해 보겠습니다.

eax 레지스터엔 75BCD15가 저장되어 있습니다.

우리가 입력한 값이 16진수로 들어가 있습니다.

1. mov [4084D0], eax : eax(0x75BCD15)를 4084D0 주소 값으로 복사합니다.
2. call 4046FF: 4046FF 함수를 호출합니다.

f8을 눌러 계속 디버깅을 수행하면 오류가 발생하는 지점이 40466F 주소입니다.
여기선 eax에 0x90의 값을 저장합니다. 0x90 NOP를 뜻합니다.

eax에 0x6771D2E0가 저장되어 있고 해당 주소에는 접근이 불가능합니다. 따라서 이 주소에 0x90을 복사하려고 하기 때문에 오류가 발생합니다.

실제로 NtRaiseException을 호출되어 에러가 발생하고 있습니다.
그렇다면 어떻게 해결해야 되는지 각 함수 내부들을 더 자세히 분석해 보겠습니다.

40466F 함수를 호출하면 바로 40467A 함수를 호출합니다.
40467A 함수 내부를 분석해 보겠습니다.

1. mov [406016], 619060EB: 406016에 0x619060EB 값을 복사합니다.
2. call 404689: 404689 함수를 호출합니다. 바로 밑입니다.
3. inc [4084D0]: 우리의 입력값이 담겨있는 4084D0 주소의 값을 1 증가합니다. 이때 이 연산을 2번 합니다. 총 2를 증가시킵니다.

메모리 값을 확인해 보면 0x075BCD15인 우리의 입력값이 2 증가하여 17로 바뀌었습니다.

위의까지의 과정이 끝나면 404674 주소로 이동하고 4084D0 주소 값에 0x601605C7을 더합니다.

더한 값인 0x6771D2DE를 4084D0 주소에서 확인할 수 있습니다.

다음 어셈블리를 확인해 보겠습니다.
inc [4084D0]: 우리의 입력값을 한번 더 1을 증가시킵니다. 총 2번 반복되어 2가 증가됩니다.

값이 2가 더해져 E0로 바뀌었습니다.

xor eax, eax: eax 값을 0으로 초기화합니다.
밑의 Correct를 출력하는 어셈블리가 있지만 jmp 404690로 404690 함수를 호출합니다.

404690 주소로 가서 어셈블리를 확인해 보면 연산된 입력값을 eax에 복사합니다.
이후에 40466F 주소에 0xC39000C6 값을 복사합니다.
그다음 40466F 함수를 호출합니다.
이 함수는 아까 오류를 발생시켰던 함수입니다. 우리의 입력값은 지금 eax에 담겨 있습니다.
eax의 값은 지금 0x6771D2DE입니다.

40466F 함수는 eax에 nop을 복사했습니다.
그렇다면 우리의 입력값인 0x6771D2DE에 nop을 복사합니다.

이 함수에서 ret이 될 때 4046AE로 반환이 된다는 것을 확인했습니다.

해당 주소를 가보면 eax값을 1 증가시켜 0x6771D2DE+1인 0x6771D2DF에 또 40466F 함수를 호출해 nop을 복사할 것입니다. 그렇다면 지금 우리의 입력값을 연산하고 2바이트만큼의 nop처리를 하고 있습니다.
그 뒤 어셈블리를 보면 jmp 401071로 분기합니다.

401071 주소를 보겠습니다. 주소 코드가 EB 11 2byte 크기입니다.
해당 코드를 nop를 처리하면 Correct가 출력될 것입니다.
결국 이 주소 코드를 우회하면 문제를 해결할 수 있습니다.
위에선 우리의 입력값을 연산하고 그 연산한 값의 주소에 nop를 2번 복사했었습니다.
그렇다면 0x90인 nop가 401071 401072에 입력되면 해당 분기문이 무력화되어 Correct를 출력할 것입니다.
입력값 + 0x601605C7 + 0x4 = 0x401071이 되어야 합니다.
입력값 = 0x401071 - 0x601605CB


입력값은 2687109798이 됩니다.

2687109798을 입력하여 다시 디버깅을 수행하면 eax에 401071값이 저장되어 있는 것을 확인할 수 있습니다.

이후 2번의 nop 처리를 하고 401071로 분기합니다.

그럼 우리가 원한대로 401071, 401072 총 2바이트 주소 공간이 nop이 저장되어 기존 jmp 분기문이 무력화되어 밑 어셈블리가 실행되어 Correct! 다이얼로그를 띄우게 됩니다.

'Reversing > Reversing.kr' 카테고리의 다른 글
| [Reversing.kr] Easy Keygen (0) | 2026.01.12 |
|---|---|
| [Reversing.kr] Easy Crack (0) | 2026.01.04 |