6. 어셈 명령어
본문 바로가기
Reversing & Cheat Engine

6. 어셈 명령어

by boosting 2024. 2. 19.
728x90

1. 명령어의 구성

이전 글을 쭉 봐오셨다면 add와 sub, mov 등의 명령어들을 보셨을 겁니다.

못 보셨다면 이 글을 한 번 쭉 읽어보시면 명령어들을 간략하게나마 볼 수 있을 것입니다.

 

 

4. 치엔 튜토리얼 Step 2

[이전글] - 3. 치엔 튜토리얼 Step 1 1. 전 글과 똑같이 엔진과 튜토리얼 프로그램 실행을 해둡시다. 이전 글대로 따라 하셔서 클리어를 하시고 프로그램을 껐다가 킨 경우라면 Level 1과 Level 2를 선택

poppinss.tistory.com

 

어쨌든 구성을 보면 다음과 같습니다.

< 명령어 A , B > / A와 B는 레지스터와 숫자가 들어갈 수 있고 A와 B는 오퍼랜드라고 부름

예를 들어 sub edx,2라는 명령어가 있습니다.

sub = subtract, 즉 빼기를 수행하는 명령어에 해당합니다.

그러면 edx에서 2를 빼는 건지 2에서 edx를 빼는건지 헷갈릴 수 있는데 edx에서 2를 빼는 게 맞습니다.

즉 명령어 A, B라는 것은 A에서 B로 명령어대로 수행한다라고 보시면 될 거 같아요.

 

자 이제 그러면 어떤 식의 구조인지는 알았고 어떤 명령어들이 있는지를 알아야 하는데...

명령어의 개수가 진짜 많습니다. 그렇기 때문에 모든 명령어들을 다 외우는 건 힘들고요.

자주 사용되는 명령어들만 외워둬도 괜찮습니다.

 

2. 명령어의 종류

우선 데이터의 이동부터 나열해 보면 mov와 lea라는 명령어가 있습니다.

둘 다 이동시킨다라는 점은 똑같은데 무엇을 이동시키냐에 따라 사용처가 다릅니다.

mov a, b => a에 b를 옮긴다라는 명령어인데 이 명령어를 수행하고 나면 a=b 가 됩니다.

lea a,b => a에 b의 주소를 옮긴다라는 명령어입니다.

 

이렇게 보면 무슨 차이인지 잘 이해가 안 갈 수 있어서 예시를 살짝 써보자면

esi 레지스터에 10004000이라는 주소가 담겨있고 이 10004000 Value는 5가 있습니다.

이렇게 가정을 하고 명령어가 어떻게 흘러가는지 봅시다.

 

mov eax,[esi] / eax에 esi의 벨류를 가져옴

이 연산을 하고 나면 eax = 5가 됨

 

lea eax,[esi] / eax에 esi의 주소를 가져옴

이 연산을 하고 나면 eax = 10004000가 됨

 

그냥 단순히 주소를 가져오냐 벨류를 가져오냐 이 차이입니다.

다음으로는 연산에 들어가는 명령어인데 add, sub, inc, dec, idiv, imul 이렇게 6가지인데요.

add a, b => a+b 한 것을 a에 저장함

sub a,b => a-b 한 것을 a에 저장함

inc a => a를 1 증가 시킴

dec a => a를 1 감소 시킴

 

imul의 경우 3가지로 나뉘는데 맨 처음엔 무조건 레지스터가 들어가야 됩니다.

imul eax,[gob] => eax와 gob의 벨류를 곱해서 eax에 넣음

imul eax,ebx => eax와 ebx를 곱해서 eax에 넣음

imul eax,edi,25 => 3번째에는 무조건 상수가 들어가야 되고 edi와 25를 곱한 값을 eax에 넣음

 

idiv의 경우 다른 명령어들과는 다르게 edx를 1순위 비트로 두고 eax를 하위 순위 비트로 둡니다.

나누기를 한 후 몫을 eax에 나머지를 edx에 저장합니다.

 

idiv ebx => eax를 ebx로 나눈 후 몫을 eax에 나머지를 edx에 저장

 

이외에도 연산 명령어에 xor, or, and, not, neg, shl 등이 있는데 이것들은 각 비트에 있는 0과 1을 옮기는 식의

연산인데 이 부분은 따로 다룰 필요는 없을 거 같고 xor은 레지스터에 담긴 값을 초기화할 때 사용합니다.

xor eax, eax 이런 식으로 하게 되면 eax에 담겨있는 값이 초기화돼서 0이 되는 식이죠.

 

다음으로 push와 pop 이 있는데 이는 스택에 저장하거나 꺼낼 때 사용되는 명령어입니다.

 

