본문 바로가기
  • 개발 삽질 블로그
해킹 및 보안/리버싱

[스무디] 어셈블리어 강의 8~12강 정리

by 갹둥 2022. 10. 6.

8~9강 점프 JMP

JMP: 실행의 흐름을 변경, 원하는 메모리 주소로 가야할 때
ex) JMP [401005]

*EIP: 다음에 실행할 주소를 담고있는 레지스터
-현재 실행될 명령어의 크기를 계산하고 그 크기만큼 현재 실행될 코드의 주소값에 더해주어 다음에 실행될 코드 주소를 가르켜 줌

-EIP는 범용 레지스터가 아니기 때문에 MOV 연산 사용 불가, JMP로 흐름을 변경해야함

#해킹: EIP라는 레지스터에 들어가는 값을 해커가 원하는 값으로 바꾸면 됨!

 


 

10강 증감 명령어


INC: 증가 연산, ++과 같은 역할
INC [REG/MEM]

 

DEC: 감소 연산, --와 같은 역할
DEC [REG/MEM]



11강 ADD, SUB


ADD: 덧셈 연산
ADD op1, op2 -> op1에 op2를 더한다.

 

SUB: 뺄셈 연산
SUB op1, op2 -> op1에 op2를 뺀다.

 

-op로는 레지스터, 메모리, 데이터가 올 수 있음
ex) ADD EAX, 10 -> EAX에 10을 더해라

 

-ollydbg에서는 16진수로 사용함 

 

-ADD EAX, BX 처럼 크기가 다르면 안됨

 

-ADD [MEM], [MEM]은 안됨, 해당하는 기계어가 설계되어 있지 않음


12강 레지스터로 주소 지정

 

주소 간접 사용

mov dword [402000], 0 <<주소를 직접 사용하는 방법

mov eax, 402000 <<레지스터에 주소 저장 

 

 

메모리에 직접 접근하는 것이 아니라 레지스터를 이용

ex) mov eax, 402000

     mov dword ptr [eax], 10

결과: 402000에 10이 들어감

 

*메모리에 메모리 주소를 저장하는 경우

mov dword ptr [402004], 402000    -> 402004에 402000를 넣음

mov ebx, [402004]      -> ebx에 402004에 들어있는 값(402000)을 넣음

mov [ebx], 4     -> ebx에 들어있는 값에 해당하는 주소에 4를 넣음, 즉 402000 주소에 값을 넣음

*[[402000]] 이런식으로는 사용할 수 없기 때문에 레지스터를 거쳐야 함

*c언어의 포인터