본문 바로가기

My Study/Reversing

Assembly 점프 문

리버싱을 하다보면 코드상에 점프문이 많이 있는데 머리가 나쁜지.. 맨날 보는 점프문인데도 항상.. 까먹어서 정리를 했습니다.
리버싱 할때 이 점프문을 옆에 메모장으로 띄워놓고 한다는.........ㅠ_ㅠ.....
점프 문이고 플래그 값이 뭘 때 점프를 한다는 것까지 정리를 해봤습니다.
Left, Right로 조건 쓴것은.. 알기 쉽게..!

Windows
JZ      ZF = 1
JNZ    ZF = 0
JC     CF = 1
JNC   CF = 0
JO     OF = 1
JNO   OF = 0
JS      SF = 1
JNS    SF = 0
JP      PF = 1
JNP    PF = 0

JE      Left = Right      ZF = 1
JNE    Left ≠Right      ZF = 0
JCXZ                       CX = 0
JECXZ                     ECX = 0

JA(JNBE)      Left > Right     CF = 0 and ZF = 0
JAE(JNB)      Left ≥Right     CF = 0
JB(JNAE)      Left < Right     CF = 1
JBE(JNA)      Left ≤Right     CF = 1 or ZF = 1

JG(JNLE)      Left > Right     ZF = 0 and SF = 0
JGE(JNL)      Left ≥Right     SF = 0
JL(JNGE)      Left < Right     SF = 1
JLE(JNG)      Left ≤Right     ZF = 1 or SF = 1


Linux

리눅스 같은 경우는 gdb로 바이너리 파일을 열 경우 AT&T문법으로 나오기 때문에 

윈도우 : mov eax , ebx

리눅스 : mov %ebx , %eax

위와 같이 나온다. 그렇기 때문에 점프문이 나왔을 때는 윈도우와 반대로 생각해서 보면 된다.

AT&T 문법을 자세히 알고 싶으신 분은 아래 링크로 ^^

http://ttongfly.net/zbxe/?document_srl=45192

즉, 윈도우에서 jle가 나올 경우 Left ≤ Right 인데 리눅스에서 jle가 나왔을 땐 Left ≥ Right 이라고 생각하면 된다.


이해를 돕기위해 리눅스에서 파일 하나 만들어서 C코드와 어셈코드로 보여주겠다.


직접 C코드와 어셈코드를 비교해보면서 보면 이해가 될 것이다.

귀찮다면.. 리눅스 상에서도 intel명령어로 보면된다. set disassembly intel... ^^