상세 컨텐츠

본문 제목

004 Assembly

본문

I. Assembly Code

       i. Instruction Format

             : OP code(명령 코드)와 operand(피연산자)로 구성

             : (Intel) OP code에 따른 연산 결과를 왼쪽 operand에 저장

 

       ii. Operand

             : immediate(상수), register, addressing mode

              Addressing Mode : 레지스터에 저장된 메모리 주소를 참조한 값

                    ex) [reg] : reg에 저장된 메모리 주소의 값

                         byte prt[reg-1Ch] : Pointer Directive(declares one or more pointer data structures), reg-1C(hex)에 저장된 하위 8bit 참조

 

       ii. Data Movement

             > mov dst, src : dst src

             > lea dst, addr : dst addr, Load Effective Address, 연산도 같이 가능

 

       iii. Arithmetic Operations

             > inc, dec dst : ++dst, --dst

             > neg dst : -dst

             > not dst : ~dst

             > add dst, src : dst += src

             > sub dst, src : dst -= src

             > imul dst, src : dst *= src

             > and dst, src : dst &= src

             > or dst, src : dst |= src

             > xor dst, src : dst ^= src

             > shl, shr dst, k : dst << k, dst >> k, logical shift(빈 자리 다 0으로 밀어 채우기)

             > sal, sar dst, k : dst << k, dst >> k, arithmetic shift(MSB 유지 후 빈 자리 0으로 채우기)

 

       iv. Conditional Operations

             > test rax, rax : rax & rax, rax가 0일 경우 ZF=1, 음수일 경우 SF=1 

             > cmp rax, rdi : rax - rdi, rax = rdi일 경우 ZF=1, CF=0

                                                rax != rdi일 경우 ZF=0

                                                rax < rdi일 경우 ZF=0, CF=1

                                                rax > rdi일 경우 ZF=0, CF=0

 

             > jmp location : location으로 무조건 jmp

             jcc : jmp 명령어 이전의 test나 cmp 등의 연산 수행 결과로 조건에 따라 location으로 jmp

             > je location : ZF=1(equal)일 경우 jmp

             > jne location : ZF=0(not equal)일 경우 jmp

             > jg location : >, signed

             > jge location : >=, signed

             > jl location : <, signed

             > jle location : <=, signed

             > ja location : >, unsigned

             > jb location : <, unsigned

             > js location : SF=1(negative)일 경우 jmp

             > jns location : SF=0(positive)일 경우 jmp

 

       v. Stack Frame

             > push rdi : 스택에 새 데이터 추가

                             : sub rsp,8

                               mov [rsp], rdi

             > pop rdi : 스택에 제일 최근에 추가했던 데이터 빼오기

                           : mov rdi, [rsp]

                             add rsp, 8

 

       vi. Procedure Call Instruction

             > call location : 함수 실행

                                 : push retaddr

                                   jmp location

             > ret : 함수 종료 후 retaddr로 복귀

                     : pop rip // rsp에 있던 값이 rip에 들어가있음

                       jmp rip

'Reversing > Project - 악성 코드, 진실의 방으로' 카테고리의 다른 글

006 Calling Convention  (0) 2020.09.19
005 Stack  (0) 2020.09.19
003 Register  (0) 2020.09.19
002 Byte Ordering  (0) 2020.09.18
001 Reversing  (0) 2020.09.18

관련글 더보기