push eax => eax의 값을 스택에 저장 후 esp에서 4를 감소 시킴

pop eax => 스택에 저장해 놨던 값을 eax로 꺼내고 esp에서 4를 증가 시킴

64Bit에선 8을 감소시키고 증가시킴

 

그런데 스택에 넣을 때는 1,2,3,4 ... 순차적으로 넣지만 꺼낼 때는... 4,3,2,1 역순으로 꺼내기에

이 부분을 주의하셔서 명령어 순서를 배치해야 됩니다.

 

다음으로 cmp와 jmp인데 이 두 가지는 묶어서 설명해야 할 정도로 연관이 깊습니다.

jmp는 말 그대로 jump라는 뜻으로 지정한 주소 지점으로 점프하라는 뜻인데

여기서 조건을 많이 달게 됩니다. 조건을 달기 위해선 비교라는 부분이 들어가겠죠.

그래서 cmp라는 명령어를 같이 쓰는 것이죠. cmp는 비교한다라는 명령어이기에.

 

간단한 예시로 다음과 같습니다.

 

cmp eax,1000 / eax와 1000을 비교하여 ZF(제로플래그)를 세팅함

je 10005000 / 같을 경우 10005000의 주소로 점프 / je = Jump Equal

mov ecx,[10006000] / 아닐 경우 이쪽으로 진행

 

만약 eax에 담긴 값이 1001이라 가정할 때 사람이라면 eax가 더 큰걸 바로 알죠?

그런데 컴퓨터의 경우는 바로 알 수가 없습니다. 그렇기에 cmp 명령어를 수행할 때

eax에 담긴 값-1000을 수행해서 나온 결괏값에 따라 큰지 작은 지를 이해하는 것입니다.

 

이 조건문은 너무나도 많기 때문에 존재하는 모든 걸 다 쓰기는 힘들고.. 일부만 쓰고 나머진

링크를 첨부하는 게 좋을 거 같습니다.

 

je = Jump Equal / 비교대상이 같을 경우 점프

jne = Jump not Equal / 비교대상이 다를 경우 점

jz = Jump Zero / 0일 경우 점프 그러니까 je랑 동일

jnz = Jump not Zero / 0이 아닐 경우 점

ja = Jump Above / a, b 중 a가 크면 점프

jna = Jump not Above / a,b 중 a가 크지 않으면 점프

jnae = Jump not Above or Equal / a,b 중 a가 크지 않거나 같지 않으면 점프

jb = Jump Below / a,b 중 a가 작으면 점프

jbe = Jump Below or Equal / a,b 중 a가 작거나 같으면 점프

jnb = Jump not Below / a,b 중 a가 작지 않으면 점프

jnbe = Jump not Below or Equal / a,b 중 a가 작지 않거나 같지 않으면 점프

 

그나마 이 정도가 자주 볼 수 있는 명령어이고 나머지는

 

PYRASIS.COM: 초보자를 위한 리버스 엔지니어링 상식 - 어셈블리 명령어

리버스 엔지니어링, Reverse Engineering, 어셈블리, asm

pyrasis.com

 

한번 가셔서 어떤 조건문들이 있는지 쭉 보시는 것도 괜찮을 것 같습니다.

 

다음 명령어로는 call과 ret 이 있습니다.

call은 이전글에서도 한두 번 나왔지만 함수를 호출하는 명령어입니다.

jmp의 경우 한 번 점프한 이후로 다시 돌아오지는 않지만 call의 경우

명령어가 실행되고 그 함수 안에서 대체로 다시 돌아갈 주소를 스택에다가

저장해 놓기 때문에 call 된 함수 안에서 ret을 만나면 결괏값을 가지고

원래 주소 쪽으로 돌아가게 됩니다.

 

1

 

위의 call gtutorial-x86_64.exe+400E0으로 들어가서 ret을 만나고 나오면

그 밑 주소인 gtutorial-x86_64.exe+3E9E6 여기로 돌아온다고 보면 되죠.

Debugging 걸려있는 상황에 보시면 Return Address와 동일합니다.

 

자 명령어 중 자주 사용되는 명령어들을 썼는데 너무 많아서 솔직히 다 외우긴 힘들어요.

그냥 적당히 외울 거만 외워두고 나머지는 잘 정리된 곳들이 많으니 찾아가면서 공부하면 됩니다.

 

 

7. 치엔 게임 튜토리얼 Step 3

1. 지난 글에서 했었던 명령어와 디버깅을 기억합시다. 이제는 앞의 Step 1과 Step 2에서 쓰던 기초적인 Value 변화에 따른 스캔은 따로 과정에 올리지 않을 예정입니다. 글이 너무 길어지기도 하고

poppinss.tistory.com

 

728x90