리버스 엔지니어링

리버싱 연습 - 점프에 관하여

Injel me 2020. 6. 30. 19:43
리버싱 핵심원리 책을 읽으면서
레지스터에 관한 곳을 읽다가 보니
전에 리버싱 하던 게 생각났다.
반복문을 사용하는 곳에서
비교해서 점프하는 문에 관해서 의문점이 갔었는데,(잘 몰랐기 때문에)
jz나 jnz처럼 비교해서 점프하는 어셈블리어는 그 앞에 cmp로 비교하는
어셈블리가 나와야 나오는 줄 알았지만
점프문 전에 연산이 있을 때 무슨 연산이건 그 연산의 결과가(레지스터) 0일 때 바뀌는
ZF(Zero Flag)값을 비교해서 jnz 명령어가 실행되는 거였다.

EDI에 SUB명령어로 1을 감산한 연산이 있은 후에 JNZ에서 ZF를 검사해서 실행되고,
오른쪽에 올리디버거가 보여주는 ZF가 1일 때(EDI에 연산을 해서 EDI가 0일 때)
실행되지 않아서 그 다음줄로 넘어간다.


해석하자면 EDI의 연산 결과가 0이면 ZF가 1이 되고, ZF가 1이 아닐 때(Jmp Not Zero) 주소로 점프해라.

참고로 cmp는 A에서 B를 뺐을 때 음수이면 CF(Carry Flag)가 1, 0일경우 ZF가 1이 된다고 한다.