HTML #1

현재 우리가 사용하고 있는 HTML5(Hyper Text Markup Language 5) 브라우저에 표현되는 콘텐츠를 작성하기 위해 고안된 차세대 표준 마크업 언어로써, 브라우저의 자체 해석, ActiveX 설치 비표준으로 혼재되어 왔던 문서 기술에 표준화를 가져왔다.

 

HTML 특징

1.    간단한 DYD 선언(<!DOCTYPE html>) 지원.

2.    기존의 HTML 문서와 호환할 있음.

3.    편리한 기능을 제공하여 유효성 검증 시간이 절약됨.

4.    컴퓨터  시스템, 운영체제, 전자 기기에 상관없이 지원할 있음.

5.    시맨틱 기술을 지원하여 의미있는 문서 구조 표현을 있음.

6.    표준 코덱 내장으로 별도의 플러그인 없이 멀티미디어를 재생함.

 

구성요소

1.    시작 태그: HTML5 요소를 ‘<‘ ‘>’ 둘러싼 표현으로 요소의 시작을 의미.

2.    속성: 태그의 구체적인 설정 사항을 의미.

3.    인수: 속성에 실제 적용될 값을 의미.

4.    내용: 브라우저에 나타날 실제 내용으로 텍스트, 이미지, 멀티미디어 등을 의미.

5.    종료 태그: HTML5 요소를 ‘</‘ > 둘러싼 표현으로 요소의 마지막을 의미하며 생략하는 경우도 있음.

 

기본구조

HTML5 문서는 태그들의 집합체로 구성된 일반적인 텍스트 파일. 브라우저에서 읽어 들이면 서식이 있는 문서로 해석되어 실행되므로, 화면이라 하더라도 기본 구조로 작성된 문서가 있어야 .

기본 구조는 다음과 같음.


 <!DOCTYPE html>

<html lang=“ko">

<head>

             <title>HTML5</title>

             <meta charset = “utf-8” />

</head>

<body>

             <p>HTML5 Document</p>

</body>

</html> 


코드를 저장하고 Chrome 브라우저에 올린 모습


상단 탭에는 title, 본문에는 body 태그 안에 넣은 내용이 보이는 것을 있음. 코드를 설명하면 다음과 같음.

 

<!DOCTYPE html>: 문서의 타입을 선언. HTML5 문서라는 것을 알려 표준 모드로 작동하도록 지정.

<html>, </html>: HTML5 문서의 시작과 종료를 선언. 유일한 속성으로 lang 있는데, 문서의 주요 내용이 어떤 언어인지 표시. ‘ko 한국어임을 의미.

<head>, </head>: 웹페이지의 머리글을 나타내는 부분으로 title, meta, link, script, style 태그를 포함.

<title>, </title>: 브라우저 상단의 페이지 제목을 나타냄.

<meta />: 브라우저에게 문서 작성자, 문서 형식, 문서 인코딩 방식 등의 문서 정보를 알려줌. Charset 속성으로 문자 인코딩을 정의하며, 속성값은 주로 국제 표준 코드인 utf-8 채택함. 종료 태그가 없는 태그.

<body>, </body>: 브라우저를 통해 나타나는 페이지의 모든 내용을 기술하는 부분. 본문 요소는 사용되는 성격에 따라 블록 요소, 인라인 요소, 시맨틱 구조 요소 등으로 나눌 있음.

 

HTML 기본 문법

1.    일반적으로 시작 태그와 종료 태그로 쌍을 이루어 사용.

2.    태그는 대소문자를 구분하지 않음.

3.    태그는 종료 태그 없이 사용할 있음.

4.    주석 글은 기호 ‘<!—‘ ‘—>’사이에 작성.

5.    띄어쓰기는 공백 하나만 인식하고 이상의 공백은 무시.

6.    브라우저에서 인식되지 않는 태그나 오류는 무시하고 실행하지 않음.

7.    HTML5 문서는 텍스트파일로 *.htm 혹은 *.html 저장.

 

문단 관련

1.    <br>

             - 문단에서 바꿈 기능을 하며 종료 태그가 없는 태그. 여러 줄을 띄우고자 하면 해당 만큼 반복하여 작성.

 

2.    <p>

             - 문단을 나누고 줄의 여백을 띄어 .

 

3.    <pre>

             - 문서 내용에 편집되어 있는 모든 여백, , 바꿈 모양 그대로 보여줌.

 

