Lena Tutorial
1번문제 (메시지함수 우회)
Lena 문제중 한 문제
우선 프로그램을 실행시키면 다음과 같은 메시지 박스가 나오고 잔소리? 를 제거하고 올바른 키값을 찾으라고 한다.
확인을 누르면 다음과 같은 창이 뜨고 임의의 입력값을 입력시 잘못된 코드라고 창이 나온다.
우선 메시지박스를 호출하는 API를 찾아 모두 BP를 걸어준다.
Visual Basic에서 메시지 박스 출력 함수는 MSVBVM50.rtcMsgBox 이다.
해당 프로그램을 재시작(F9)를 해주면 걸어둔 BP에서 멈추게 되고 실행(F8)을 하게 되면 처음 보았던 창이 나오게 된다.
402CFE 코드에서 조금 위로 올라가면 402C17주소에 함수의 시작을 나타내는 스택 프레임의 프롤로그가 보인다.
push ebp
mov ebp, esp
해당 메시지박스가 출력되지 않게 시작부분에 바로 리턴을 줘서 메시지가 출력되지 않게 할것이다.
그렇기 위해서는 리턴되는 함수의 파라미터 개수를 알아야한다.
우선 시작 주소에 BP를 걸어주고 재시작
그러면 402C17 함수시작 코드에서 스택에 저장된 리턴 주소(7401E5A9)를 확인할 수 있다.
리턴 주소로 가게되면 이 코드영역이 MSVBVM50.dll 모듈 영역인것을 확인가능.
7401E5A7주소의 CALL eax가 실행된 후 7401E5A9 주소로 리턴 되게 되므로 CALL 주소에 BP설치
그리고 프로그램을 재시작하여 실행하면 EAX의 값이 402656이라는 것을 확인할 수 있다.
또한 402C17의 함수 파라미터 개수 +4를 알수 있음.
다시 시작 스택 프레임으로 돌아가 어셈블리어를 변경하여 ret 값을 4로 주어 아무것도 실행되지 않도록 설정
그 후 프로그램을 재시작하면 메세지박스가 출력되지 않고 바로 본 프로그램이 실행되는 것을 확인할 수 있다.
2번문제 (시리얼 값 획득)
메시지박스 우회를 하고 입력값을 입력하면 잘못된 값이라고 출력이 된다.
우회 방법에는 2가지의 방법이 있다.
방법 1 (입력값 찾기)
값 입력시 나타나는 문자열을 검색하여 찾은 후 조금 위로 올려보면 값을 비교하는 함수를 찾을 수 있다.
i'mlena51
call <JMP .&__vbaStrCmp> = 값 비교 함수
해당 값을 입력하면 성공 문구가 출력된다.
방법 2 (어셈블리어 패치)
성공했을때의 출력문구를 찾아 시작 코드를 찾는다
그 후 잘못된 입력값을 넣었을때 비교하는 시작 로직의 코드를 성공했을때의 시작 코드로 패치