오늘 알아볼 것
- 어셈블리 핸드레이란 무얼까?
어셈블리 핸드레이란?
- 어셈블리어를 C언어로 복원시키는 작업.
여기서 나는 저번에 어셈블리어를 정리하면서 쓴 명령어를 다시 상기 시켜야 했었다.
더보기
- mov : 데이터 이동 시에 사용.
- lea : 주소 값을 옮길 때 사용
--> 데이터 이동에 쓰이는 명령어.
- add : 레지스터나 메모리의 값을 덧셈할 때 쓰는 명령어. (사용법 = add a,b)
- sub : 레지스터나 메모리의 값을 뺄 때 쓰는 명령어. (사용법 = sub a,b)
- dec : 값을 1 감소 시키는 명령어 (사용법 = dec a)
- inc : 값을 1 증가 시키는 명령어. (사용법 = inc a)
--> 논리 연산에 쓰이는 명령어.
- cmp : 레지스터와 레지스터 값을 비교 할때 쓰는 명령어.
- jmp : 특정한 곳으로 분기시키는 명령어.
--> 흐름 제어에 쓰이는 명령어.
- call : 프로시저를 호출시키는 명령어.
프로시저(Procedure)란?
- 특정한 로직을 처리하기만 하고 결과 값을 반환하지 않는 서브 프로그램.
데이터베이스에 대한 일련의 작업을 정리한 절차를 RDBMS가 저장한 것.테이블에서 데이터를 추출, 조작하고 결과를 다른 테이블에 다시 저장하거나 갱신하는 처리를 할때 프로시저를 사용한다고 한다.
결론 - 그냥 지정된 작업을 처리하고 결과값을 반환 하지 않는 프로그램이라 생각한다.
- ret : 호출했던 프로시저를 바로 다음 지점으로 이동시키는 명령어. (call한 주소로 이동.)
--> 프로시저를 조작하는 명령어
- push : 값을 스택에 저장시키는 명령어.
-> 스택에 특정 값을 넣고, esp-4하는 거라고 이해하면 될 것 같다.
- pop : 값을 스택에서 삭제시키는 명령어
-> 특정 값에 esp가 가리키는 값을 넣고 esp+4하는 거라고 이해하면 될 것 같다.
--> 스택을 조작하는 명령어들
etc..
- nop : 아무것도 하지 않는다. 라는 명령어.
-> 메모리에 빈 공간이 없게 해야 시스템에서 바이너리를 읽을 때 오류가 나지 않는다.
- LEAVE : 현재까지의 메모리 스택을 비우고 EBP를 자신을 호출한 메모리 주소로 채우는 명령어.
= 함수를 종료하기 위해 정리하는 작업에 사용.
//
4대 연산자(xor, or, and, not)
사용법 - xor a,b ----
여기에 추가로 알아둬야할 명령어가 있다.
- imul a,b = a와 b를 곱한 결과를 a에 저장. == a *= b
- xor a,b = a와 b를 xor연산 한 결과를 a에 저장.
- je = 비교 값이 같을 떄 (ZF = 1) 점프
- jne = 비교 값이 다를 때 (ZF = 0) 점프
++ WORD = 16bit(unsighned short)를 나타내는 타입
DWORD = (double WORD) = 16*2bit
QWORD = (Quarter WORD) = 16 * 4 bit.
위의 명령어를 완벽히 숙지해야 리버싱을 제대로 할 수 있다고 한다.
즉 저 명령어를 이해하고 어떻게 이용되는지 정확히 이해해야 리버싱을 알 수 있다고 한다..
'System & Reversing' 카테고리의 다른 글
GNU(GCC 컴파일러)와 그 과정 안에서 나오는 파일들에 대한 고찰. (1) | 2023.03.13 |
---|---|
dll파일에 대한 간단한? 고찰. (0) | 2023.03.13 |
함수 프롤로그, 에필로그에 대한 간단한 고찰. (0) | 2023.03.13 |
컴퓨터 메모리 구조에 대한 간단하지 않은 고찰. (1) | 2023.03.12 |
어셈블리어에 대한 '간단한' 고찰. (0) | 2023.03.12 |