4.    <hr>

             - 주제 변경, 내용 구분 페이지의 문단을 구별하는 용도로 수평선 줄을 삽입하여 종료 태그가 없는 태그.

 

5.    <span>

             - 문장 일정 부분에 텍스트 색상 변경 등의 특정 스타일을 지정하는 인라인 태그.

 

6.    <div>

             - 높이와 너비를 가진 독립된 영역을 만들어 페이지 화면에 블록 구조를 표현한다. 이는 블록 구조에 의해 화면이 분할된 것을 의미.

 

<!DOCTYPE html>

<html lang = "ko">

<body>

             <h2>==Paragraph Tag==</h2>

             <p>p: 문단 나눔</p>

             br: 바꿈<br/>

             hr: 문단을 나눠 주는 용도로 수평선 긋기<hr />

             <div style="background-color:skyblue;">div: 블록에 하늘색 배경 스타일 지정</div>

             <p style ="color:red;">빨간색 글씨 사이에 <span sytle="color:blue;">파란색 글씨</span>

             를 넣을때는 span 사용</p>

             <pre>

                                                                          ?                                 

                                                                                                  

             </pre>

</body>

 


@ 블록요소, 인라인요소, 시맨틱 구조 요소

구분

블록 요소

인라인 요소

시맨틱 구조 요소

의미

하나의 독립된 영역을 가진 요소

독립된 영역 없이 한 줄에 작성되는 요소

의미를 가진 문서 구조를 생성하는 요소

특징

-     자동 줄 바꿈이 실행됨

-     블록 내에 텍스트와 인라인 요소를 포함할 수 있고 블록 간에는 여백이 주어짐

-     경우에 따라 또 다른 블록 요소를 포함할 수 있음

-     줄 바꿈과 여백 기능이 없음

-     인라인 요소 내에 텍스트와 또 다른 인라인 요소를 포함할 수 있음

-     인라인 요소 내에 블록 요소를 포함할 수 없음

-     블록 요소의 성격을 지님

-     사용자 뿐만 아니라 검색 엔진도 더욱 정확하고 신속하게 의미를 파악하고 검색할 수 있다.

해당 요소

div, hr, h1~h6, ul, ol, dl, li, p, address, blockquote, from, table

a, detail, em, i, img, mark, q, strong, span, time

header, footer, article, aside, nav, section

 

 

텍스트 관련 태그

1.    <h(n)>

             - 제목을 표현. 6단계(n=1~6) 계층으로 구분.

 

2.    <abbr>

             - 축약어를 표현. 축약어 위에 마우스가 위치하면 title 속성에서 지정한 원래 단어를 표시

 

3.    <meter>

             - 알려진 범위 내에서 무게, 점수, 수량, 백분율 등의 측정된 값을 그래픽 형태로 표현할 사용. value 필수 속성으로 현재 측정값을 지정

 

4.    <time>

             - 날짜와 시간을 지정, 작성된 날짜의 텍스트 표현을 사람뿐만 아니라 기계가 알아볼 있도록 하는 시맨틱 태그. 실제 날짜와 데이터는 datetime 속성에 지정

 

5.    텍스트 효과

             - 텍스트에 강조, 기울임, 인용문, 하이라이트 마크 등을 표현하는 다양한 효과 태그

태그명

설명

태그명

설명

<address>

 주소나 연락처의 의미로 텍스트 기울임 표현

<blockquote>

긴 글 인용문을 들여쓰기 처리하여 표현

<b>

강조의 의미로 텍스트 굵게 표현

<q>

짧은 글 인용문을 “” 처리하여 표현

<strong>

강한 강조의 의미로 텍스트 굵게 표현

<mark>

특정 텍스트에 하이라이트 마크 표현

<cite>

, 그림 등의 작품 제목을 알리는 의미로 기울임 표현

<ruby>,<rt>

루비 문자(동아시아 문자) 선언(ruby), 루비 문자 위 설명(발음) 표현(rt)

<em>

강조의 의미로 텍스트 기울임 표현

<sub>

아래 첨자 표현

<i>

이탤릭체로 텍스트 기울임 표현

<sup>

위 첨자 표현

<small>

작은 글자나 코멘트를 표현

<del>

가운데 줄이 그어진 글자 표현

 

 

<h1>제목과 텍스트 관련 효과</h1>

<h2>abbr,b태그</h2>

