Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 9. 23. 00:30
Lena Tutorial (Level 17) Wargame/Lena Tutorial
728x90

이번 포스트에서는 레나 튜토리얼의 Level 17 문제에 대해 다루겠다.


문제를 실행하면 다음과 같다.

Level 17

## 문제 해석 : 

키를 점검하는 프로그램이다. 우리가 입력한 값의 대응키를 구하면 되는 것으로 보인다.

## 문제 풀이 :  

Ollydbg를 통해 해당 프로그램을 실행해보겠다.

Ollydbg

우선 해당 프로그램에 아무 값이나 입력한 다음에 정지를 해보겠다.

오류창

그럼 위와 같이 오류창 하나가 뜬다.

 

이어서 Call stack 부분을 확인해보겠다.

Ollydbg - K

Call stack을 보면 위와 같이 오류 메시지 박스가 출력된 부분을 확인할 수 있다.

 

해당 부분에 들어가서 모든 References에 대해 BP를 걸어보겠다.

Set breackpoint on every command

그런 다음에 재실행하면 아래와 같이 모든 MessageBoxA에 bp가 걸린 모습을 확인할 수 있다.

MessageBoxA

해당 코드의 윗부분을 살펴보면 키를 확인하는 절차가 존재한 것을 알 수 있다.

키 확인 절차

해당 절차에 대해 설명하자면 다음과 같다.

# 루프 시작 전

  1. 4012F6 ~ 4012FB : 사용자가 입력한 값(이하 name)의 길이를 계산
  2. 401302 : 길이 값을 ECX에 저장
  3. 401304 : EAX의 값을 1로 변경

# 루프 시작 후

  1. 401309 : EDX에 name의 값을 저장(Dword이므로 4바이트만)
  2. 40130F : DL에 EAX + 403037의 값을 저장(DL이므로 EDX의 하위 1바이트만), 즉 name의 EAX 번째 값을 EDX의 하위 EAX 번째 값에 저장
  3. 401315 : EDX와 0FF를 AND 연산을 실행 (리틀엔디안 방식이므로 FF제외 다 0이므로 EDX의 하위 1바이트만 살아남고 나머지는 다 0으로 초기화된다.)
  4. 40131B : EBX에 EDX의 값을 저장
  5. 40131D : EBX에 EBX * EDX의 값을 저장
  6. 401320 : ESI에 ESI + EBX의 값을 저장
  7. 401322 : EBX에 EDX의 값을 저장
  8. 401324 : EBX를 왼쪽으로 1을 shift한다. (예시, 1111 -> 0111, 이는 2로 나누는 것과 같은 결과가 나온다.)
  9. 401326 : EBX에 3을 더한 값을 저장
  10. 401329 : EBX에 EBX * EDX의 값을 저장
  11. 40132C : EBX에 EBX - EDX의 값을 저장
  12. 40132E : ESI에 ESI + EBX의 값을 저장
  13. 401330 : ESI에 ESI + ESI의 값을 저장
  14. 401332 : EAX의 값을 1 증가
  15. 401333 : ECX의 값을 1 감소
  16. 401334 : ECX가 0이 될 때까지 위 과정 반복 ()

해당 절차를 파이썬 코드로 작성하면 다음과 같다.

### 공격 코드 :

name = "AAAA"

ESI = 0 # 초기값이 0

# 루프 시작
for EDX in name:
	EDX = ord(EDX)
	EBX = EDX
	EBX *= EDX
	ESI += EBX
	EBX = EDX
	EBX = EBX // 2
	EBX += 3
	EBX *= EDX
	EBX -= EDX
	ESI += EBX
	ESI += ESI

print(hex(ESI))

### 실행 결과 :

출력 결과

실제 스택의 결과를 확인해보면 ESI의 값이 똑같다는 것을 알 수 있다.

Ollydbg - 스택

이어서 확인해보면 ESI를 403138의 값과 비교하여 같으면 성공했다는 메시지가 출력한다는 것을 확인할 수 있다.

401336

여기서는 인라인 패치 기법을 통해 403138에 ESI의 값을 넣은 다음에, 해당 값을 확인해보겠다.

 

먼저 빈공간에 인라인 패치 코드를 작성해보겠다.

인라인 패치 코드

이어서 해당 코드를 호출하고 403138의 값을 출력해보겠다.

인라인 패치 코드 호출 및 값 출력

### 실행 결과 :

대응키 출력

해당 문자는 Ollydbg의 403138에서도 확인할 수도 있다.

403138

### 최종 실행 결과 : 

우회 성공

이로써 해당 프로그램의 Crack를 마치겠다.

'Wargame > Lena Tutorial' 카테고리의 다른 글

Lena Tutorial (Level 16)  (0) 2022.09.14
Lena Tutorial (Level 15)  (0) 2022.09.12
Lena Tutorial (Level 14)  (0) 2022.09.05
Lena Tutorial (Level 13)  (0) 2022.09.04
Lena Tutorial (Level 12)  (0) 2022.09.03
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!