본문 바로가기
스터디/hacking

리버스 엔지니어링(Reverse Engineering) 강좌, 제 5강의 - 어셈블리어 설명

by 깝태 2011. 1. 21.

[리버싱갤] 리버스 엔지니어링(Reverse Engineering) 강좌, 제 5강의 - 어셈블리어 설명

오늘은 여기까지만 남기겠습니다, 그리고 게시글을 퍼와서 깨달은건데 사진들이 모두 엑박뜨더군요 +_+
빨리빨리 봐야되는분들은 원본링크를 타고 넘어가시구요, 전 게시글 수정 나중에 하겠습니다.

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



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

오늘도 순수한 내실력으로~~ 캬캬]
[잘 않보이면 클릭하는 센수~!]
안녕하세요~ W.H.이에요.

지난강의에 이어서 오늘은 어셈블리어에 대해 설명할께요.

어셈블리언어를 사람들이 많이 어려워 하는데 실습하면서 하다보면 그리 어렵지 않습니다.

우선 오랜만에 올리디버거를 열어서 첨부파일 크랙미파일을 열어줍니다.(코드엔진_1.exe)
이로써 준비는 다 됬습니다. 이 파일을 지지고 볶아서 어셈블리어를 공부해 봅시다.
일단 프로그램시 시작된 위치에서 한 5개쯤 NOP로 채줘줍니다.
스페이스 바를 눌르고 내용을 NOP로 바꿔주세요. 그리고 어셈블을 5~10번 눌러주세요.
또는 오른쪽 클릭-바이너리-NOP으로 채움을 선택해 주세요(굳이 영어로 쓰지 않아도 할 수 잇다고 믿습니다.)



뭐 저는 어쩌다 보니 많이 채웟습니다,
자 그럼 전에 배웠던걸 기억하면 가운데 있는건 어셈블리어 창이고 그 오른쪽에 있는건 레지스터 상태, 그리고 그 아래 있는건 스택창이라 햇죠?
그럼 이제 명령어를 사용해 봅시다. 사용법은 아까처럼 NOP있는 부분을 더블클릭하면 나오는 창에 직접 적어주면 됩니다.

먼저 NOP은 No operation의 약자로 아무 활동을 않합니다.
그럼 차례대로
MOV EAX,0
INC EAX
MOV EBX,EAX
ADD EAX,EBX
DEC EAX
을 써주세요



이제 설명 들어갑니다.
MOV은 move의 약어인데 데이터를 저장하는 역활을 합니다. MOV a,b하면 b를 a에 저장합니다.
INC는 incease의 약어인데요 1을 더해줍니다. inc a 하면 a안에 들어있던 값이 1늘어납니다.
DES는 decrease의 약어로 inc와 반대역활을 합니다.
ADD는 더해주는 역활을 하는데 ADD a,b하면 a에 a+b한 값을 저장합니다.
이제 F8을 눌러서 한줄씩 실행시키면서 오른쪽 레지스터창의 EAX,EBX값을 확인해보세요.
오른쪽에 빨간색으로 바뀐값이 표시되니 보기 편할껍니다.
EAX,EBX
0,0
1,0
1,1
2,1
1,1
이렇게 바꼇을 것입니다.
자 다시 프로그램을 restart(왼쪽화살표2개있는것)해주시고 NOP으로 앞의 10~15개를 채워줍니다.
이제 차례대로
MOV EAX,2
MOV EBX,4
MUL EBX
DIV EBX
SUB EBX,1
XCHG EAX,EBX
PUSH EAX
POP EBX
요렇게 써주세요.



MUL과 DIV는 곱하고 나누는역활을 합니다. 근데 뭘 곱하고 나누는지 않보이죠?
이놈들은 자동으로 EAX에 있는 값을 사용합니다.
MUL a 하면 a를 EAX와 곱해서 다시 EAX에 저장을 합니다.
이제 지난강의에서 EAX설명이 이해되시죠?
SUB은 아까 ADD와 정확히 반대역활을 합니다.
다음 PUSH,POP은 스택을 사용하는건데요...
PUSH는 저장하는 역활이고 POP은 저장했던 내용을 불러오는 기능입니다.
PUSH를 하면 ESP(스택포인터)가 4바이트가 줄어들고 그 줄어든 공간에 PUSH한 값이 들어갑니다.
POP을 하면 ESP가 가리키고 있던 곳의 데이터를 POP한곳에 넣고 ESP는 4바이트 늘어납니다.



별 관련은 없는 사진이지만 스택이 저런 위치에 있고 위에서 아래로 내려온다는것만 아시면 됩니다.
이해가 않되신다면 꼭 인터넷에서 찾아보세요
그다음 XCHG는 Exchange의 약어로 두 값이 바뀜니다.
그럼 이제 f8을 눌러 한단계식 실행해 레지스터와 pop,push할때는 오른쪽 아래 스택화면을 봐주세요. 레지스터의 esp도 봐주시고요
EAX,EBX
2,0
2,4
8,4
2,4
2,3
3,2
6,2
6,6
이렇게 바뀔 것입니다.
이제 CALL, JMP계열, CMP, TEST, INT가 남았네요....
CALL은 말 그대로 부릅니다. CALL a하면 a로 가서 별별일을 다 한후 다시 CALL한곳으로 돌아와서 다음 명령을 실행합니다. JMP는 간 다음 돌아오지 않는데 CALL은 돌아온다는 것이 포인트입니다.
JMP계열은 아래 표를 참조해 주세요. 요놈들은 조건이 만족될때 이동합니다.
INT는 인터럽트의 약자인데 시스템을 호출하는 역활입니다. 시스템~(운영체제) 이 일좀 해줘~~ 요런식으로요. 뒤에 숫자가 곧잘 오는데 이 숫자마다 뜻이 있습니다. 하지만 숫자뜻은 PASS. 아직은 알필요는 없습니다.
TEST와 CMP는 두수를 비교해주는 역활을 하는데요 TEST는 두 수를 더하는 방법으로, CMP는 두수를 빼는 방법으로 비교를 합니다.
TEST는 SF,ZF,PF CMP는 ZF,OF,SF,CF에 영향을 끼치는데요(플레그 레지스터들입니다.) ZF가 1이 되면 두 수가 같다는 걸 의미합니다.

이제야 어셈블리어가 뭐가있는지 대략 감이 잡히셧나요?
그냥 MOV는 데이터를 레지스터에 저장하고, PUSH는 데이터를 스택에 저장하고 POP은 스택에 있는 데이터를 빼내고 SUB,DEC,INC,ADD는 더하고 빼는구나. 그리고 JMP계열은 어디론가 점프하는구나.
요정도만 알아도 오늘 강의는 이해한 것입니다.
위에서 말햇듯이 모르는게 있으면 그때 찾아서 볼줄만 알면 충분합니다.

다음강엔 새로운 크렉미로 만나요~~!!