abbr: <abbr title="Hyper Text Markup Language">HTML</abbr> 축약어의 원래 단어 말풍선 표현

b:<b>굵은 글씨</b>표현.

<h3> cite, mark, meter 태그</h3>

cite: <cite> , 영화 등의 제목 인용구를 기울임 </cite> 표현.

mark: <mark> 특정 부분을 하이라이트 마크</mark> 표현.

meter: 측정값 <meter min="0" max="10" value="7"> 70% </meter> 그래프 표현<br/>

<h5> q blockquote 태그</h5>

q: <q> 짧은 인용문을 인용 부호로 </q> 표현 <br/>

blockquote: <blockquote> 글의 인용문을 들여쓰기 표현하는 블록요소</blockquote>

 


목록 관련 태그

1.    순서 있는 목록

             - 항목 앞에 순서의 표현으로 일련번호를 부여하여 목록을 만듬

             => type=타입”: 1(숫자,기본값), a,A(알파벳), i,I(로마자)

             => start=숫자”:목록의 시작 번호 지정 / reversed:번호를 역순으로 지정

 

2.    순서 없는 목록

             - 항목 앞에 특정 글머리 기호를 부여하여 목록을 만듬

 

3.    정의 목록

             - 특정 항목에 대하여 정의 부분과 설명 부분으로 나누어 목록을 만듬

 

4.    다중 목록

             - 목록 태그 내에 다시 목록을 중첩하여 구성하는 다중 목록을 만든다.

 

<h3> 정의 목록(dl) </h3>

<dl>

             <dt> 목록 구성 요소 </dt>

                           <dd> 목록을 구성하는 요소에는 ol, ul, dl 있다.</dd>

</dl>

<h3> 순서 있는 목록(ol)</h3>

<ol type="2">

             <li> 백두산 </li>

             <li> 한라산 </li>

             <li> 지리산 </li>

</ol>

<h3> 순서 없는 목록(ul) </h3>

<ul>

             <li> 버스</li>

             <li> 기차</li>

             <li> 트럭</li>

</ul>

 


이미지 관련 태그

1.    img

             - 이미지 파일을 웹사이트에 삽입하는 기능을 하는 태그

             => src=“이미지 경로”:이미지 경로를 지정(절대 경로, 상대 경로)

             => alt=“대체 텍스트”:이미지를 브라우저가 보여주지 못한 경우 대체 텍스트를 표시

             => title=“설명 ”:마우스 이미지 위에 위치할 설명 팁을 나타냄

             - 이미지를 페이지에 표현할 때에는 이미지가 표현되는 영역의 크기를 지정하기 위해 width=너비”, height=높이 속성을 지정함

 

2.    figure, figcaption

             - 이미지에 설명을 부여하는 이미지 캡션은 img 태그와 함께 사용함

             - 사진, 그림, 등에 캡션, 설명 글을 포함하여 그룹화하는 figure 태그와 캡션 대상에게 실제 설명 글을 붙이는 figcaption 태그가 있음

 

하이퍼링크 관련 태그

1.    a - 다른 문서 또는 URL 연결

             - 현재의 페이지에서 다른 문서나 URL 연결하는 기능. 연결 지정은 대상에 따라 URL 주소, 문서 절대 경로, 문서 상대 경로로 작성함

             => href=링크”:링크 문서나 인터넷 URL 상대 경로 또는 절대 경로로 표시

             => title=설명 :마우스가 링크 위에 위치할 설명 팁을 나타냄

             => target=윈도”:_blank(새로운 또는 새로운 탭에 문서 내용 표시),_self(현재 창에 문서 내용 표현)

 

1.    텍스트로 하이퍼링크 연결


<body>

<h3> 회원출입문 </h3> <ul>

<li> <a href="./login.html" title="로그인" target="_blank"> 로그인 </a> </li>

<li> <a href="./join.html" title="회원가입" target="_blank"> 회원가입 </a> </li> </ul>

 

2.    이미지로 하이퍼링크 연결


<h3> 회원출입문2 </h3>

<a href="./login.html" title="로그인"> <img src="./images/login-1.jpg" /> </a> &nbsp; &nbsp;

<a href="./join.html" title="회원가입"> <img src="./images/join-1.jpg" /> </a>

</body>

 


 

 

2.    a - 문서 내에서 연결

<h3> 페이지 상단입니다. </h3>

<ul>

<li> <a href="#content1"> 하이퍼링크 1 </a> </li>

