어셈 정리

register 기초

  • rax : return value
  • rbx : callee saved
  • rcx : 4th argument
  • rdx : 3rd argument
  • rsi : 2nd ardument
  • rdi : 1st argument
  • rbp : callee saved
  • rsp : stack pointer 스택의 가장 위쪽 주소
  • r8 : 5th arg
  • r9 : 6th arg
  • r10 : callee saved
  • r11 : callee saved
  • r12: callee saved
  • r13 : callee saved
  • r14 : callee saved
  • r15 : callee saved

  • rcx, rdx, r8, r9 : Windows 64bit에서 함수를 호출할 때 필요한 인자들을 순서대로 저장
  • rip(PC) : 다음에 실행될 명령어가 위치한 주소

Data Size

x 16bit e~ 32bit r~ 64bit

FLAGS

상태 레지스터인 현재 상태나 조건을 0과 1로 나타내는 레지스터

CF(Carry Flag) : 자리 올림(carry)이 생기는 경우 CF의 값이 1 연산에 사용된 값들에 부호가 없다(unsigned) ZF(Zero Flag) : 연산의 결과가 0일 때 ZF는 1

SF(Sign Flag) : 결과가 양수일 때, 즉 최상위 비트가 0이면 SF=0, 반대로 결과가 음수가 되어 최상위 비트가 1이면 SF=1

OF(Overflow Flag) : 연산에 사용된 값들에 부호가 있을 경우에는 CF 대신 OF를 사용

  • mov dst,src ; dst = src
  • lea dst,addr ; dst = addr
  • inc dst ; ++dst
  • dec dst ; –dst
  • neg dst ; dst = -dst
  • not dst ; 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 dst,k ; dst « k
  • shr dst,k ; dst » k ; logical
  • sal dst,k ; dst « k
  • sar dst,k ; dst » k ; arithmetic
  • test rax,rax ; ZF=1 if rax = 0 ; SF=1 if rax < 0

  • cmp rax,rdi ; ZF=1 if rax = rdi ; ZF=0 if rax!= rdi ; CF=1 if rax < rdi ; CF=0 if rax > rdi
  • jmp location
  • je location ; equal (ZF=1)
  • jne location ; not equal (ZF=0)
  • jg location ; > signed
  • jge location ; >= signed
  • jl location ; < signed
  • jle location ; <= signed
  • ja location ; > unsigned
  • jb location ; < unsigned
  • js location ; negative (SF=1)
  • jns location ; not negative (SF=0)

Intel x86-64 아키텍처에서 스택은 낮은 주소(=더 작은 숫자)를 향해 자라기 때문에 스택이 자랄수록 rsp에 저장된 메모리 주소는 점점 낮아집니다.

  • push rdi ; sub rsp,8 ; mov [rsp],rdi
  • pop rdi ; mov rdi,[rsp] ; add rsp,8

  • call location ; push retaddr ; jmp location
  • ret ; pop rip ; jmp rip

x86-64dbg 단축키

  • F2 : 소프트웨어 브레이크 포인트를 걸 때 사용하는 단축키입니다. 이미 브레이크 포인트가 걸려있는 주소에서 누를 경우 브레이크 포인트를 삭제합니다.
  • F7 : 어셈블리 코드를 한 줄 실행합니다. 만약 call을 실행하려 하면 call한 함수 내부로 진입합니다.
  • F8 : 어셈블리 코드를 한 줄 실행합니다. 만약 call을 실행하려 하면 call한 함수가 ret 명령어를 실행할 때까지(리턴할 때까지) 실행한 다음 멈춥니다.
  • F9 : 프로그램의 실행을 재개합니다.
  • ctrl + g : 현재 창이 보여주는 주소를 바꿉니다. 디스어셈블 창에서 사용하면 디스어셈블 창이 해당 주소로 가고, 헥스덤프 창에서 사용하면 헥스덤프 창이 해당 주소로 가는 식입니다. 주소값 말고도 간단한 사칙 연산이나 함수명도 인식합니다.
  • -, + : 이전 또는 다음 주소로 이동합니다. call 이나 jmp 명령어의 주소로 이동했을 때, 이전 주소로 돌아가거나 다시 이동할 때 자주 쓰입니다.
  • 키 : call이나 jcc와 같은 PC(program counter)를 변경시키는 명령어를 선택한 상태에서 누르면 해당되는 주소로 이동합니다. ex) call 0x11223344 → 0x11223344로 이동
  • 키 : 선택한 어셈블리어를 수정합니다. 잔존 바이트를 NOP로 채우기를 선택하면 수정된 코드 길이가 기존 코드의 길이보다 작을 때 남는 공간을 NOP으로 자동으로 채워줍니다.

ctrl + a또는 마우스 오른쪽 클릭시 나오는 메뉴에서 분석 - 모듈 분석을 통해서 모듈 분석

rep stosb : Fill (E)CX bytes at ES:[(E)DI] with AL.

ida 단축키

G : 임의 주소 점프 N : 변수이름 설정 X : 변수 사용 위치 참조 Y : 타입지정 r : 숫자를 문자로 변환 shift + f12 : 문자열 사용 조회

종단점 f2 실행 f9 한단계 실행 f8 step into f7 실행 (F9): 바이너리를 실행합니다. 이 때 실행 도중 중단점을 만나면 멈추게 됩니다.

Edit - Patch Program: 바이너리 패치와 관련된 메뉴가 존재합니다.

Posted 2021-10-10