1. 레나튜토리얼 1번 문제 분석
[그림 1-1] 코드 분석 - 1
먼저 GetModuleHandleA는 모듈 핸들을 호출할 때 쓰이는 함수다. 두번째로 LoadIconA는 아이콘을 호출할 때 쓰이는 함수이며 LoadCursorA는 커서를 호출할 때 쓰이는 함수다. A는 아스키 값을 의미하는데 이 부분에선 각 함수가 어디에 쓰이는지 파악해야 한다.
[그림 1-2] 코드분석 - 2
CreateFileA 함수쪽 라인에 BP를 건다. BP를 걸었기 때문에 실행시켜도 CreateFileA 함수 라인에서 멈추게 된다. 파일이 생성되면서 그에 따른 인자값들이 전달되는데 Mode=OPEN_EXISTING은 만약 어떤 파일이 존재하면 연다는 의미다. 현재 코드 흐름으로 봐선 Keyfile.dat 파일이 존재하면 연다는 의미로 추측해볼 수 있다.
[그림 1-3] 코드분석 - 3
F8을 눌러 실행해보면 EAX 값과 -1을 비교하는 구문이 있다. 레지스터에선 EAX 값은 FFFFFFFF로 표시된다. 컴퓨터엔 -1이라는건 존재하지 않기 때문에 FFFFFFFF로 표시되는 것이다. 아직 여기선 EAX 값에 대해 알 수는 없는 상태다.
[그림 1-4] 코드분석 - 4
비교 구문에서 다시 F8을 눌러 실행해보면 제로 플래그 구문이 실행되고 Z 값이 1이면 MessageBoxA 함수를 실행하고 있는 상태다.
[그림 1-5] 코드분석 - 5
제로 플래그가 1인 상태에서 한번 더 실행하면 뭔가 종료를 알리는 메시지 경고창이 출력된다.
[그림 1-6] 코드분석 - 6
코드를 재실행 한 후 제로플래그를 0으로 변환한 후 실행하면 ReadFile 함수가 있는 라인으로 점프하게 된다. 단 여기서 CreateFileA 함수가 정상적으로 실행되었다는 가정하에 진행해야 한다.
[그림 1-7] 코드분석 - 7
ReadFile 함수에서 F8을 눌러 실행해보면 EAX와 EAX를 비교해서 테스트한다. 이 때 테스트는 EAX 값이 00000000임을 확인하기 위함이다.
[그림 1-8] 코드분석 - 8
F8을 두번 눌러 실행한 후 제로플래그가 1인지 확인한다.
[그림 1-9] 코드분석 - 9
JMP 함수에서 제로 플래그가 1인 상태에서 F8을 실행하면 해당코드로 이동된다. 현재 코드를 실행하면 Text 내용이 담긴 메시지 박스가 출력되며 Key File이 없으면 프로그램이 종료된다.
[그림 1-10] 코드분석 - 10
코드를 재실행해서 JNZ까지 실행한 후 제로 플래그를 0으로 바꾼다. JMP 함수 바로 아래에 나오는 코드들은 Keyfile이 있어야 실행이 되는건데 제로플래그를 0으로 바꾸면 JMP 함수를 우회할 수 있다.
[그림 1-11] 코드분석 - 11
실행 결과 KeyFile이 존재할 때 출력되는 메시지 경고창이 담긴 코드로 점프되었다. 이는 JMP 함수의 제로플래그 값을 바꿔 KeyFile 우회가 가능한 불법프로그램임을 알 수 있다.
'악성코드분석' 카테고리의 다른 글
리버싱 기초 (3) (0) | 2021.01.11 |
---|---|
리버싱 기초 (2) (0) | 2021.01.11 |
리버싱 기초 (1) (0) | 2021.01.10 |
UPX 자동 언패킹 (0) | 2021.01.05 |
MP3 컨버터를 이용한 Exploit (0) | 2018.01.21 |