<li> <a href="#content2"> 하이퍼링크 2 </a> </li>

</ul>

~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> <a id="content1">▶ 하이퍼링크 - 1 </a>

<p> 하이퍼링크 - 1 위치로 오신 것을 환영합니다. </p>

<a href="#"> 위로 </a>

<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> ~<br /> <aid="content2">▶하이퍼링크-2 </a>

<p> 하이퍼링크 - 2 위치로 오신 것을 환영합니다. </p>

<a href="#"> 위로 </a>

<br /> ~<br /> ~<br /> ~<br /> ~<br />

 


 

 

3.    이미지

             - 이미지에 영역 크기를 지정하여 나누어 주는 기능. 이미지 맵을 정의하는 map 태그와 영역을 나눠주는 area 태그가 있으며, 구분된 영역은 클릭하면 다른 곳으로 이동하는 하이퍼링크 기능을 실행함

             => [map] name=“ 이름”: 이름을 지정하여 img 태그의 username= 이름속성과 상호 연결됨

             => [area] shape=“ 모양”: 모양을 지정하며 형태는 default(전체 영역), poly(다각형), rect, circle 있음

             => [area] coords=“좌표”: 이미지 형태에 따른 크기를 지정하며 사각형의 경우 x1,y1,x2,y2”, 원의 경우 x1,y1,r”, 다각형의 경우 x1, y1, x2, y2, …, xn, yn”으로 지정

             => [area] href=“링크 문서”: 링크하여 이동할 문서 지정

 

<body style="text-align:center;">

<h3> 브라우저 방문하기 </h3>

<img src="./images/browser.jpg" width="200" height="150" usemap="b_map" />

<map name="b_map">

<area shape="rect" coords="10,60,100,140" href="http://www.mozilla.or.kr/ko/" title="파이어폭스" /> <area shape="rect" coords="110,60,190,140" href="https://www.google.com/" title="크롬" /> </map>

</body>


왼쪽 부분을 클릭하면 mozila 홈페이지로, 오른쪽을 누르면 google 간다.

 

 

관련 태그

1.    구성

             - (세로):<tr> / (가로):<td>

             => border:표의 테두리 두께 지정(1 or “ “) - border 작성하지 않으면 테두리 없는 표로 처리

 

2.    병합

             => colspan= : 지정한 만큼 열을 병합

             => rowspan= ”: 지정한 만큼 행을 병합

 

3.    그룹 구조화

             - 표에 의미를 부여하여 시맨틱하게 인식되도록 처리하면 페이지 검색 등에 유용하게 사용될 있음. , 전체를 대표하는 제목을 표시하며, 열을 그룹화하여 해당 열에 대한 효과를 별도로 지정할 있음. 또한 안에서 머리글, 본문, 바닥글로 구조화하여 구성 가능.

             1. 캡션: 전체 내용을 대표하는 제목. <caption> 태그 사용

             2. 그룹화: 표에 속한 열을 그룹으로 만듬. <colgroup> 태그 사용

             3. 구조화: 표를 의미와 용도에 따라 머리글, 본문, 바닥글로 구분하여 구조화. <thead>, <tbody>, <tfoot> 태그 사용

 

 

<table style="text-align:center;" border="1">

<tr>

<th rowspan="2" scope="row"> 성명 </th> <!-- 2개의 행을 병합한 제목 --> <th colspan="2" scope="col"> 성취 평가 </th> <!-- 2개의 열을 병합한 제목 -->

</tr> <tr>

<td> 컴퓨터 일반 </td>

<td> 프로그래밍 </td> </tr>

<tr>

<td> 이순신 </td> <td> 98 </td> <td> 100 </td>

</tr>

</table>

<br/>

<table border="1">

<caption> 컴퓨터 주변 기기 </caption>

<thead>

<tr>

<th> 주변 기기 </th> <th> 이미지 </th> <th> 주변 기기 </th> <th> 이미지 </th>

</tr>

</thead> 

<tbody>

<tr>

<td> 마우스 </td> <td> <img src="./images/mouse.jpg" /> </td> <td> 프린터 </td> <td> <imgsrc="./images/printer.jpg" /> </td>

</tr>

</tbody> 

<tfoot>

<tr>

<td colspan="4"> <address> 신청 연락처 : 02-123-4567 </address> </td>

</tr> 

</tfoot>

</table>

 



 

 

멀티미디어 관련 태그

