Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 정처기기출
- 쿠버네티스
- 기사
- root디렉토리
- 2020정처기
- 쿠버네티스자격증
- kubernetes
- oraclecloud
- 쿠버네티스환경구축
- sbin
- 리눅스#Linux
- 역공학
- 정보처리기사기출
- 정보처리기사
- CKA후기
- 리버스엔지니어링
- TCP
- 네트워크
- 정처기
- 2020정보처리기사
- k8s
- 리버싱
- 프로토콜
- 정처기필기
- 레지스터
- 오라클클라우드
- 정보처리기사필기
- Reversing
- Network
- IP
Archives
- Today
- Total
Be Expert
[Reversing] 플래그 레지스터, 자주 쓰는 명령어 본문
참고문헌 : 실전 악성코드와 멀웨어 분석, 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비트
- 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와 함께 사용해 모든 바이트가 동일한 값을 저장한다.
'Reversing' 카테고리의 다른 글
[Reversing] CodeEngn basic RCE L05 풀이 (0) | 2020.04.13 |
---|---|
[Reversing] 리버싱 입문, 레지스터(Register) ? (0) | 2020.04.10 |
[Reversing] 리버싱 입문, 리버싱(Reverse Engineering, RE) ? (0) | 2020.04.08 |
Comments