레나튜토리얼1. reverseMe
레나튜토리얼 첫번째 reverseMe를 실행파일을 실행하면 출력되는 메시지 박스.
* 평가판 기간이 끝났습니다. 새로운 라이센스를 구매해주세요
이 문제는 리버싱을 통해서 메시지 박스를 변경하여 출력하면 됩니다.
* 풀이
=> 40107B - JNZ 명령어를 JMP 명령으로 수정.
=> 4010B0 - JNZ 명령어를 JMP 명령으로 수정.
=> 4010BF - JL 명령어를 JG로 수정.
=> 4010D6 - JL 명령어를 JG로 수정.
올리디버거를 통해서 실행파일을 디버깅하면 401000부터 디스어셈블 창에 표시됩니다.
F8 을 눌러 하나씩 아래로 내려가면 주소 401073에서 CreateFileA 함수를 확인하실 수 있습니다.
CreateFileA (msdn 참고)
- 파일 혹은 입출력장치를 생성하거나 여는 함수
- 7개의 매개변수를 가지며, FileName을 포함하고 있음.
- 파일이 생성 및 열지를 못하면 -1 값을 리턴함.
CreateFileA 함수를 통해서 keyfile.dat을 열어서 키 값을 확인하는데, 우리는 파일이 없다.
그래서 함수가 정상 실행되지 못하고 return 값으로 -1(FFFFFFFF)을 넘겨준다.
주소 401073 함수 실행
- EAX의 리턴값이 FFFFFFFF로 설정되어 있다.
(어셈블리에서 함수의 리턴값은 EAX에 저장되며, -1은 FFFFFFFF로 표현됨.)
주소 401078 CMP EAX, -1
- EAX과 -1을 비교하면 zf(zero flag)값이 1로 설정
- 여기서 값이 같으므로 1로 설정됨.
주소 40107B JNZ SHORT reverseM.0040109A
- 매우 중요한 부분. 이 부분을 수정하여 초기 '라이센스 구매' 메시지 박스를 피할 수 있다.
- JNZ => zf가 1이 아니면 점프하라. 현재 ZF가 1로 설정이 되어 있어 점프하지 않고 다음 명령을 그대로 실행.
- 이 경우 "라이센스 구매" 메시지 박스가 출력되므로 반드시 점프해야한다.
- 해결방안 => JNZ명령어를 JMP명령으로 수정. (CMP 명령과 상관없이 점프하므로 라이센스 메시지 박스를 피함.)
'IT Security' 카테고리의 다른 글
취약점 ) PHP.Diescan - die함수 (1) | 2019.05.24 |
---|---|
오픈소스로 구축한 보안인프라 (0) | 2019.03.24 |
칼리리눅스 - sparta 취약점도구 (1) | 2019.01.17 |
CVE - 보안 취약점 (2) | 2019.01.08 |
리버싱) 바이트 오더링 및 레지스터 (0) | 2018.12.03 |