1.    video

             - 페이지에서 동영상 파일을 삽입하여 별도의 플러그인 없이 브라우저 자체의 내장 플레이어로 재생하는 기능


<video autoplay="autoplay" controls="controls">

<source src="비디오파일1"type="비디오타입1"/>

<source src="비디오파일2"type="비디오타입2"/>

</video>


             => [video] src=비디오 파일”: 비디오 파일의 경로 지정

             => [video] autoplay=autoplay”: 자동 재생 기능 지정

             => [video] controls=controls”: 컨트롤 바가 표시되도록 지정

             => [video] poster=이미지 파일”: 비디오 파일이 화면에 나타나지 않을 경우 대체할 이미지 경로 지정

             => [video] width=너비”: 비디오 파일이 재생될 너비 지정

             => [video] height=높이”: 비디오 파일이 재생될 높이 지정

             => [source] src=비디오 파일”: 비디오 파일의 경로 지정

             => [source] type=비디오 타입”: 비디오 파일의 타입 지정

 

2.    audio

             - 페이지에 음악을 삽입하여 별도의 플러그인 없이 브라우저 자체의 내장 플레이어로 재생하는 기능


<audio autoplay="autoplay" controls="controls">

<source src=오디오파일1"type="오디오타입1"/>

<source src="오디오파일2"type="오디오타입2"/>

</audio>


             => 속성은 비디오와 거의 동일, poster 대신 loop 옵션이 있음.

             => [audio] loop=“loop”: 반복 재생 지정

 

3.    embed

             - 플러그인이 설치된 브라우저 혹은 플러그인이 필요한 멀티미디어 파일을 재생하는 태그

<embed src=“파일 경로”></embed>

             => src=파일 경로”: 외부 파일 경로 지정

             => type=“파일 타입”: 파일 타입 지정

             => width=너비”: 너비값 지정

             => height=“높이”: 높이값 지정

'Programming > Web Programming' 카테고리의 다른 글

JavaScript Basic #1  (0) 2017.07.13
CSS #2  (0) 2017.07.12
CSS #1  (0) 2017.07.12
HTML Basic #3  (0) 2017.07.10
HTML Basic #2  (0) 2017.07.08
Posted by BinZIP
Reversing/Reversing2017. 7. 3. 03:53

Lena’s Reversing for Newbies


항상 그랬던 것처럼 먼저 프로그램을 실행해보자.


쓸데없는 잡담들 다 갖다 치우고 올바른 Registration Code를 찾으라고 한다. 확인을 눌러봤다.


Registration Code를 입력하는 창인 것 같다. Register Me! 버튼을 입력하면 맞는지 아닌지 확인해줄 것이고, Nag? 버튼은 모르겠으니 일단 눌러봤다.


아까 처음에 봤던 창이다. Regcode에 아무거나 넣고 Register me!를 눌러봤다.


틀렸다 한다. 이제 할 것도 없고 폼 창에서는 SmartCheck를 사용해서 Registration을 얻어보라고 하는데, 그건 나중에 하기로 하고 일단 OllyDbg에 올려보자.


여기까지 와서 Search for All Intermodular Calls 명령을 사용해 MsgBox를 만들어내는 함수를 호출하는 곳을 찾아보자.


이렇게 하나하나 찾을수도 있겠지만 Sort by 기능을 활용하면 한눈에 쉽게 볼 수 있다.


저 네 개 모두에 BreakPoint를 걸어준다. 우클릭으로 Set breakpoint on every call to rtcMsgBox라는 옵션을 선택하면 저기 4개의 주소에 모두 BP가 걸린다. 이후 F9로 실행시키고 Nag? 버튼을 눌러보면 다음 그림처럼 Break가 걸린다.

그럼 저기가 바로 메시지 박스를 출력하기 위해 함수를 호출하는 부분인 것을 알 수 있으니 저 CALL 부분을 어떻게 수정해주면 되겠다. 그런데 아무리 생각해도 CALL 5바이트 명령만큼으로 MsgBox 함수의 리턴인 EAXESP까지 동시에 처리해줄 방법이 없었다. EAX에는 확인 버튼을 눌렀을 때처럼 1이 들어가면서 스택 포인터까지 정리하려면 8바이트가 필요하기 때문이다.

그렇다면 그냥 Event Handler Nag? 버튼을 눌렀을 때 호출되는 함수 자체를 호출되자마자 리턴 시켜버리면 되지 않을까? 하는 생각에 위로 올려서 함수의 시작부를 찾아봤다.

