어셈 정리
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: 바이너리 패치와 관련된 메뉴가 존재합니다.