| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 애플리케이션 계층
- linux
- 자바
- 알고리즘
- React
- 예술의 전당
- webhacking
- 악성코드 분석
- sk쉴더스 루키즈
- c
- Practical Malware Analysis Labs
- 트랜스포트 계층
- 레나튜토리얼
- 깃
- Dreamhack
- 프랑스어 #프랑스어배우기 #프랑스어독학 #델프인강 #시원스쿨프랑스어 #delf독학 #델프 #프랑스어기초 #프랑스어공부
- sk 쉴더스 루키즈
- 진입차수
- 웹개발
- 위상 정렬
- 우테코
- 서울청년문화패스
- 루키즈 31기
- 백엔드
- 프리코스
- SK쉴더스
- 코리안챔버오케스트라
- SK쉴더스루키즈
- 루키즈31기
- 우아한테크코스
- Today
- Total
yon11b
[SK 쉴더스 루키즈] 윈도우 악성코드 고급 동적 분석: OllyDbg, Lena reversing tutorial01 문제 본문
[SK 쉴더스 루키즈] 윈도우 악성코드 고급 동적 분석: OllyDbg, Lena reversing tutorial01 문제
yon11b 2026. 5. 30. 04:063가지 공부 거리가 있다.
1. 어셈 플래그 수정해서 성공하는 방법
2. 조건에 맞는 파일 생성하여 해결하는 방법
3. 크랙 만들기
1. 어셈 플래그 수정해서 성공하는 방법
1. 파일 존재 거짓말 치기
CreateFileA는 파일 생성만 하는 게 아니라 파일 open도 하는 함수이다.
둘 중에 뭘 할지는 세번째 인자에서 명시한다.
여기서는 PUSH 3 > OPEN_EXISTING으로, 이미 존재하는 파일 open하기이다.

그런데 Keyfile.dat이라는 파일이 존재하지 않으므로 EAX에 -1(FFFFF FFFFF)이 들어간다.
→ 참고: x86에서는 함수 반환값이 항상 EAX에 들어간다.

CMP 결과가 0이 아니어야 error msg 출력 코드를 건너뛰고 정상 흐름(ReadFile)으로 이동할 수 있다.
지금은 0이라 ZF(Zero Flag)가 1이 되어 있으므로 이걸 0으로 바꿔주자.
Zero flag = 1

Zero flag = 0

2. 파일 Read 내용 확인 거짓말 치기
파일 read 부분

없는 파일을 읽으려고 하니까 당연히 몇 바이트 읽었는지(0x00402173), 읽은 바이트(0x00402111A) 둘 다 아무 내용이 없이 0만 채워져 있는 것을 확인할 수 있다.
pBytesRead 부분(0x00402173)이 0이므로 CMP 402173, 10을 하면 음수가 나와서 JL 조건을 충족해서 error 메시지를 띄우는 곳으로 jmp해버린다.
CMP 402173, 10 결과가 음수라서 SF(Sign Flag)가 1이 되었고, JL은 SF를 보고 조건을 판단하므로, 우리는 SF 값을 1에서 0으로 바꿔주면 된다.

3. 파일 read 내부 실행 중 검증 우회하기
CMP ESI, 8의 결과로 SF=1이 되었다. 여기서도 음수면 error 메시지 출력하는 004010F7로 가버리므로, SF를 0으로 해주어야 한다.
코드 로직에 대해서는 조건파일 생성 풀이에서 좀 더 자세히 다룰 것이다.

그럼 00401008이 실행되고, 그 주소로 가보면

성공 메시지를 볼 수 있다!
개념 이해
JL은 작은지를 비교하는 것
jump if less: 왼쪽값이 오른쪽 값보다 작으면 점프한다는 뜻
signed: +/- 표기
왼쪽값이 오른쪽 값보다 작으면 sign flag가 1
음수: sign flag=1, of=0 / 양수: sf=0 of=0(overflow flag)
지금 그냥 나온 결과가 음수임. 이걸 양수로 만들어주기 위해 sf를 0으로 바꿔준 것임.
JL: 음수여야 점프함.
우린 점프하면 error message 출력하므로 점프하면 안됨.
그러니까 sign=1(음수)를 sign=0(양수)로 바꿔야 함

2. 조건에 맞는 파일 생성하여 해결하는 방법
이번에는 코드에서 어떤 조건으로 keyfile을 통과시키는지, 그 로직을 보고 로직에 맞는 파일을 직접 만들어서 문제를 풀어볼 것이다.

Keyfile.dat이름으로 된 파일을 open 한다.
⇒ 첫번째 조건: Keyfile.dat 파일을 만든다.
0x00402173에는 읽은 파일 바이트 값(길이)이 저장된다.
0x0040211A에는 읽은 파일 내용이 저장된다.

0x402173 위치에 있는 값과 0x10을 비교해서 음수가 나오면 error msg 위치(0x004010F7)로 이동

⇒ 두번째 조건: 파일 바이트는 0x10 이상이어야 한다.
ESI값과 8을 비교해서 음수가 나오면 error msg 위치로 이동

⇒ ESI값이 8이상이어야 한다.
ESI 값은 어떻게 증가시킬까? → AL값이 47h(’G’)여야 ESI가 INC 된다.

⇒ 세번째 조건: 파일 안의 문자열 'G'는 8개 이상이어야 한다.
종합: 길이 16이상 & G 8개 이상 문자열을 갖고 있는 Keyfile.dat 파일을 만들자.

성공!

3. 크랙 만들기
아래 부분들을 다 수정해 준 뒤, 변경된 부분을 파일로 저장하면 한번에 congratz가 나온다.




NOP으로 변경된 모습

추가: 저 로직을 코드로 만들어봐라!

if bytes_read >= 16:
while (*(sentence+i))
if *(sentence+i)=='G'
sen_len++
i++
if sen_len >= 8:
print('congratz')
'보안 > SK 쉴더스 루키즈' 카테고리의 다른 글
| [SK 쉴더스 루키즈] 고급 정적 분석 - IDA로 Practical Malware Analysis Labs 05-01.dll 분석하기 (0) | 2026.06.02 |
|---|---|
| [SK 쉴더스 루키즈] EMU 8086 실습(신호등, 계산기) (0) | 2026.05.30 |
| [SK 쉴더스 루키즈] 윈도우 기초 정적/동적 분석 실습 (Practical Malware Analysis LAB 03-02) (0) | 2026.05.29 |
| [SK 쉴더스 루키즈] 윈도우 기초 정적/동적 분석 실습 (Practical Malware Analysis LAB 03-01) (0) | 2026.05.29 |
| [SK 쉴더스 루키즈] 기초 동적 분석 도구 (procmon, procexp, regshot, SysAnalyzer) (0) | 2026.05.29 |
