언어 (1)
2024-07-30 19:30:23

0. intro

오늘 포스팅할 내용은 어셈블리다.

사용환경은 윈도우10, 사용 도구는 x32dbg이고 인텔 x86어셈블리를 포스팅할 것이다.

물론 리눅스 터미널에서도 nasm써서 프로그래밍하거나 sasm이라는 어셈블리 ide를 사용할 수도 있으나 디버거를 사용하는 것이 레지스터의 값이라든가 그런 것을 보기 좋다.

 

간단한 사용법을 정리하자면 file에서 exe파일을 가져와서 열고 step over를 사용해 한 줄씩 실행하면서 결과를 볼 수 있다.

어셈블리 실습을 위해서는 그냥 기능이 없는 파일을 가지고와서 명령어를 직접 작성해가면서 레지스터, 메모리 칸을 관찰하면 된다.

1. mov

x32dbg에서 각 줄 선택 후 우클릭->Assemble하거나 스페이스바를 누르면 어셈블리 명령어를 쓸 수 있다.

그럼 첫 명령어를 작성해보자. mov라는 것을 쓸 것인데 그게 뭐냐하면 값을 덮어쓰는 느낌이다.

명령어를 집어넣고 실행하면 다음과 같다.

 

mov reg, num ; reg에 num을 넣음
mov reg, reg

어째서 코드블럭에 어셈블리가 없는가

 

숫자(즉각값)을 넣을 수도 있고 다른 레지스터의 값도 넣을 수 있다.

 

2. 레지스터

  • eax, ebx, ecx, edx....
    레지스터는 이런 모양으로 생겨먹었다.(32비트 기준)

인텔이 16비트이던 시절 ax를 썼음.
16비트 = 2바이트이므로 바이트별로 ah, al 이런 식으로 썼음.
높은 놈이 h, 낮은 놈이 l...

 

현재는 extended 붙여서 32비트일떈 eax, 64비트는 rax라고 부름.
a 대신 다른 알파벳 붙은 놈들도 구성은 똑같다.

따라서 이런 식으로 eax가 아니라 ah에 값을 넣어볼 수도 있고 실행 결과는 옆과 같음.

mov명령어는 기본적으로 mov reg, reg으로 다른 레지스터의 값을 옮겨올 수는 있지만
mov eax, bh처럼 크기가 다르면 안됨. 즉각값을 넣을 때는 상관없으나 레지스터 간 값 덮어쓰기(?)는 바이트 사이즈를 일치시켜줘야 한다.

al과 ah이런 놈들은 1바이트로 크기가 같기 때문에 mov al, bh 이런 것은 가능함.

 

+)x32dbg기능: 레지스터 우클릭 후 change value로 직접 값을 바꿀 수 있다.