Jiyong's STUDY

[기초] 어셈블리어 기본 명령어 본문

보안/리버싱, 어셈블리

[기초] 어셈블리어 기본 명령어

Kingjiyong 2020. 7. 16. 13:54

//책에서는 명령어를 강제적으로 외우지 않는 것을 권함.

 

PUSH, POP

 

스택에 값을 넣는 것을 PUSH, 그리고 스택에 있는 값을 가져오는 것이 POP다.

(PUSHAD, POPAD는 모든 레지스터를 PUSH, POP 하라는 명령어다)

 

MOV

 

MOV는 단지 값을 넣는 역할을 한다.

 

LEA

 

LEA는 주소를 가져오는 역할이다. MOV와 헷갈릴 수 있다.

MOV는 값을, LEA는 주소를 가져온다.

대부분 가져올 src 오퍼랜드가 주소라는 의미로 []로 둘러쌓여 있다.

 

예시로

 

esi: 0x401000

*esi: 5640EC83

esp+8: 0x13FF40

*(esp+8): 33

 

lea eax, dword ptr ds:[esi]

: esi가 0x401000이므로 eax에는 0x401000이 들어온다.

 

mov eax, dword ptr ds:[esi]

: esi가 0x401000이므로 eax에는 0x401000 번지가 가리키는 5640EC83이라는 값이 들어온다.

 

lea eax, word ptr ss:[esp+8]

: esp+8은 스택이며, eax에는 0x13FF40라는 값이 들어온다.

 

mov eax, word ptr ss:[esp+8]

: esp+8은 스택이며, eax에는 0x13FF40가 가리키는 값인 33이 들어온다.

 

ADD

 

src에서 dest로 값을 더하는 명령이다.

 

SUB

 

ADD와 반대되는 뺼셈 명령어로, ADD와 쌍으로 생각하자.

 

INT

 

인터럽트를 일으키는 명령어다. 뒤에 오퍼랜드로 어떤 숫자가 나오느냐에 따라 각기 다른 처리가 일어난다.

리버스 엔지니어링에서 가장 많이 만날 것은 INT 3 명령어로 옵코드가 0xCC인 DebugBreak() 정도일 것이다.

 

CALL

 

함수를 호출하는 명령어다. CALL 뒤에 오퍼랜드로 번지가 붙는다. 

해당 번지를 호출하고 작업이 끝나면 CALL 다음 번지로 되돌아온다. CALL로 호출된 코드 안에서는 RET을 만나게 되어

다시 돌아오기 떄문이다. 

 

INC, DEC

 

INC는 i++; DEC는 i--;로 이해하면 쉽다.

 

AND OR XOR

 

dest와 src를 연산한다. XOR EAX, EAX를 연산하면 XOR 결과에 따라 0으로 초기화되는 효과를 볼 수 있다.

 

NOP

 

아무것도 하지 말라는 명령어다. 해킹이나 리버싱에서 가장 많이 쓰이는 명령어이기도 하다.

 

CMP, JMP

 

비교해서 점프하는 명령어다. 

 

이후 모르는건 구글링 하는걸 권장

'보안 > 리버싱, 어셈블리' 카테고리의 다른 글

[기초] Hello World 리버싱 문자열 패치  (0) 2020.07.16
[기초] 스택 자료구조의 ADT  (0) 2020.07.16
[기초] 레지스터  (0) 2020.07.16
[기초] 어셈블리 명령 포맷  (0) 2020.07.16
[기초] 기본 구조  (0) 2020.07.16