Security/시스템 해킹(PWN, System)
내가 항상 헷갈리던 어셈블리 mov와 lea의 차이
그믐
2022. 2. 18. 15:33
반응형
우선
QWORD PTR [주소] : 주소로부터 데이터를 8바이트 만큼 참조
DWORD는 4바이트 WORD는 2바이트
WORD = 16비트이므로
DWORD(double)은 4바이트
QWORD(quad)는 8바이트이다.
MOV
mov opcode는
mov dst, src로 사용한다.
여기서 scr에 있는 값을 대입한다. C에서 *을 사용해서 대입하는 연산자라고 이해하면 될 것 같다.
그래서 mov QWORD PTR[rdi], rsi
이런 식으로 쓴다면, rdi주소 값에 rsi를 대입한다.(8바이트)
LEA
lea opcode는
lea dst, src로 사용한다.
lea에서는 src의 유효 주소 EA(Effective Address)를 저장한다고 한다.
그러므로 lea rsi, [rbx+8*rcx] 이렇게 쓴다면 rbx+8*rcx라는 주소 값 자체를 rsi에 대입한다는 것이다.
드림핵에서 아래 예제를 통해 이해할 수 있다.
1. mov에서는 rbx+8에 있는 값을 rax에 대입하는 것이다. 마치 포인터에 *이 붙여진 대입 연산자이다.
그래서 rbx+8에 있는 값 0xCOFFEE가 rax에 대입된다.
2. lea에서는 rbx+8의 값을 참조하지 않고 그냥 주소를 대입한다.
그래서 rbx+8인 메모리 주소, 0x401A48이 rax에 대입된다.
이렇게 헷갈리던 mov와 lea의 차이를 적어둔다.
반응형