스터디/hacking - 5

  1. 2011.01.21 리버스 엔지니어링(Reverse Engineering) 강좌, 제 5강의 - 어셈블리어 설명 (4)
  2. 2011.01.21 리버스 엔지니어링(Reverse Engineering) 강좌, 제 4강의 - 레지스터 설명 (2)
  3. 2011.01.21 리버스 엔지니어링(Reverse Engineering) 강좌, 제 3강의 - 올리디버거 설정, 설명 2
  4. 2011.01.21 리버스 엔지니어링(Reverse Engineering) 강좌, 제 2강의 - 올리디버거 설정, 설명

[리버싱갤] 리버스 엔지니어링(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계열은 어디론가 점프하는구나.
요정도만 알아도 오늘 강의는 이해한 것입니다.
위에서 말햇듯이 모르는게 있으면 그때 찾아서 볼줄만 알면 충분합니다.

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

2011.01.21 18:08. RSS feed. Trackback 0 came from other blogs. Leave a Response.
Posted in 스터디/hacking. Top

댓글을 달아 주세요

  1. BlogIcon W.H.

    온김에 댓글달고 갑니다 ㅎㅎ

    2011.01.21 23:10  ×  +
  2. Re. BlogIcon 완소풉

    감사합니다 ㅋㅋ 근데 엑박이 떠서
    빨리 수정해야겠습니다. ㅋㅋ

    2011.01.22 14:03  ×
  3. 강의더없나

    더 없는건가요; ㅜ

    2011.04.11 17:32  ×  +
  4. Re. BlogIcon TEDDY 깝태

    네, 지금 업데이트 하긴 했지만 강의 올리시는 분이 바빠서
    많이 올라오는 사정은 아닙니다 ㅠㅠ;

    2011.04.17 03:25 신고  ×


[리버스갤] 리버스 엔지니어링(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비트, 레지스터크기랑 같지요? 그래서 자주 쓰입니다.

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

2011.01.21 18:05. RSS feed. Trackback 0 came from other blogs. Leave a Response.
Posted in 스터디/hacking. Top

댓글을 달아 주세요

  1. jjm

    4 비트가 1바이트 아닌가요?

    2012.11.07 13:22  ×  +
  2. Re. BlogIcon TEDDY 깝태

    8비트가 1바이트 입니다.

    2012.11.08 20:43 신고  ×


[리버싱갤] 리버스 엔지니어링(Reverse Engineering) 강좌, 제 3강의 - 올리디버거 설정, 설명 2

지금 보니깐 복붙을 할때 글 간격이 좀 있습니다. 그 부분은 제가 나중에 따로 수정하겠습니다.

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



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

[이 강좌는 "리버스엔지니어링 역분석 구조와 원리(박병익 저/지앤션)을 많이 참고했습니다.]

자 다시 온 W.H.입니다.(또 하루만에)

그럼 이제 시작합니다~~

이번에는 그 요상한 코드가 있는 어셈블리어가 있는 부분에서 마우스 우클릭하면 나오는 메뉴에 대해 알아봅시다.

 

comment 메뉴는 주석을 달 수 있는 기능입니다.

Binary는 바이너리(HEX코드)를 직접 수정하거나 90(NOP 아무 실행 않함)으로 채워주는 편리한 기능입니다.

breakpoint 는 브레이크 즉 멈추는 기능인데... run하고 프로그램이 멈추는 곳을 지정할 수 있습니다.

한번 써보시면 바로 아실겁니다.(toggle로 하세요~)

search for은 편리한 기능이 많은데 무언가를 찾아줍니다.

여기서 편리한 기능은 all referernced text strings 가 있는데 이 프로그램에서 언급된(사용한) 텍스트를 찾아줍니다. all intermodular calls는 import된(걍 사용된이라고 생각하세요)함수들의 목록을 볼 수 있습니다.

이 말고도 다양한 기능있으니 한번씩 실행시켜 보시길

 

다음 오른쪽 registers메뉴에서 값을 더블클릭하면 그 값을 수정할 수 있습니다.(꽤나 유용)

아 그리고 어셈블리 있는 부분을 더블클릭하면 수정 가능해요~

 

자 이제 본격적으로 시작해 봅시다!(다음강의부터 ㅋㅋ)

참고로 어셈블리어는 차근차근 CRACKME문제 풀면서 언급할께요~

일단 여기서 마칠께요 그럼 저는 이만...

 

2011.01.21 18:03. RSS feed. Trackback 0 came from other blogs. Leave a Response.
Posted in 스터디/hacking. Top

댓글을 달아 주세요


[리버싱갤] 리버스 엔지니어링(Reverse Engineering) 강좌, 제 2강의 - 올리디버거 설정, 설명

이번 게시글부터는 기타 잡담은 삼가하고 바로 게시글만 첨부하겠습니다~ ^^

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



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

 

[이 강좌는 "리버스엔지니어링 역분석 구조와 원리(박병익 저/지앤션)을 많이 참고했습니다. 이 강좌는 순수한 공부를 위한 용도이며 질문, 저작권, 삭제요청 등은 aaaa875@naver.com으로 메일을 보내주세요. 만약 저작권에 위반되는 문서이면 바로 삭제합니다.]

 

안녕하세요~
다시 돌아온(2일만에) W.H.입니다.
오늘은 툴 소개 및 어셈블리 언어 소개 등을 할껀데요... 아마 2개로 나눠서 할듯 싶네요...


일단 리버스 엔지니어링을 하기 위해서 필요한 툴! 바로 디버거인데요 가장 많이 쓰는 것은 OllyDBG입니다. 다운받는 곳은  www.ollydbg.de 입니다. 그리고 200버전 말고 110버전을 다운받아주세요(아 네이버에서 쳤다가 이상한 파일을 받아서 피해보는 경우가 있습니다. 꼭 이 사이트에서 받아주세요)


또 다른 유명한 디버거로는 IDA입니다. 하지만 요거에 대한 설명은 나중에~


그리고 올리디버거는 플러그인(추가기능)을 다운받아 쓸 수 있는데요... 이런것들을 모아놓은 사이트가 있습니다. 저는 tuts4you.com 요 사이트를 씁니다. 이 사이트는 crack me(리버싱 연습 파일)도 있어 좋은 사이트 입니다.


자 그럼 올리디버거에 대하여 설명하겠습니다.


1.우선 올리디버거를 적당한 곳에 다운받아 주고 압축을 풉니다.

2.그다음 압축을 푼 폴더 안(실행파일이 있는곳)에 UDD, Plungin이란 폴더를 만들어 줍니다.

3.http://tuts4you.com/download.php?view.258 요 파일을 받아줍니다.(아래화살표를 클릭하세요)

4.역시 압축을 풀고 안에 도움말 파일이 있을것입니다. 그러면 그 파일을 올리디버거 실행파일이 있는 폴더(아까 그폴더)에 넣어주세요.(요 도움말 파일은 API도움말 파일입니다.참고로 영문)

5.그다음 올리디버거를 켜 주시고 메뉴-Help-Select API help file을 눌러서 WIN32.HLP파일을 열어주시면 됩니다.

6.메뉴-Options-Debugging options를 눌러서 Event텝으로 가서 Make first pause at 설정중 두번쨰인 Entry point of main module을 선택해 주세요

7.그리고 올리디버거가 깔린 폴더에서 ollydbg.ini파일을 열러

show jump dirction=1
show jump path=1
show jumpfrom path=1
show path if jump is not taken=1

이 말들을 setting부분에 복사해 주세요.

8.그리고 option-apreance-directories에 가서 플러그인과 UDD폴더설정을 해줍니다.



자 설정을 다 하셧다면 이제 본격적으로 시작합니다.

우선 File-Open해서 아무 실행프로그램을 열어 줍니다.

외계어로 이루어진 뭔가가 뜰 것입니다. 화면을 대략 5등분하는 창이 생길텐데요... 왼쪽 위에 큰 부분이 어셈블리코드가 나오는 부분입니다. 그리고 그 아래 약간 옆으로 길고 위아래로 짧은 창 있죠? 그 부분은 변수에 대해 나오는 창입니다. 다음으로 그 오른쪽 창입니다. 바로 레지스터 상태가 나오는 창입니다. 지난번 강좌를 열심히 보신분은 아는것이 나올 겁니다 (ㅋㅋ) 그다음 왼쪽 아래 HEX코드가 나오는 부분은 Dump창입니다. 여기서 Dump란 메모리에 올라와 있는 프로그램의 코드(HEX코드로 올라와 있겠죠)를 그대로 옮겨 온 것입니다. 그리고 그 오른쪽은 스택의 모습입니다.



자 이제 메뉴 설명 갑니다.

File메뉴는 말 그대로 여는 겁니다. open은 실행파일 또는 dll 등의 파일을 열 수 있고 attach는 이미 실행되있는 프로그램에 말 그대로 attach(붙는)하는 겁니다.


다음 view는 말그대로 '보는'메뉴입니다. 요 메뉴들은 나중에 쓸모 있을떄마다...(저도 잘 몰라요 ㅠㅠ)

다음은 Debug메뉴입니다. 요 부분은 단축키를 외워두면 편하게 쓸 수 있습니다.

Run은 그 화살표 있죠? 그거 눌렀을떄랑 똑같은데 프로그램을 실행시켜서 브레이크 포인트(나중에 설명)이나 Exception(예외)가 발생하면 정지시켜 줍니다.

다음 Restart는 왼쪽 쌍화살표랑 똑같은데 프로그램을 처음상태로 되돌립니다. 참고로 다시 Run을 해야 실행됩니다.(초기화(re)만 하고 실행(start)를 않함)

step into 와 step over은 코드를 한줄씩 실행하면서 상태변화를 볼 수 있는데... 두개의 차이점은 Call 명령어나 Rep명령어를 만나면 그 명령어속으로(call은 실행흐름이 어디론가 갔다가 다시 돌아오고 rep은 실행흐름이 반복됩니다.)들어가(into) 1줄씩 실행하지만 step over은 그 명령어들을 한번에 처리하고 넘어갑니다.(over 코드 1줄만 실행되지 않을 수 도 있는거죠).

나머지 기능들은 나올때 설명하겠습니다.

Plugin은 추가기능입니다. 지금은 아무것도 없죠.

option메뉴는 옵션 help메뉴는 도움말이죠(참 성의없죠? 근데 딱히 말할건...)

오늘은 요기까지!


2011.01.21 18:01. RSS feed. Trackback 0 came from other blogs. Leave a Response.
Posted in 스터디/hacking. Top

댓글을 달아 주세요