이번 포스트에서는 레나 튜토리얼의 Level 17 문제에 대해 다루겠다.
문제를 실행하면 다음과 같다.
## 문제 해석 :
키를 점검하는 프로그램이다. 우리가 입력한 값의 대응키를 구하면 되는 것으로 보인다.
## 문제 풀이 :
Ollydbg를 통해 해당 프로그램을 실행해보겠다.
우선 해당 프로그램에 아무 값이나 입력한 다음에 정지를 해보겠다.
그럼 위와 같이 오류창 하나가 뜬다.
이어서 Call stack 부분을 확인해보겠다.
Call stack을 보면 위와 같이 오류 메시지 박스가 출력된 부분을 확인할 수 있다.
해당 부분에 들어가서 모든 References에 대해 BP를 걸어보겠다.
그런 다음에 재실행하면 아래와 같이 모든 MessageBoxA에 bp가 걸린 모습을 확인할 수 있다.
해당 코드의 윗부분을 살펴보면 키를 확인하는 절차가 존재한 것을 알 수 있다.
해당 절차에 대해 설명하자면 다음과 같다.
# 루프 시작 전
- 4012F6 ~ 4012FB : 사용자가 입력한 값(이하 name)의 길이를 계산
- 401302 : 길이 값을 ECX에 저장
- 401304 : EAX의 값을 1로 변경
# 루프 시작 후
- 401309 : EDX에 name의 값을 저장(Dword이므로 4바이트만)
- 40130F : DL에 EAX + 403037의 값을 저장(DL이므로 EDX의 하위 1바이트만), 즉 name의 EAX 번째 값을 EDX의 하위 EAX 번째 값에 저장
- 401315 : EDX와 0FF를 AND 연산을 실행 (리틀엔디안 방식이므로 FF제외 다 0이므로 EDX의 하위 1바이트만 살아남고 나머지는 다 0으로 초기화된다.)
- 40131B : EBX에 EDX의 값을 저장
- 40131D : EBX에 EBX * EDX의 값을 저장
- 401320 : ESI에 ESI + EBX의 값을 저장
- 401322 : EBX에 EDX의 값을 저장
- 401324 : EBX를 왼쪽으로 1을 shift한다. (예시, 1111 -> 0111, 이는 2로 나누는 것과 같은 결과가 나온다.)
- 401326 : EBX에 3을 더한 값을 저장
- 401329 : EBX에 EBX * EDX의 값을 저장
- 40132C : EBX에 EBX - EDX의 값을 저장
- 40132E : ESI에 ESI + EBX의 값을 저장
- 401330 : ESI에 ESI + ESI의 값을 저장
- 401332 : EAX의 값을 1 증가
- 401333 : ECX의 값을 1 감소
- 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의 값이 똑같다는 것을 알 수 있다.
이어서 확인해보면 ESI를 403138의 값과 비교하여 같으면 성공했다는 메시지가 출력한다는 것을 확인할 수 있다.
여기서는 인라인 패치 기법을 통해 403138에 ESI의 값을 넣은 다음에, 해당 값을 확인해보겠다.
먼저 빈공간에 인라인 패치 코드를 작성해보겠다.
이어서 해당 코드를 호출하고 403138의 값을 출력해보겠다.
### 실행 결과 :
해당 문자는 Ollydbg의 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 |