| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- AWS
- C
- Amazon S3
- 프로그래머스
- reversing.kr
- programmers
- sql
- python
- 파일 시스템
- terraform
- network
- CrackMe 문제
- TryHackMe
- dreamhack
- AWS 3 Tier Architecture
- AWS 침해 사고 사례 분석
- 버퍼 오버플로우
- operating system
- 악성코드 분석
- 드림핵
- AWS 침해사고 사례 분석
- Database
- 네트워크
- crackme
- AWS 보안 아키텍처 분석
- AWS 사고 사례 분석
- 리버싱
- 악성코드분석
- reversing
- 운영체제
- Today
- Total
lhywk 님의 블로그
[실습] crackme3_find_input_key 본문
문제 바이너리를 실행한다.

Key를 입력하는 창이 나오고 짧으면 Key Is To Short! 길면 Key Is To Long!을 출력하고 프로그램을 종료한다.
x64디버거로 해당 바이너리를 분석한다.

문자열들을 참조해서 중단점을 모두 걸어본다.

401532 함수는 문자열을 인자로 받고 화면에 그대로 출력하는것을 보아 printf 함수로 볼수있고 레이블을 달아준다.

ebp-28의 주소를 eax에 저장하고 스택에 그 주소와 %s 포맷 문자열을 인자로 넣은 후 40151B를 호출한다.
변수를 저장할 주소와 포맷문자열을 넣어 호출하는 함수인 scanf로 볼수있다.


ebp-28위치에 가면 우리가 입력한 123456789가 들어있는것을 볼수있다.

다음 어셈블리를 확인해보면
우리가 입력한 값이 들어있는 주소를 ecx에 넣고 스택에 넣은뒤 4014A0를 호출한다.
이 함수는 모르겠지만 일단 f8로 실행해본다.

eax에 리턴값으로 9가 적혀있는 것을 볼수있고 이것은 문자열의 길이를 반환하는 strlen 함수로 볼수 있다.

다음 어셈블리를 확인해보면 방금 리턴 받은 문자열의 길이인 9를 ebp-58에 저장 후 비교하고 있다.
Key Is To Long을 피하기 위해선 27 이하의 문자열이어야한다.
Key Is To short를 피하기 위해선 26 이상의 문자열이어야한다.
그렇다면 10진수로 38~39 사이의 문자열인것을 알수 있다.

이번엔 39자의 문자열을 넣고 실행해본다.

그렇다면 해당 조건문들을 우회하고 다음 커맨드로 내려올 수 있다.

mov [ebp-54], 0: 0을 ebp-54에 복사한다.

jmp 4010C7로 넘어간다
mov eax, [ebp-54]: 0을 eax에 넣고
cmp eax, [ebp-58]: 문자열의 길이와 eax와 비교한다.
jg 조건은 만족하지않기때문에 그대로 밑으로 내려간다.
mov ecx, [ebp-54]: 0을 ecx에 넣고
movsx edx, [ebp+ecx-28]: ecx가 지금은 0이니 ebp-28 즉 문자열의 첫번째 값을 edx에 복사
test edx, edx, je 4010ED: NULL이면 스킵
mov eax, [ebp-54]: eax에 0을 넣고
movsx ecx, [ebp+eax-28]: ecx에 0번째 문자 0을 복사
sub ecx, 1: 문자 0에서 1을 뺌

mov edx, [ebp-54]: 0을 edx에 복사
mov byte ptr [ebp+edx-28], cl: '/'을 0번째 인덱스에 복사
jmp 4010BE로 점프하고 다시 반복한다.
하나의 루프만 지금 같이 분석해보았다. 이 패턴은
1. 루프 초기화
mov [ebp-54], 0 ; i = 0
jmp 4010C7 ; 조건 체크로 점프
2. 루프 카운터 증가 (4010BE)
mov edx, [ebp-54]
add edx, 1
mov [ebp-54], edx ; i++
3.루프 조건 체크 (4010C7)
mov eax, [ebp-54]
cmp eax, [ebp-58] ; i vs 문자열 길이
jge 4010EF ; i >= 길이면 루프 탈출
4. 루프 본체
문자 읽기
mov ecx, [ebp-54] ; ecx = i
movsx edx, byte ptr [ebp+ecx-28] ; edx = 입력문자[i]
test edx, edx
je 4010ED ; NULL이면 스킵
변환 처리
mov eax, [ebp-54] ; eax = i
movsx ecx, byte ptr [ebp+eax-28] ; ecx = 입력문자[i]
sub ecx, 1 ; ecx = 입력문자[i] - 1
mov edx, [ebp-54] ; edx = i
mov byte ptr [ebp+edx-28], cl ; 입력문자[i] = 원래값 - 1
다음 반복
jmp 4010BE ; i++ 로 점프
C언어로 표현하면 다음과 같다.
for (int i = 0; i < strlen(input); i++) {
if (input[i] == 0) continue;
input[i] = input[i] - 1; // 각 문자를 -1 변환
}
// 변환된 input을 정답 문자열과 strcmp

lea eax, [ebp-50]: ebp-50 주소를 eax에 저장

ebp-50엔 정답 문자열이 들어있다.
push eax로 스택에 저장
lea ecx, [ebp-28]: ebp-28의 주소를 ecx에 저장

ebp-28엔 우리의 입력값에서 1을 뺀 문자열이 들어있다.
push ecx로 스택에 저장
그리고 call 401310을 호출한 후 우리의 입력값이 맞다면 Key is ~ 문자열을 출력하여 성공 아니라면 실패다.
그렇다면 정답 문자열을 다음과 같다.
EHMC^XNTQ^JDX^SGHR^HR^RHLOKD^QDUDQRHMF
역연산을 진행하면 이 문자열에 1을 더한값을 입력으로 주어야한다.
정답 문자열: FIND_YOUR_KEY_THIS_IS_SIMPLE_REVERSING

'Malware Analysis' 카테고리의 다른 글
| [실습] IDA_Training1.exe 분석 (1) | 2026.07.10 |
|---|---|
| [실습] crackme4_find_password_type (0) | 2026.07.09 |
| [실습] crackme2_find_number (0) | 2026.07.09 |
| [악성코드 분석] Procmon 동적분석 (0) | 2026.07.08 |
| [악성코드 분석] 프로세스/코드 인젝션 (0) | 2026.06.24 |