wonder
정보보안 스터디 - 16주차 7일 - 레지스터와 어셈블리어 분석 본문
☞ 레지스터란
레지스터는 CPU의 기억 공간입니다. 계속 저장해두는 것이 아니라 변수 개념으로 생각하면 쉽습니다.
하드디스트 > CPU로 불러와서 실질적으로 여기서 연산하면서 > 데이터를 임시로 레지스터에 저장합니다.
처리중인 데이터나 처리 결과를 임시 보관하는 CPU내의 기억 장치입니다.
CPU가 접근할 수 있는 메모리 중에 가장 빠르게 동작/접근하는 기억장치입니다.
위치는 CPU 바로 옆에 있어서 접근도 빠르게 합니다.
CPU가 여러가지 연산을 처리하는 동안 임시적으로 연산에 필요한 데이터를 보관하는 용도로 사용합니다.
예를 들어 1+3=4 라는 연산을 처리할 때 1, 3, +, 결과값 4 로 저장합니다.
원래 레지스터는 총 9개지만 범용 레지스터는 총 8개이며 고유의 이름이 할당되어 있습니다.
☞ 레지스터 구성
레지스터는 8비트 부터 64비트 등 이렇게 있으며
8비트는 실제로 16비트를 구성하기 위해 사용되므로 직접 사용되지 않습니다.
8비트 AL, AH
16비트 AX
32비트는 E로 시작합니다.
EAX라면 32비트이며 AL , AH, 16비트-AX로 구성됩니다.
EDX라며 DL,DH, 16비트- DX 이런식입니다.
☞ 범용 레지스터
EAX(extended accumulator register) 주로 연산에서 결과값을 저장합니다. 절대적인 것은 아니므로 다른 역할을 하는 곳에 저장될 수도 있습니다. 산술 연산(덧셈/뺄셈/곱셈/나눗셈), 논리 연산, 결과 값을 주로 저장합니다. 리턴값을 통해서 함수 성공/실패 여부를 판단할 수 있습니다. 스택 프레임에서 전체를 차지합니다. |
EDX(extended data register) 마찬가지로 산술 연산(덧셈/뺄셈/곱셈/나눗셈), 논리 연산, 결과 값을 주로 저장하며 연산 결과 값이 32비트를 초과할 경우 EAX에서 저장할 공간이 부족할 때 추가로 저장합니다. 주로 나눗셈에서 나머지 값을 저장합니다. (몫은 EAX) |
ECX(extended counter register) 반복문(for, while)을 사용할 경우 반복 카운터 값을 주로 저장합니다. |
EBX(extended base register) 메모리 주소를 저장하거나, 공간이 추가적으로 필요할 때 사용하는 여분 레wl스터입니다. |
ESI/ EDI(extended source/destination index) 메모리의 한 영역을 다른 영역으로 데이터를 연속적으로 복사할 때 사용합니다. |
ESP(extended stack pointer) 현재 스택 영역에서 가장 낮은 주소를 저장하며, 저장된 주소는 스택의 끝 위치를 의미합니다. 또한 저장된 주소는 변수 선언 시 지정되는 주소의 값을 의미합니다. |
EBP(extended base pointer) 스택에서 함수의 시작 주소 값을 저장하며, 스택의 기준점이 됩니다. 즉 함수 선언 시 지정되는 주소 값이 저장됩니다. |
☞ 그 외 레지스터
EIP (extended instruction pointer)다음 실행할 명령어를 실행할 수 있도록 명령어의 주소 값을 저장해놓는 레지스터입니다. |
☞ 어셈블리어
어셈블리어는 c언어로 5줄이면 될 것을
20줄로 길고 복잡하게 규칙을 나열한 것과 같습니다.
규칙을 보면 꽤나 복잡해보입니다.
어셈블리어는 옛날에 만들어진 언어라 복잡하지만
하지만 01 기계어와 가장 비슷하기 때문에
리버싱으로 악성코드를 분석하기에 적합하므로 아직까지 많은 사람들이 배우는 언어입니다.
☞ 어셈블리어 형식
OPCODE 오퍼랜드1, 오퍼랜드2
intel 문법(win) OPCODE destination source
AT&T 문법(linux) OPCODE source destination
보통 리눅스에서는 왼쪽에서 오른쪽 방향으로 분석하고 윈도우는 반대입니다.
함수가 호출될 때 스택 프레임이라는 것이 생성되며 함수가 처리 완료되면 자동으로 소멸됩니다.
스택 프레임
스택 프레임은 EBP 레지스터를 사용하여 스택 내의 지역 변수, 함수 인자값, 리턴 주소에 접근하는 기법입니다.
스택에는 지역 변수, 함수 인자값, 리턴 주소들이 저장됩니다.
☞ 어셈블리어 분석
c언어를 만들고
그 c언어를 gcc 바로 실행프로그램으로 컴파일 하는 것이 아닌
어셈블리어로 만들어 분석하려는 것입니다.
옵션을 쓰지 않으면 코드 4줄정도가 추가되기 때문에 분석이 어려워
순정으로 만드는 편이 좋습니다.
gcc -mpreferred-stack-boundary=2 -S -o start.a start.c
sub
subtract로 빼기입니다.
mov
mov
call 함수를 호출합니다.
처음에는 무조건 들어가는
4가지가 있습니다.
EBP 기준을 잡기 위해서 진행합니다.
push 스택에 쌓는 개념입니다.
☞ 연산 과정
esp는 가장 낮은 상태를 말하며
EBP는 기준이 되는 부분을 말합니다.
보통 EBP-4 EBP+12 이런식으로 기준을 잡고 부릅니다.
하나하나의 스택은 4byte로
EBP-12에 저장하겠다. 하면 위로 3칸을 알라가 그곳에 저장합니다.
처음에는 EBP 기준을 잡기위해서 까고 시작합니다.
이유는 원문 함수의 개수에 따라서 공간을 확보하기 위함입니다.
3개라면 12바이트 줄여서(낮은 주소 쪽으로) 시작합니다.
점점 줄고
함수를 저장했다가
EAX를 썻다 지웠다가 호출했다가
하는 것의 연속입니다.
그래서 처음 연산할 때는
c언어 원문과 함께
레지스터
EAX
ESP
EBP
를 갖다놓고
스택프레임을 비교하며 분석하는 편이 편합니다.
나중에는 그래픽기반에서의 어셈블리어를 분석하는 프로그램이 있어 편합니다.
퍼징
어느 부분에 결함이 있는지 모르기 때문에
결함이 어디에 있을지 사전대입 방식으로 때려 넣어 봅니다.
그런 후 어떤 걸 넣었길래 에러가 발생했지? 돌아가보는 개념입니다.
wfuzz 등 퍼징 프로그램은 목적과 필요에 따라서 스크립트를 작성하여 그때그때 작성하는 편입니다.
'Security > 리버싱' 카테고리의 다른 글
정보보안 스터디 - 18주차 5일 - PEview, ollydbg 분석 (0) | 2023.02.14 |
---|---|
정보보안 스터디 - 18주차 4일 - 모의해킹 프로젝트, RVA to VA (0) | 2023.02.13 |
정보보안 스터디 - 18주차 2일 - ollyDbg 사용법, PE 파일 구성 (0) | 2023.02.10 |
정보보안 스터디 - 17주차 7일 - 포멧 스트링 버그, 리버싱 개념 (0) | 2023.02.09 |
정보보안 스터디 - 17주차 5일 - 디버깅, 스택 구조 파악 (0) | 2023.02.07 |