본문 바로가기

리버싱/Lena Tutorial

level 1

프로그램을 실행하면 라이센스 관련 오류가 발생한다
올리디버거를 보면 CreateFileA 함수를 볼 수 있는데 파일을 만들 때와 열 때 사용한다.

위 사진을 보면 읽기 모드이고 OPEN_EXISTING으로 열었다는 사실을 알 수 있다. 그리고 경로도 따로 지정되어 있지 않고 파일 이름만 정해져 있으면 현재 실행 중인 프로그램이 있는 폴더 내에서 찾는다.

msdn에서 검색해보면 함수가 어떻게 구성되어 있는지 자세히 알 수 있다.

함수를 실행하는데 여러개의 인자가 필요하므로 인자 값을 전달한다.

OPEN_EXISTING에 대한 설명으로 파일이나 장치가 있는 경우에만 열고 지정된 파일이나 장치가 없으면 함수는 실패한다고 적혀있다.

 

CreateFileA 함수에 대한 결과를 FFFFFFFF로 리턴한다.
함수의 리턴값과 -1(에러발생)을 비교하는데 값이 같으면 에러가 발생한다는 뜻이되어 다음 주소로 이동하고, 값이 다르면 40109A 주소로 분기된다.
40109A 주소로 이동하지 않으면 MessageBoxA 함수가 동작해서 프로그램을 실행했을 때 발생했던 오류가 나타나고 ExitProcess 함수가 동작해서 프로그램이 종료되므로 40109A로 분기되어야 한다.

현재는 JNZ조건문이 수행되도록 하기 위한 2가지 방법이 있다.

 

1

JNZ 조건문에서 Z[Zero Flag]가 1이라서 40109A로 JMP하지 않으므로 JNZ를 JMP 명령어로 패치하여 항상 40109A로 이동할 수 있도록 한다.

 

2

Z를 0으로 변경하면 40109A로 이동한다.
40109A로 가면 ReadFile 함수가 실행된다.

hFile : 정상적으로 파일을 열었을 때 핸들링한 것을 반환하는데 그 핸들을 통해 파일을 제어할 수 있다. hFile에는 핸들에 대한 ID(숫자 정보)가 들어간다.

Buffer : 어디에 이 데이터를 쓸 것이지를 세팅해준다.

BytesToRead : 몇바이트나 읽을 것인지를 저장한다. 사진에 46은 16진수 70은 10진수를 의미

pBytesRead : 실질적으로 읽어 들인 바이트의 개수

 

EAX가 0인지 확인하기 위함이고 실제로 EAX에 0이 들어가있다. 그래서 ZF는 1이다.

1. JNZ조건문은 EAX가 0이라서 4010B4로 분기되지 않고 다음 주소로 이동한다.

2. JMP조건문을 수행하면 4010F7번지의 "Keyfile is not valid. Sorry."라는 문구가 뜨는 MessageBoxA 함수가 뜨고

ExitProcess로 인해 프로그램이 종료되기 때문에 JNZ조건문에서는 강제로 JMP 시켜야 한다.

3. "XOR EBX,EBX", "XOR ESI,ESI" 명령어는 EBX와 ESI를 각각 0으로 초기화시키는 명령어이다.

4. CMP비교문을 수행하면 JL조건문의 조건이 충족되기 때문에 분기가 진행되는데 분기되는 주소는 MessageBoxA 함수가 동작해 오류가 발생하는 부분이기 때문에 패치가 필요하다.

 

마우스 오른쪽 - Search for - All referenced text strings를 누르면 이 프로그램에 참조되는 문자열들을 확인할 수 있다. 문제를 해결하면 출력되는 문자열을 볼 수도 있기에 문제해결에 도움이 될 수 있다. 이 문제에선 "You really did it! congratz" 문자열을 볼 수 있고, 더블클릭하면 그 문자열이 있는 주소를 바로 이동한다. 이젠 401205번지로 분기되는 조건문을 찾으면 된다.

디버거를 재시작하고 40107B번지와 4010B0번지를 Break Point 지정하고 ZF를 0으로 바꿔준다.

 

JL은 JUMP LESS THAN의 약자로 ZF에 의해 결정되는 것이 아니라 앞의 비교문을 보고 더 작은지 무어보는 것이기 때문에 S[Sign Flag]가 1로 Flag가 새워져 있어서 분기가 일어나면 오류가 발생하기 때문에 Flag를 내려줘야한다.

 

앞에서 ESI를 0으로 초기화 시켜서 JL조건문이 실행되기 때문에 S를 0으로 바꿔준다
401205주소 값으로 분기가 진행된다.
성공 메시지를 출력하는 부분이다. 프로그램을 끝까지 실행하면 아래 화면이 나타난다.
문제해결 결과창

 

문제는 해결했으나 이렇게 파일을 만들면 항상 했던 일들을 반복해야 하는 단점이 있어서 파일을 수정해서 저장하는 것이 좋다.

 

JMP로 패치하면 무조건 분기되는 주소로 이동한다.

 

JMP 하면 안 되기 때문에 NOP(=NO OPERATION)으로 채워준다.

 

수정이 끝났으면 수정한 부분을 선택한 후 위의 창에서 Selection을 누르고
위의 창에서 Save file을 누르면 수정한 부분이 적용된다.

 

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

level 8  (0) 2019.08.16
level 5  (0) 2019.05.23
level 4  (0) 2019.05.21
level 3  (0) 2019.05.20
level 2  (0) 2019.05.17