※ 작년에 작성한 라이트업입니다. ※ 

 

 

 

1. 01.exe 파일을 올리 디버거로 연다.

 

 

2. F8로 하나씩 실행해보면서 확인한다.

 

 

3. EAXESI를 비교해서 같을 경우 0040103D로 점프를 하도록 되어 있다.

 

 

4. 그대로 실행을 할 경우 EAX의 값과 ESI의 값이 동일하지 않기 때문에 점프를 하지 않고 넘어가 “Nah.. This is not a CD-ROM Drive!” 라는 에러 메시지를 띄운다. 메시지를 띄우지 않도록 하기 위해서는 점프 명령이 실행되어 에러 메시지를 건너 뛰고 바로 성공 메시지를 띄우는 부분으로 넘어가야 한다.

 

 

5. JEJNE로 바꿔서 일치할 경우가 아니라 일치하지 않을 경우에 점프를 하도록 한다.

 

6.      오류 메시지 대신 “Oh, I really think that your HD is a CD-ROM :P”라고 뜨는 것을 확인할 수 있다.

 

 

 

 

 

 cmp는 sub 연산을 통해 비교하는 명령이다. 이는 sub 명령과 동일하지만 오퍼랜드에 영향을 미치지 않는다.

cmp dst, src ZF CF
dst = src 1 0
dst < src 0 1
dst > src 0 0

 이때, ZF는 제로 플래그로 연산의 결과가 0과 같을 경우 설정되고, 그 외에는 0 값을 가진다. CF는 캐리 플래그로 연산의 결과가 대상 오퍼랜드에 너무 크거나 작을 경우 설정되며 그 외에는 0이다. 

 또한 jz와 jnz 명령은 ZF 플래그의 값에 따라 결정된다. jz는 ZF가 1일 경우, jnz는 ZF가 0일 경우 점프 명령이 실행된다. 따라서 코드를 바꾸지 않고 ZF의 값을 변경해도 문제가 풀린다. 

 

 

 이렇게 ZF 플래그의 값을 조정하는 방법도 있고, JE 명령이 실행되도록 하여 파일이 정상적으로 실행되게 할 수도 있다. cmp EAX, EAX 등 항상 참으로 나오도록 해도 문제가 풀린다. 

728x90

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

CodeEngn(코드엔진) basic 06  (0) 2020.06.25
CodeEngn(코드엔진) basic 05  (0) 2020.06.25
CodeEngn(코드엔진) basic 04  (0) 2020.06.25
CodeEngn(코드엔진) basic 03  (0) 2020.06.25
CodeEngn(코드엔진) basic 02  (0) 2020.06.25