Be Expert

[Reversing] 플래그 레지스터, 자주 쓰는 명령어 본문

Reversing

[Reversing] 플래그 레지스터, 자주 쓰는 명령어

psswrd 2020. 5. 4. 18:59

참고문헌 : 실전 악성코드와 멀웨어 분석, Michael Sikorski, Andrew Honig

 

최근 악성코드 분석 공부를 하면서 다시금 레지스터와 명령어에 대한 내용이 있어 정리해봤다.

 

플래그 레지스터(Flag register) : 실행 도중 각 플래그는 CPU 동작을 제어하거나 CPU 동작의 결과를 나타내기 위해서 (1) 이나 (0)이 설정된다.

 

  • ZF (제로 플래그) : 연산의 결과가 0과 같을 경우 설정되며(1로), 그 외에는0이다.
  • CF (캐리 플래그) : 연산의 결과가 대상 오퍼랜드보다 너무 작거나 클 경우 설정되며, 그 외에는 0이다.
  • SF (사인 플래그) : 연산의 결과가 음일 때 설정되고, 양일 때 0이 된다.
  • TF (트랩 플래그) : 디버깅 용도로 사용되며, x86 프로세서는 이 ah플래그가 설정됐을 경우 한 번에 하나의 연산만 수행한다.

자주 쓰는 명령어

  • mov
    • mov EAX, EBX : EBX의 값을 EAX 레지스터에 복사한다.
    • mov EAX, [EBX] : EBX 레지스터가 명시한 메모리 위치에 있는 4바이트 값을 EAX 레지스터로 복사한다.
  • lea :
    • lea EAX, [EBX+8] : (EBX의 값 + 8) 을 EAX에 저장한다.
    • lea EAX. [EBX + 8] 은 즉, 'mov EAX, EBX+8' 과 같은 의미이지만 'mov EAX, EBX+8' 은 성립할 수 없는 명령어.
  • mul '값' : EAX 레지스터 값에 '값'을 곱하는 형식으로, EAX와 EDX에 결과값을 나누어 저장한다. EAX 와 EDX에 결과값을 나누어 저장한다. EAX는 최하위 32비트, EDX는 최상위 32비트

mul 예시

  • div '값' : EDX와 EAX의 64비트 값을 '값'으로 나눈다. 나누기 연산의 몫은 EAX에 저장하고, 나머지는 EDX에 저장한다.
  • jump 명령어 중 자주 쓰이는 명령어 (loc은 특정 위치)
    • jz loc : ZF=1 이면 loc 이동
    • jnz loc : ZF=0 이면 loc 이동
    • je loc : cmp 명령어 이후에 사용. 비교한 값이 같을 경우 점프
    • jne loc : 비교한 값이 다를 경우 점프
    • jg loc : cmp 이후 목적지 오퍼랜드가 소스 오퍼랜드보다 크면 점프
    • jge loc : cmp 이후 목적지 오퍼랜드가 소스 오퍼랜드보다 크거나 같으면 점프
    • ja loc : jg와 같지만 부호 없는 비교 수행
    • jae loc : jge와 같지만 부호 없는 비교 수행 
    • jl loc : cmp 이후 목적지 오퍼랜드가 소스 오퍼랜드보다 작으면 점프
    • jle loc : cmp 이후 목적지 오퍼랜드가 소스 오퍼랜드보다 작거나 같으면 점프
    • jb loc : jl와 같지만 부호 없는 비교 수행 
    • jbe loc : jle와 같지만 부호 없는 비교 수행 
    • jo loc : 이전 명령어가 오버플로우 플래그(OF=1)을 설정했을 경우 점프
    • js loc : SF=1 를 설정했을 경우 점프
    • jecxz loc : ECX=0 일 경우 점프 
  • rep 명령어 : 데이터 버퍼를 조작하는 명령어 집합
    • 예시로 movsx, cmpsx, stosx, scasx 이며 x는 b,s,d 중에 선택해서 사용하고 b=byte, s=single word, d=double word를 의미한다.
    • rep 명령어는 ESI 와 EDI 오프셋을 증가시키고 ECX 레지스터를 감소시킨다.
    • rep : ECX=0 일 때까지 반복
    • repe, repz : ECX=0 또는 ZF=0 일 때까지 반복
    • repne, repnz : ECX=0 또는 ZF=1일 때까지 반복
    • rep movsb : ESI 주소에서 바이트를 꺼내 EDI 주소에 저장한 다음, 방향플래그(DF) 설정에 따라 하나씩 ESI와 EDI 레지스터를 증가시키거나 감소시킨다. DF=0이면 증가하고 그 외에는 감소한다. 
  • cmpsb : 두 일련의 바이트가 같은 데이터를 저장하고 있는지 비교하는 데 사용한다. 전형적으로 repe 접두사와 함께 사용한다. 
  • scasb : 일련의 바이트 내에서 값 하나를 탐색할 때 사용한다. ESI 주소에 위치한 각 바이트를 EDI가 아닌 AL과 비교한다. 값이 일련의 바이트열 내에서 발견되면 ESI는 해당 값의 위치를 저장한다.
  • stosb : EDI가 지정한 위치에 값을 저장한다. rep 접두사는 메모리 버퍼를 초기화할 목적으로 scasb와 함께 사용해 모든 바이트가 동일한 값을 저장한다. 
Comments