함수 시작부를 찾을 수 있었다(PUSH EBP; MOV EBP, ESP;). VB는 일반적으로 Stdcall 방식을 사용하므로 피호출 함수가 스택을 정리해야 한다. 그렇다면 전달되는 파라미터에 따라서 RETN @ 형식으로 ESP를 함수 호출 이전으로 초기화 해줘야 한다. 이 함수의 파라미터의 개수를 찾아보자.

파라미터 개수를 찾기 위해서 함수의 시작부인 PUSH EBP BP를 걸고 Nag? 버튼을 다시 클릭한 후 스택을 확인한다.

7401E5A9의 주소로 돌아가는 것을 알 수 있다. MSVBVM50.dll 모듈 영역이다.

바로 위의 명령을 보면 CALL EAX 명령을 실행한 후 아래 명령으로 돌아오도록 되어있다. CALL EAX 명령BP를 걸고 Ctrl+F2로 다시 실행해보자.

EAX의 값은 402649이다. 저 주소로 가보자.

402C17 주소로 점프하는 것을 알 수 있다. , 위에 MSVBVM50.dll에서 CALL EAX 명령에 의해 호출된 것은 402C17에 있는 함수, 그러니까 우리가 파라미터의 개수를 찾으려는 함수임을 알 수 있다. 이는 CALL EAX 명령이 실행되는 전후의 스택 주소를 확인하면 402C17의 파라미터의 개수를 알 수 있다는 뜻이다. 한 번 확인해보자.

4만큼 차이 나는 것을 확인했다. , 4바이트 만큼 정리해줘야 한다는 뜻이므로 코드를 수정하러 가자.


다음과 같이 코드를 수정해준다. 실행해보면 이제 쓸데없는 소리하는 메시지 박스가 나오지 않는 것을 확인할 수 있다.

, 그럼 이제 Registration Code를 찾아보자. 먼저 아까 틀리면 나왔던 메시지 박스의 내용을 바탕으로 Search for All Strings에서 해당되는 부분을 찾았다.

더블클릭으로 찾아 들어가준다.


‘I’mlena151’이라는 문자열을 상단에서 찾을 수 있다. 저 문자열 바로 아래에 호출되는 함수는 StrCmp, 즉 문자열 비교 함수다. 이는 즉 저 문자열과 사용자가 입력한 문자열을 비교하는 것으로 유추할 수 있다. 바로 넣어서 확인해보았다.



'Reversing > Reversing' 카테고리의 다른 글

Calling Convention (함수 호출 규약)  (0) 2017.07.02
Abex’ Crackme #2  (0) 2017.06.30
Stack Frame  (0) 2017.06.27
Abex' Crackme #1  (0) 2017.06.27
OllyDbg Commands & Assembly Basic & etc  (0) 2017.06.27
Posted by BinZIP
Reversing/Reversing2017. 7. 2. 15:03

함수 호출 규약 (Calling Convention)


함수 호출 규약은 함수를 호출할 때 파라미터를 어떤 식으로 전달하는가?’에 대한 일종의 약속이다. 이전까지의 포스팅에서도 확인했듯이 함수를 호출하기 전에 파라미터를 스택을 통해서 전달한다는 것을 알고 있다. 스택이란 프로세스에서 정의된 메모리 공간이며, ‘스택은 거꾸로 자란다는 말대로 스택에 큰 주소부터 작은 주소를 향해 자라난다. 또한 PE 헤더에 스택의 크기가 명시되어있다. , 프로세스가 실행될 때 스택 메모리의 크기가 결정된다는 뜻이다. 이는 동적 할당에 사용되는 Heap 메모리 공간과는 다르다.


그렇다면 함수가 실행이 완료되었을 때 스택에 있는 파라미터는 어떻게 할까? 정답은 그대로 놔둔다이다. 스택에 저장된 값은 임시로 사용하는 값이기 때문에 더 이상 사용하지 않는다 하더라도 값을 지우거나 하면 불필요하게 CPU의 자원을 소모하는 것이기 때문이다. 어차피 다음 번에 스택에 다른 값을 입력하면 저절로 덮어쓰는 데다가 스택 메모리는 이미 고정되어 있기 때문에 메모리를 해제(Free)시킬 수도 없고 할 필요도 없다.

=> 함수 실행 후 스택에 남은 파라미터는 지우지 않고 그대로 놔둔다.

 

