주로 자료를 보관하는 기억 장소이다. 일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용되며, 대부분의 현대 프로세서는 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인 메모리로 저장하는로드-스토어 설계를 사용하고 있다.
프로세서 레지스터에서도 여러개로 나눠진다.
데이터 레지스터 : 정수값을 저장할 수 있는 레지스터.
주소 레지스터 : 메모리주소를 저장하여 메모리 접근에 사용되는 레지스터. 어떤 프로세서에서는, 주소를 저장하는 것이 아니라 조작하기 위한 목적으로색인 레지스터를 사용하기도 한다.
범용 레지스터 : 데이터와 주소를 모두 저장할 수 있는 레지스터.
부동소수점 레지스터 : 많은 시스템에서 부동소수점 값을 저장하기 위해 사용된다.
상수 레지스터 : 0이나 1 등 고정된 값을 저장하고 있는 레지스터.
특수 레지스터 : 프로그램의 상태를 저장한다. 프로그램 카운터, 스택포인터, 상태 레지스터등이 있다
"리버스 엔지니어링, 밑바닥부터 시작하기 (4) " 까지 그동안 리버스 엔지니어링 과정에서 바로 코드 분석을 들어가서 문제에서 원하는 정답을 냈지만 교수님과 선배님께 물어보니 해당 방법으로 습관을 만들면 나중에 악성코드분석과 하드웨어 유지보수등 원하는 직종에 갔을 때 안 좋아지니 지금부터라도 리버싱 과정에서 어셈블리-> 디스어셈블리->바이너리분석 을 하면 더 좋게 성장할 수 있다 말씀하셔서 피드백을 수용하여 만든 카테고리이며, 그 과정을 만들 것이다.
디스어셈블리란 어셈블리어를 거꾸로 변환하여 바이너리코드로 만드는 과정이다.
또한 어셈블리어는 Ryzen(ARM), Intel(AT&T)등 회사에 따라 다 다르게 나오기에 주의해야 하지만, 대부분의 경우 비슷한 로직을 가지고 있다.
x86 - 윈도우즈 운영체제가 동작하는 CPU의 총칭. 단, 32bit를 의미
x64 - 64bit 윈도우즈 운영체제가 동작하는 CPU의 총칭
ARM - 스마트폰, 태블릿PC의 CPU 코어 설계 회사
어셈블리에선 mov, add, jmp, push, call, ret 등을 이용하여 분석하지만 디스어셈블리에선 언어가 아닌 바이너리코드를 분석하는 과정을 말한다.
이 과정에서 컴퓨터 구조와 메모리에 대해 알아가는 것이 현명한 방법이다.
위 이미지는 프로그램을 리버싱 툴에 올려놓은 모습으로 메모리가 중간에서 이어주는 역할을 한다.
메모리를 자세히 확대하면 CODE, DATA, HEAP, STACK으로 볼 수가 있고 사람은 안보이지만 컴퓨터상 메모리는 한칸씩 주소를 지니고 있기에 이를 메모리 주소라 말하기도 한다.
그렇다면 왜 바이너리로 분석하는가? 이는 3가지로 요약할 수 있다. 컴퓨터라 2진수로 표현이 가능하나, 너무 비효율적이고 데이터로 표현하기 까다롭게 길어짐
2자리의 16진수가 1byte의 2진수로 변환될 수 있기 때문에 정보를 표현하기 유용
RGB도 16진수 3개로 표현한 값 #96dfa5 와 같이 표현
레지스터 구조 및 과정
1.메모리 명령어를 입출력 버스로 이용하여 cpu로 이동 / 용어 : fetch
2.입출력 버스에서 버스 인터페이스, 명령어 공간에 가서 컨트롤 유닛으로 감/ 용어 : decode