본문 바로가기
스터디/hacking

리버스 엔지니어링(Reverse Engineering) 강좌, 제 4강의 - 레지스터 설명

by 깝태 2011. 1. 21.

[리버스갤] 리버스 엔지니어링(Reverse Engineering) 강좌, 제 4강의 - 레지스터 설명

원본링크 - http://blog.naver.com/aaaa875/110092685472



---------------------------------------------------------------------------------

[오늘은 순수한 내실력으로~~ 캬캬]

오랜만입니다 여러분~ W.H.에요.

여행갔다오고 학교는 개학하고 귀찮고... 등 여러 일이 있어 그동안 강의를 쓰질 못햇습니다... 그러던중 해커스쿨(www.hackerschool.org)에서 리버싱 강좌를 하는걸 보고 위협을 느껴(ㅋㅋ) 다시 쓰게 됬습니다.

그럼 지난번에 말한데로 레지스터와 명령어에 대해 설명하겠습니다. 지금까지 해왔던것중 제일 지루할지도 모르는 내용이지만 엄청 중요합니다.
하지만 외우려고 하지는 마시고 그냥 익숙하게 하는게 제일 중요합니다. (그냥 외우지 말고 모르는 레지스터 나올때마더 이 문서나 1강에서 설명한 문서를 보세요)
이부분을 한번 공부하고 다음강의에 쓸 내용데로 한번 따라오시면 머리속에 어느정도는 개념이 박힐것입니다.

서론이 길었군요. 이제 시작하겠습니다.

-CPU레지스터



일단 레지스터에 대한 정의를 한번 복습하면
레지스터는 CPU속에 있는 고속의 작은 메모리이고 각각의 레지스터는 용도가 있다.
그럼 이 용도가 우리가 알아야 할 것입니다.



범용 레지스터는 말 그대로 아무데나 쓰일 수 있는 레지스터 입니다. 우리는 이 값을 수정할 수 있습니다.
이 범용레지스터는 EAX EBX ECX EDX ESI EDI ESP EBP가 있는데
앞에 4개는 abcd순이죠? 뒤에 두개는 그냥 이런게 있구나... 요렇게만 생각하세요.
EAX: 곱셈(MUL)과 나눗셈(DIV) 명령에서 여기에 있는 값을 사용합니다. 또 함수의 리턴값이 여기에 저장이 됩니다.
EBX: ESI나 EDI와 결합하여 인덱스에 사용된다.//PASS~~
ECX: 반복명령(REP)할때 이 레지스터의 값이 0일때까지 반복합니다.카운터의 역활을 하는거죠.
EDX: EAX와 같이 쓰이며 부호확장명령등에 쓰인다//PASS~
ESI: 데이터(메모리에 있는 문자열이라든지..)를 가리키는 포인터라 보면 됩니다.
EDI: 복사 작업할때 저장할 곳의 주소를 저장한다.
ESP: 하나의 스택프레임의 끝지점 주소가 저장된다.//잠시뒤 설명
EBP: 하나의 스택프레임의 시작주소가 저장된다. 가리키고 있던 스택프레임이 사라지면 전 스택프레임의 시작점을 가리킨다.//잠시뒤 설명

흐음? 딱 보니까 EBX,EDX,ESI,EDI는 잉여성격을 띄는 듯 하죠? 원래 범용레지스터는 용도가 있긴 한데 그 용도 말고 다른용도로 쓰일때가 많아 요놈들은 걍 있나보다.. 하면 됩니다.
그럼 나머지 놈들은 중요하겟죠?
ESP는 Extended Stack Pointer의 약자입니다.(약어로 외우지 말고 풀로 외우면 쉬워요~) 스택 포인터 말그대로 스택을 가리키는 포인터입니다.
EBP는 Extended Base Pointer의 약자입니다. 베이스포인터... 뭔가 기본이 되는곳을 가리키는것 같죠? 말 그대로 스택이 시작되는 부분의 주소를 가리킴니다.
스택은 임시공간으로 생각하시면 편한데요(정확한 뜻은 아님)...  각종 변수들이 저장되고 이 스택에 값을 넣고 뺄때 push pop명령어가 쓰입니다. 이 명령어를 쓰면 4바이트(1word)씩 나갔다 들어갔다 하고 그에따라 ESP도 4바이트씩 변합니다.(물론 여기선 주소값이겟죠?)

이 스택부분은 제가 설명하기엔 제 실력이 딸리네요.
첨부파일을 받아서 봐주세요

[첨부파일은 와우해커에서 달고나님이  쓰신 버퍼오버플로우 강의인데 앞부분에 프로그램의 동작원리와 어셈블리어, 레지스터 ,버퍼 등 매우 좋은 내용이 있으니 다소 어렵더라도 한번쯤은 읽어보는것을 추천합니다.]

다음은 EIP(Extended Instruction Pointer)입니다.
프로그램의 코드가 메모리에 올라왔으면 실행을 해야겠죠? 이때 다음번에 실행할 곳을 알려주는게 이 레지스터의 역활입니다. 매우 중요한 역활이죠. 그래서인지 우리는 이 레지스터의 내용을 수정할 수 없습니다.
그다음은 세그먼트 레지스터입니다.
세그먼트 기억 나시나요? 세그먼트와 오프셋 메모리 주소를 나타낼때 썻었죠.
프로그램이 실행되면 메모리가 크게 3부분으로 나눠집니다. 코드, 데이터, 스텍 이 세그먼트 레지스터는 각각 하나씩 맡아서 오프셋을 저장합니다.(읽어야할 위치) CS,DS,SS요렇게 3개인데.. 중요성은 제가 보기엔 별로 없습니다.(지금은요)
그다음 플레그 레지스터입니다.
요놈이 중요한데요... 플레그... 깃발이란 뜻이죠? 위아래로 흔드는 그 깃발이요. 레이싱할때 보면 흔드는 깃발이 많은데 그 깃발마다 뜻이 있데요. 그것과 마찬가지로 요 플레그 레지스터는 각각 뜻이 있고 깃발을 위로 든 상태(1) 내린상태(0) 요렇게 두가지 상태밖에 없습니다.
종류는 많은데 그중 몆개만 소개하면 CF,ZF,OF,SF가 있습니다.
CF(carry) : 부호없는 연산결과(사칙연산이겟죠?)가 용량보다 클때 세트(1) 된다.
OF(overflow): 부호있는 연산결과가 용량보다 클때 세트(1) 된다.
요 두놈의 차이는 부호(+-)가 있냐 없냐고요 용량보다 크다는건 c언어 해보신분은 아실꺼에요 char형 변수에 290을 넣으면 음수가 되버리죠? 요걸 말합니다.
ZF(zero): 연산결과가 0일때 세트됩니다. 아니면 해제(0)이 되죠.
SF(sign): 연산결과가 음수면 세트됩니다. 그럼 0에선? 해제되죠(헷갈리는분 없기를)
이것말고도 사용되는게 많지만 다 알필요는 없습니다.

아 그리고 아까 살짝 언급햇는데 단위 word설명입니다. 8bit가 모이면 1byte죠? 그 1바이트가 4개 모이면 1word가 됩니다. 1워드는 32비트, 레지스터크기랑 같지요? 그래서 자주 쓰입니다.

이번강은 여기서 끊어야겠네요 다음강엔 어셈블리어 강의가 있을겁니다~~ 다음번엔 사진도 많아요~ ㅋㅋ