함수가 실행이 완료되었을 때 ESP, 즉 스택 포인터는 함수 호출 전으로 복원되어야 한다. 그래야만 참조 가능한 스택의 크기가 줄어들지 않기 때문이다. 스택 메모리는 고정되어 있고 ESP로 스택의 현재 위치를 가리키는데, 만약 ESP가 스택의 끝을 가리킨다면 더 이상 스택을 사용할 수 없다. 함수 호출 후에 ESP를 어떻게 정리하는지에 대한 약속이 바로 함수 호출 규약이다.

주요 함수 호출 규약은 아래와 같다.


1.     Cdecl

2.     Stdcall

3.     Fastcall


애플리케이션 디버깅에선 cdecl stdcall의 차의점을 확실히 알아야 한다. 어떤 방식이든 파라미터를 스택을 통해 전달한다는 기본 개념은 동일하다.

 

Cdecl (C Declaration)

Cdecl 방식은 주로 C언어에서 사용되는 방식이고, Caller, 즉 함수 호출자가 스택을 정리하는 특징을 가지고 있다.


위에서 Main으로 표시해둔 부분을 잘 보자. 파라미터를 401000 주소에 위치한 함수에 전달한 후 ESP 8을 더해서 파라미터 부분을 정리하고 있다. 이렇게 Caller(이 예제에서는 main)가 스택을 정리하는 방식이 cdecl 방식이다.

Cdecl 방식은 printf 함수와 같이 파라미터의 길이가 변해도 전달할 수 있다는 장점이 있다. 가변 길이 파라미터를 전달하는 것은 다른 함수 호출 규약 방식(정확히 말하면 피호출자가 정리하는 규약)에서는 구현이 어렵다. 호출자 함수에서는 가변 인자의 스택의 크기를 알고 있지만 피호출자 함수에서는 가변 인자의 스택의 크기를 알 수 없기 때문이다.

 

Stdcall

Stdcall Win32 API에서 사용되며, Callee에서 스택을 정리하는 특징을 가진다. C언어는 기본적으로 cdecl 방식이라고 했는데, stdcall 방식으로 컴파일 하고 싶을때는 int _stdcall name(int a)와 같이 함수명 앞에 ‘_stdcall’ 키워드를 붙여주면 된다.


401010 메모리 주소에 있는 것이 main함수이다. 위에서 cdecl 방식이 main에서 스택을 정리했었는데, 여기서는 ESP 8을 더하는 명령이 생략되고 401000에 있는 함수에서 RETN 8(RETN POP 8바이트 라는 뜻이다) 명령으로 8바이트만큼 ESP를 증가시키고 있다. 이와 같이 Callee가 스택을 정리해주는 방식이 stdcall 방식이다.

Stdcall 방식은 피호출자 함수 내부에 스택 정리 코드가 존재하므로 함수를 호출할 때마다 ADD ESP, @ 명령을 써줘야 하는 cdecl 방식에 비해 코드의 크기가 작아진다. Win32 API C언어로 된 라이브러리이지만 기본 cdecl 방식이 아닌 stdcall 방식을 사용한다. 이는 C 이외의 다른 언어에서 API를 직접 호출할 때 호환성을 좋게 하기 위한 것이다.

 

Fastcall

기본적으로 stdcall 방식과 같지만 함수에 전달하는 파라미터의 일부(2개까지, 일반적으로 파라미터 맨 앞의 2)를 스택 메모리가 아닌 ECX, EDX 레지스터를 이용해 전달한다. 이는 좀 더 빠른 함수 호출을 가능하게 하지만 ECX, EDX 레지스터를 관리하는 추가적인 오버헤드가 필요할 수 있다. 함수 호출 전에 ECX, EDX에 중요한 값이 저장되어 있다면 백업을 해야한다. 또한 함수의 내용이 복잡하면 ECX EDX 레지스터를 다른 용도로 사용해야 할 필요가 있는데, 이럴 때도 다른 어딘가에 백업을 해야한다.

'Reversing > Reversing' 카테고리의 다른 글

Lena's Reversing for Newbies #1  (0) 2017.07.03
Abex’ Crackme #2  (0) 2017.06.30
Stack Frame  (0) 2017.06.27
Abex' Crackme #1  (0) 2017.06.27
OllyDbg Commands & Assembly Basic & etc  (0) 2017.06.27
Posted by BinZIP