<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ghkdtlwns987</title>
    <link>https://pwnable-study.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 10 May 2026 11:31:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>2020/03/31</managingEditor>
    <item>
      <title>asdf</title>
      <link>https://pwnable-study.tistory.com/152</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;# 24_np.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: np-backend
  namespace: project-snake
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Egress                    # policy is only about Egress
  egress:
    -                           # first rule
      to:                           # first condition &quot;to&quot;
      - podSelector:
          matchLabels:
            app: db1
      ports:                        # second condition &quot;port&quot;
      - protocol: TCP
        port: 1111
    -                           # second rule
      to:                           # first condition &quot;to&quot;
      - podSelector:
          matchLabels:
            app: db2
      ports:                        # second condition &quot;port&quot;
      - protocol: TCP
        port: 2222&lt;/code&gt;&lt;/pre&gt;</description>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/152</guid>
      <comments>https://pwnable-study.tistory.com/152#entry152comment</comments>
      <pubDate>Mon, 20 Nov 2023 00:00:51 +0900</pubDate>
    </item>
    <item>
      <title>근황</title>
      <link>https://pwnable-study.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;비오비 교육생일 때 너무 바빠서 교육 들으면서 블로그를 적었던게 마지막이었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이마저도 비공개로 올림..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부를 안하고 있는게 아니라 요즘 블로그 대신 개인 노션으로 갈아타서 글을 안적고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 공부했던 걸 기록하고 더 많은 사람들이 봤으면 좋겠어서 다시 블로그를 쓰고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 티스토리 말고 velog 에다가 쓸 예정임...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@ghkdtlwns987/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@ghkdtlwns987/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668525141073&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ghkdtlwns987 (황시준) - velog&quot; data-og-description=&quot;포스트가 없습니다.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@ghkdtlwns987/&quot; data-og-url=&quot;https://velog.io/@ghkdtlwns987/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blpGVY/hyQA1Grpfw/F6rKyhUzr1kWa9Mp3IZkm0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/uvCOX/hyQBhoY56y/QTj1l5MS8b5imZbFJ3x4Kk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420&quot;&gt;&lt;a href=&quot;https://velog.io/@ghkdtlwns987/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@ghkdtlwns987/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blpGVY/hyQA1Grpfw/F6rKyhUzr1kWa9Mp3IZkm0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/uvCOX/hyQBhoY56y/QTj1l5MS8b5imZbFJ3x4Kk/img.png?width=420&amp;amp;height=420&amp;amp;face=0_0_420_420');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ghkdtlwns987 (황시준) - velog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;포스트가 없습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번씩 놀러오세요~&lt;/p&gt;</description>
      <category>일상</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/151</guid>
      <comments>https://pwnable-study.tistory.com/151#entry151comment</comments>
      <pubDate>Wed, 16 Nov 2022 00:12:28 +0900</pubDate>
    </item>
    <item>
      <title>[안드로이드] drozer 설치</title>
      <link>https://pwnable-study.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;drozer 은 python2.7 버젼을 필요로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 기존에 python2.7 버젼이 설치되어있을 경우&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;59&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Ugv7/btq5n9ZAtAi/rWSHiHQrw1TIzHvB8yRJR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Ugv7/btq5n9ZAtAi/rWSHiHQrw1TIzHvB8yRJR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Ugv7/btq5n9ZAtAi/rWSHiHQrw1TIzHvB8yRJR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Ugv7%2Fbtq5n9ZAtAi%2FrWSHiHQrw1TIzHvB8yRJR1%2Fimg.png&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;59&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 에러가 뜬다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기에 난 python 가상 환경을 구축해 설치했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, virtualenv 가 설치 되어있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않다면 설치하자.&lt;/p&gt;
&lt;pre id=&quot;code_1621525829852&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ pip install virtualenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 되었다면&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1621525852317&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$virtualenv env&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 구축이 완료되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by7MWI/btq5gEl8Gfe/cdn6HkWNOYAsmkqKP6ZO6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by7MWI/btq5gEl8Gfe/cdn6HkWNOYAsmkqKP6ZO6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by7MWI/btq5gEl8Gfe/cdn6HkWNOYAsmkqKP6ZO6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby7MWI%2Fbtq5gEl8Gfe%2Fcdn6HkWNOYAsmkqKP6ZO6K%2Fimg.png&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;186&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python 가상 환경이 구축되었으니,&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1621526102951&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;37&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckdtww/btq5hlGCNJB/GGKpUq0Yt7yy0vJ2oZzXuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckdtww/btq5hlGCNJB/GGKpUq0Yt7yy0vJ2oZzXuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckdtww/btq5hlGCNJB/GGKpUq0Yt7yy0vJ2oZzXuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckdtww%2Fbtq5hlGCNJB%2FGGKpUq0Yt7yy0vJ2oZzXuK%2Fimg.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;37&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;actiavte 환경으로 진입 후 pip를 이용해 drozer 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1621525913475&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$pip install drozer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1686&quot; data-origin-height=&quot;508&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9jqQD/btq5nbDe96X/KBPzzz8MfIsQa0bJs1kKf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9jqQD/btq5nbDe96X/KBPzzz8MfIsQa0bJs1kKf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9jqQD/btq5nbDe96X/KBPzzz8MfIsQa0bJs1kKf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9jqQD%2Fbtq5nbDe96X%2FKBPzzz8MfIsQa0bJs1kKf0%2Fimg.png&quot; data-origin-width=&quot;1686&quot; data-origin-height=&quot;508&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 adb forward 를 통해 bridge 연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02zKE/btq5hlfBR5k/W77QhIfj0wOFTKuFcMQeRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02zKE/btq5hlfBR5k/W77QhIfj0wOFTKuFcMQeRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02zKE/btq5hlfBR5k/W77QhIfj0wOFTKuFcMQeRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02zKE%2Fbtq5hlfBR5k%2FW77QhIfj0wOFTKuFcMQeRk%2Fimg.png&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;131&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;drozer console connect 했더니 에러가 떳다 이제부턴 설치하란대로 하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;463&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btwvEh/btq5k0vdJFl/NVhfEOHZZQHbq9qaFQxyO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btwvEh/btq5k0vdJFl/NVhfEOHZZQHbq9qaFQxyO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btwvEh/btq5k0vdJFl/NVhfEOHZZQHbq9qaFQxyO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtwvEh%2Fbtq5k0vdJFl%2FNVhfEOHZZQHbq9qaFQxyO0%2Fimg.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;463&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Android</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/141</guid>
      <comments>https://pwnable-study.tistory.com/141#entry141comment</comments>
      <pubDate>Fri, 21 May 2021 00:57:44 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 그래프 1 (깊이 우선 탐색, 넓이 우선 탐색)</title>
      <link>https://pwnable-study.tistory.com/139</link>
      <description>&lt;p&gt;그래프에 대해 간단히 찍먹하는 느낌으로 알아보자.&lt;/p&gt;
&lt;p&gt;먼저, 그래프를 공부하는데 정점과 간선에 대해 알아야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHbpo/btq4HNhSLYC/XHw4hNMXe4gioRX8jkcdNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHbpo/btq4HNhSLYC/XHw4hNMXe4gioRX8jkcdNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHbpo/btq4HNhSLYC/XHw4hNMXe4gioRX8jkcdNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHbpo%2Fbtq4HNhSLYC%2FXHw4hNMXe4gioRX8jkcdNK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그림을 보면 알겠지만 정점은 노드 자체를 가리키고,&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;간선은 노드를 잇는 선을 간선 이라고 한다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예를 들면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zWMnS/btq4H9rtfYC/rOYlXUELuJMXUQoWlviRY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zWMnS/btq4H9rtfYC/rOYlXUELuJMXUQoWlviRY1/img.png&quot; data-alt=&quot;출처 : doopedia.co.kr&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zWMnS/btq4H9rtfYC/rOYlXUELuJMXUQoWlviRY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzWMnS%2Fbtq4H9rtfYC%2FrOYlXUELuJMXUQoWlviRY1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : doopedia.co.kr&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 그림은 일명 다리 문제라고 불리는데,&lt;/p&gt;
&lt;p&gt;여기서 A,B,C,D 는 정점이라 푸를 수 있고, 그 점들을 잇는 선을 간선이라 부를수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으론 방향 그래프와 무방향 그래프이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 방향 그래프는 정점과 간선 사이에 방향을 표시해 놓은 그래프이고&lt;/p&gt;
&lt;p&gt;무방향 그래프는 정점과 간선 사이를 그냥 연결만 되어 있다고 생각하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;표현 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;무방향 그래프&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;V(G1) = {0, 1, 2, 3}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;E(G1) = { (0,1), (0,3), (1,3), (2,3)}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;방향 그래프&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;V(G1) = {0,1,2,3}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;E(G1) = { &amp;lt;0,1&amp;gt; , &amp;lt;0,3&amp;gt; , &amp;lt;3,1&amp;gt; , &amp;lt;2,3&amp;gt; }&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으로는 정점의 차수를 구하는 방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저, &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;정점의 차수란 간선에 의해 연결된 정점의 수 이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이해를 돕기 위해 그림을 보여주고 넘어가겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BBRnG/btq4ygTUFri/ezJYTdjDUzYjUVHU1lM92K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BBRnG/btq4ygTUFri/ezJYTdjDUzYjUVHU1lM92K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BBRnG/btq4ygTUFri/ezJYTdjDUzYjUVHU1lM92K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBBRnG%2Fbtq4ygTUFri%2FezJYTdjDUzYjUVHU1lM92K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;또한, 각 정점의 차수의 합은 간선의 개수의 2배와 동일하다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으로는 단순 경로이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;단순 경로는 경로 중, 반복되는 간선이 없는 경우이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이것도 그림으로 보면 이해가 갈 것 이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wS8Gw/btq4HvogSVP/H7YQH4fAaFNTjcQo0tKdvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wS8Gw/btq4HvogSVP/H7YQH4fAaFNTjcQo0tKdvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wS8Gw/btq4HvogSVP/H7YQH4fAaFNTjcQo0tKdvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwS8Gw%2Fbtq4HvogSVP%2FH7YQH4fAaFNTjcQo0tKdvk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음은 연결 그래프와 완전 그래프에 대한 개념을&amp;nbsp; 알아보자.&lt;/p&gt;
&lt;p&gt;먼저 연결 그래프이다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;연결 그래프는 모든 정점쌍에 대해 항상 경로가 존재하는 그래프이다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그에비해 완전 그래프는&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그래프에 속해있는 모든 정점이 서로 연결되어 있는 그래프이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7gltv/btq4Dy7eq5L/qml4YvzdKT8DpnEaXVB39K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7gltv/btq4Dy7eq5L/qml4YvzdKT8DpnEaXVB39K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7gltv/btq4Dy7eq5L/qml4YvzdKT8DpnEaXVB39K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7gltv%2Fbtq4Dy7eq5L%2Fqml4YvzdKT8DpnEaXVB39K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;앞서 간단하게 그래프에 대해 알아보았으니, 오늘의 목표인 &lt;b&gt;깊이 우선 탐색(DFS)&lt;/b&gt;, 과&amp;nbsp;&lt;b&gt;넓이 우선 탐색(BFS)&lt;/b&gt; 를 알아보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;먼저 깊이 우선 탐색(DFS) 이다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;깊이 우선 탐색은 최대한 깊숙히 내려간 후, 더이상 갈 곳이 없을 경우 옆으로 이동하는 방식이다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJEvrn/btq4Ckat3AJ/ZkLQJXVvXoJrdLhc1rhhS0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJEvrn/btq4Ckat3AJ/ZkLQJXVvXoJrdLhc1rhhS0/img.gif&quot; data-alt=&quot;출처 https://developer-mac.tistory.com/64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJEvrn/btq4Ckat3AJ/ZkLQJXVvXoJrdLhc1rhhS0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bJEvrn/btq4Ckat3AJ/ZkLQJXVvXoJrdLhc1rhhS0/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 https://developer-mac.tistory.com/64&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;깊이 우선 탐색의 개념은 루트 노드나 부모 노드에서 시작해 다음 분기로 넘어가기 전에,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;해당 분기를 완벽하게 탐색&lt;/b&gt;하는 방식이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;즉, 한 분기만을 완벽하게 찾고, 만약 찾고자 하는 값이 없을 시, 바로 다음 분기의 자료들을 검색하는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;깊이 우선 탐색은 스택, 혹은 재귀함수로 구현한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으론 너비 우선 탐색이다.&lt;/p&gt;
&lt;p&gt;너비 우선 탐색은 최대한 넓게 이동하고, 더 이상 갈 수 없을 때 아래로 이동한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UH7P3/btq4CrU7VGh/cCRFzC4k5GAJDN0s11IaUk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UH7P3/btq4CrU7VGh/cCRFzC4k5GAJDN0s11IaUk/img.gif&quot; data-alt=&quot;출처 https://developer-mac.tistory.com/64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UH7P3/btq4CrU7VGh/cCRFzC4k5GAJDN0s11IaUk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/UH7P3/btq4CrU7VGh/cCRFzC4k5GAJDN0s11IaUk/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 https://developer-mac.tistory.com/64&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;너비 우선 탐색은 루트 노드나 부모 노드에서 시작해 인접한 노드를 먼저 탐색하는 방법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;주로 두 노드 사이의 최단 경로를 찾고 싶을 때 이 방법을 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;넓이 우선 탐색은 큐를 이용해 구현한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예를 들면 특정 값을 찾고자 할 때, 먼저 존재하는 노드들을 전체 검색하는 방식이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;깊이 우선 탐색과 넓이 우선 탐색의 시간복잡도는 모든 노드를 검색한다는 전제 하에 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;하지만 인접 리스트와 인접 행렬을 사용하는데 차이가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;N : 노드&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;E : 간선&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;인접 리스트 : O(N+E)&lt;br /&gt;인접 행렬 : O(N&amp;sup2;)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위와 같이 표현할 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>programming/자료구조</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/139</guid>
      <comments>https://pwnable-study.tistory.com/139#entry139comment</comments>
      <pubDate>Tue, 11 May 2021 17:18:15 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 허프만 코드</title>
      <link>https://pwnable-study.tistory.com/138</link>
      <description>&lt;p&gt;허프만 코드에 대해 알아보자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번 글은 허프만 코드를 주제로 했지만, 우선순위 큐(Priority Queue) 를 먼저 선행하고 와야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 허프만 코딩이 무엇인지 알아보자.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;허프만 코딩은 문자의 빈도 또는 확률정보를 압축하는 알고리즘이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;예를 들어 aaaabbbc 라는 문자가 있다고 가정했을 때,&lt;/p&gt;
&lt;p&gt;a = 4 , b = 3 , c = 1 로 표현하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이를 통해 빈도가 높은 문자(a) 빈도가 낮은 문자(c) 로 표현할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;여기서 a 에 111(2) 이란 값을 부여하고&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;b 와 c 는 111(2) 를 부여하면 중복되는 문제가 발생한다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;이는 복호화할 때 문제가 발생할 수도 있기 때문에, 값이 겹치면 안된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;허프만 코드를 만들기 위해선 다음과 같은 과정을 거쳐야 한다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 주어진 텍스트에서 각 문자의 출현 빈도수를 계산&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 각 문자의 빈도수를 이용해 허프만 트리를 생성해 각 문자에 이진코드를 부여&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. 주어진 텍스트의 각 문자를 코드로 변환해 압축된 텍스트를 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;글로 보는 것 보다는 직접 보는게 나을거 같아 바로 진행해 보겠다.&lt;/p&gt;
&lt;p&gt;만약 &lt;span style=&quot;color: #333333;&quot;&gt;aabzzzc &lt;/span&gt;를 예로 들어보겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw9xqa/btq4CsrNfVI/x3jkAcokTRdKQjTxBsots1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw9xqa/btq4CsrNfVI/x3jkAcokTRdKQjTxBsots1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw9xqa/btq4CsrNfVI/x3jkAcokTRdKQjTxBsots1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw9xqa%2Fbtq4CsrNfVI%2Fx3jkAcokTRdKQjTxBsots1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. 각 글자의 빈도수를 따져 순서를 정한다.&amp;nbsp; 난 (z , a , b, c) 순으로 정함&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 다음으로 빈도수가 적은 글자부터 부모노드를 만들어 나간다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. 노드를 잇는 선을 기준으로 왼쪽을 0, 오른쪽을 1로 정함 (반대로 설정 가능)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇다면&lt;/p&gt;
&lt;p&gt;&lt;b&gt;z 는 0(2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;a 는 10(2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;b는 110(2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;c는 111(2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;로 표현 할 수 있다.&lt;/p&gt;</description>
      <category>programming/자료구조</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/138</guid>
      <comments>https://pwnable-study.tistory.com/138#entry138comment</comments>
      <pubDate>Mon, 10 May 2021 20:56:00 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 우선순위 큐(Priority Queue)</title>
      <link>https://pwnable-study.tistory.com/137</link>
      <description>&lt;p&gt;우선순의 큐에 대해 알아보자.&lt;/p&gt;
&lt;p&gt;큐(Queue) 라고 하면 흔히 먼저 들어온게 먼저 나간다는(First in First out)구조이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;하지만 우선순위 큐(Priority Queue) 는 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나오는 것을 의미한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위 큐는 힙(Heap) 이라는 자료구조를 가지고 구현할 수 있다.&lt;/p&gt;
&lt;p&gt;우선순위 큐는 배열을 이용해 구현할 수 있고,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;연결리스트, 힙 기반 으로도 구현할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;들어가기 전 각 기반에 따른 시간 복잡도에 대해 알아보자.&lt;/p&gt;
&lt;p&gt;배열 기반 삽입 : O(n)&lt;/p&gt;
&lt;p&gt;배열 기반 삭제 : O(1)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;힙 기반 삽입 : O(log2n)&lt;/p&gt;
&lt;p&gt;힙 기반 삭제 : O(log2n)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럼 본격적으로 시작해 보겠다.&lt;/p&gt;
&lt;p&gt;힙(Heap) 은 완전 이진 트리를 배열로 만든 자료구조이다.&lt;/p&gt;
&lt;p&gt;이는 기존 트리와는 다르게 우선순위가 적용된다.&lt;/p&gt;
&lt;p&gt;우선순위는 프로그래머가 임의대로 조정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 1부터 10까지를 완전 이진 트리를 이용해 구현한다고 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFddva%2Fbtq4z12pcpa%2F4rBgjl19HBGfXiB4ZQ971K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;대충 이렇게 생겼다고 가정 하자.&lt;/p&gt;
&lt;p&gt;여기서 이진트리에서 삽입이 발생했을 때의 과정은 생략하고,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위가 적용된 상태에서 삽입과 삭제가 되는 과정을 설명하겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위는 최대 힙(max heap) 과 최소 힙(min heap)으로 구성할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저 최대 힙이란?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;부모 노드가 자식노드보다 값이 큰 완전 이진트리를 의미한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;모든 부모 노드가 자식보다 값이 커야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;최대힙의 루트 노드는 항상 최댓값을 가진다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;=&amp;gt; 루트 노드로 올라갈 수록 값이 커지는 구조이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;먼저, 최대 힙(max heap)는 어떻게 생겼는지 확인해 보도록 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NrTJo/btq4t5j4ypa/7U7jIH26lXPk2kMxNAUJ5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NrTJo/btq4t5j4ypa/7U7jIH26lXPk2kMxNAUJ5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NrTJo/btq4t5j4ypa/7U7jIH26lXPk2kMxNAUJ5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNrTJo%2Fbtq4t5j4ypa%2F7U7jIH26lXPk2kMxNAUJ5k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음을 보면 루트 노드(root node) 가 10으로 원소 중 가장 큰 값을 가지고 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;또한, 부모 노드는 자식 노드보다 값이 더 크다는 것 또한 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으로는 최소 힙(min heap) 은 최대 힙(max heap) 과는 정 반대로&lt;/p&gt;
&lt;p&gt;루트 노드와 부모 노드가 가장 작은 값을 지니게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;=&amp;gt; 루트 노드로 올라갈 수록 작은 수를 지니게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대충 그림을 그려보면&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fddva/btq4z12pcpa/4rBgjl19HBGfXiB4ZQ971K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFddva%2Fbtq4z12pcpa%2F4rBgjl19HBGfXiB4ZQ971K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이상으로 최대 힙과 최소 힙에 대해 알아보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음으론 만약 값이 삽입 되었으면 어떠한 형태로 삽입되는지 알아보자.&lt;/p&gt;
&lt;p&gt;최대 힙에서 20이 들어간다고 가정해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wr0mI/btq4t3s21Ve/EhOULkxEZJ2ja8YKQd4951/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wr0mI/btq4t3s21Ve/EhOULkxEZJ2ja8YKQd4951/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wr0mI/btq4t3s21Ve/EhOULkxEZJ2ja8YKQd4951/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwr0mI%2Fbtq4t3s21Ve%2FEhOULkxEZJ2ja8YKQd4951%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ahywa/btq4CDT6u9S/jMPu5OCw0hE7ERLq2tkBMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ahywa/btq4CDT6u9S/jMPu5OCw0hE7ERLq2tkBMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ahywa/btq4CDT6u9S/jMPu5OCw0hE7ERLq2tkBMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhywa%2Fbtq4CDT6u9S%2FjMPu5OCw0hE7ERLq2tkBMK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dq0aUH/btq4s219Gjl/iDDxXkUUXJDwjYc2vdJF70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dq0aUH/btq4s219Gjl/iDDxXkUUXJDwjYc2vdJF70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dq0aUH/btq4s219Gjl/iDDxXkUUXJDwjYc2vdJF70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq0aUH%2Fbtq4s219Gjl%2FiDDxXkUUXJDwjYc2vdJF70%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekPszk/btq4CskWJtG/VkxpYrX1Or0d36kM8AcN31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekPszk/btq4CskWJtG/VkxpYrX1Or0d36kM8AcN31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekPszk/btq4CskWJtG/VkxpYrX1Or0d36kM8AcN31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekPszk%2Fbtq4CskWJtG%2FVkxpYrX1Or0d36kM8AcN31%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음과 같이 변한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 최소 힙은 이와 반대라고 생각하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음은 삭제의 과정이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1~10 까지 존재하는 최대 힙(max heap) 에서 원소 1개를 삭제한다고 가정해 보자.&lt;/p&gt;
&lt;p&gt;여기서 삭제하는 것은 힙(heap) 에서 pop 한 것과 같다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;만약 위의 트리에서 1개를 pop 하게 되면 루트 노드(root node) 를 삭제하는 것과 동일하다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brx9XG/btq4ygZEqYg/OSvlJgpdGsdjjoqwQk89B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brx9XG/btq4ygZEqYg/OSvlJgpdGsdjjoqwQk89B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brx9XG/btq4ygZEqYg/OSvlJgpdGsdjjoqwQk89B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrx9XG%2Fbtq4ygZEqYg%2FOSvlJgpdGsdjjoqwQk89B0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bScLaV/btq4DhDgUs9/s3E3F5lYdmkOZwkeqkcl8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bScLaV/btq4DhDgUs9/s3E3F5lYdmkOZwkeqkcl8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bScLaV/btq4DhDgUs9/s3E3F5lYdmkOZwkeqkcl8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbScLaV%2Fbtq4DhDgUs9%2Fs3E3F5lYdmkOZwkeqkcl8K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRzN3f/btq4EsLgtbN/QsXkEckwwx0l2vYFhaHmBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRzN3f/btq4EsLgtbN/QsXkEckwwx0l2vYFhaHmBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRzN3f/btq4EsLgtbN/QsXkEckwwx0l2vYFhaHmBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRzN3f%2Fbtq4EsLgtbN%2FQsXkEckwwx0l2vYFhaHmBK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sngzU/btq4AtEsDKW/XbtxmVPBu59veDKMVNw73K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sngzU/btq4AtEsDKW/XbtxmVPBu59veDKMVNw73K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sngzU/btq4AtEsDKW/XbtxmVPBu59veDKMVNw73K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsngzU%2Fbtq4AtEsDKW%2FXbtxmVPBu59veDKMVNw73K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8Vui/btq4DiWujAz/PKHMf0ZDoAh6IwVxa4vRdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8Vui/btq4DiWujAz/PKHMf0ZDoAh6IwVxa4vRdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8Vui/btq4DiWujAz/PKHMf0ZDoAh6IwVxa4vRdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8Vui%2Fbtq4DiWujAz%2FPKHMf0ZDoAh6IwVxa4vRdk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;다음과 같이 정렬된다&lt;/p&gt;</description>
      <category>programming/자료구조</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/137</guid>
      <comments>https://pwnable-study.tistory.com/137#entry137comment</comments>
      <pubDate>Mon, 10 May 2021 20:18:31 +0900</pubDate>
    </item>
    <item>
      <title>[Heap Exploit Technique] fastbin_dup_into stack</title>
      <link>https://pwnable-study.tistory.com/87</link>
      <description>&lt;pre id=&quot;code_1612086039144&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//fastbin dup into stack
#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#include&amp;lt;unistd.h&amp;gt;

int main(){
        unsigned long long chunk_size = 0x21;
        unsigned long long * a = (unsigned long long*)malloc(8);
        unsigned long long * b = (unsigned long long*)malloc(8);

        printf(&quot;%p %p \n&quot;,a,b);

        free(b);
        free(a);

        unsigned long long * c = (unsigned long long*)malloc(8);
        printf(&quot;%p \n&quot;,c);

        *b = (unsigned long long)(((char *)&amp;amp;chunk_size) - sizeof(b));
        unsigned long long * d = (unsigned long long*) malloc(8);
        printf(&quot;addr : %p \n&quot;,d);
        printf(&quot;addr : %p \n&quot;,malloc(8));

        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;다음 코드를 보면 fastbin 에 속하는 chunk 2개 할당 후 해제(free)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그 이후 malloc() 으로 8byte allocate,&lt;/p&gt;
&lt;p&gt;이후 free() 시키게 되면 * c 는 fastbin 에 들어가게 된다.&lt;/p&gt;
&lt;p&gt;*c 의 주소는 *a 의 주소를 할당받는다. (LIFO구조이긱 때문)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 *b의 chunk_size - sizeof(b) 로 만들어 주는데,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;malloc() 요청시 요청한 size와 b-&amp;gt;fd 에 들어가는 (addr - 8byte) 위치의 size값이 같아야 하기 때문이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 *d 의 주소에 malloc(8) 을 하게 되면 *b 가 가리켰던 주소를 d에 할당받고,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또다시 malloc() 하게 되면 b의 fd에 스택영역의 주소를 쓸 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W69qY/btqVbvZ0mPg/3beqrSJroGPjoOfuxJJba0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W69qY/btqVbvZ0mPg/3beqrSJroGPjoOfuxJJba0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W69qY/btqVbvZ0mPg/3beqrSJroGPjoOfuxJJba0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW69qY%2FbtqVbvZ0mPg%2F3beqrSJroGPjoOfuxJJba0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Heap Exploitation</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/87</guid>
      <comments>https://pwnable-study.tistory.com/87#entry87comment</comments>
      <pubDate>Sun, 31 Jan 2021 18:58:50 +0900</pubDate>
    </item>
    <item>
      <title>[Heap Techniques] Heap Memory leak (Unsorted bin)(main_arena)</title>
      <link>https://pwnable-study.tistory.com/86</link>
      <description>&lt;p&gt;Heap 으로 Memory leak 하는 방법은 무엇일까?&lt;/p&gt;
&lt;p&gt;그 방법은 여러가지가 존재한다. (포인터에 특정 함수의 GOT 를 넣어 출력되게 하거나, File * 를 활용하거나... 등등)&lt;/p&gt;
&lt;p&gt;이번에 Heap Exploit 할때, 가장 많이 쓰이는 방법을 하나 소개하려 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;small bin 이나 large bin 을 해제하게 되면 unsorted bin 에 들어가게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;unsorted bin 에 들어가게 된 chunk 는 FD, BK 에 main_arena 의 주소가 들어가게 되는데,&lt;/p&gt;
&lt;p&gt;main_arena 는 libc.so.6 라이브러리에 존재하는 구조체이기 때문에, libc_leak 이 가능해 진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음은 드림핵에 나와있는 코드를 컴파일 했다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내가 보여줄 환경은 &lt;b&gt;glibc2.23 버젼이다. (glibc2.27 은 안됨)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1612080946247&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// gcc -o leak1 leak1.c
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
int main()
{
	char *ptr = malloc(0x100);
	char *ptr2 = malloc(0x100);
	free(ptr);
	ptr = malloc(0x100);
	printf(&quot;0x%lx\n&quot;, *(long long *)ptr);
	
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAbBYT/btqVbW349dd/0KPuFyTXMZmFgNIb6Rc2zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAbBYT/btqVbW349dd/0KPuFyTXMZmFgNIb6Rc2zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAbBYT/btqVbW349dd/0KPuFyTXMZmFgNIb6Rc2zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAbBYT%2FbtqVbW349dd%2F0KPuFyTXMZmFgNIb6Rc2zk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJLpO/btqVnW82Si7/F1qbxRnkK12eLmtObHWyjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJLpO/btqVnW82Si7/F1qbxRnkK12eLmtObHWyjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJLpO/btqVnW82Si7/F1qbxRnkK12eLmtObHWyjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJLpO%2FbtqVnW82Si7%2FF1qbxRnkK12eLmtObHWyjK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;한번 libc_base 를 구해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AVgyj/btqVcs9A0OM/WTUQzCSaCx1xHb1ekU8HIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AVgyj/btqVcs9A0OM/WTUQzCSaCx1xHb1ekU8HIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AVgyj/btqVcs9A0OM/WTUQzCSaCx1xHb1ekU8HIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAVgyj%2FbtqVcs9A0OM%2FWTUQzCSaCx1xHb1ekU8HIk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위와같이 출력이 되는 이유는 무엇일까&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;unsorted bin은 small bin 이나 large bin 이 free() 되었을 시 들어가게 되는 bin인데, 만약, fastbin 을 선언하지 않고,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;바로 small bin 이나 large bin을 선언하면 unsorted bin 의 fd,bk 는 main_arena + 88 이 들어가게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 코드는 small bin 크기의 heap을 할당하고 free() 해서 unsorted bin 에 heap chunk가 들어가는데,&lt;/p&gt;
&lt;p&gt;이때 헤제된 &lt;b&gt;ptr chunk의 FD, BK 영역에 main_arena 영역의 주소가 쓰이게 된다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;이후에 &lt;b&gt;unsorted bin 에 들어간&amp;nbsp; chunk의 크기보다 작거나 같은 크기의 chunk를 할당해 출력하면&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;main_arena 역역의 주소를 출력할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;-&amp;gt; 이렇게 되는 이유는 malloc() 할 때, 데이터 영역을 초기화하지 않기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 calloc() 과 같이 메모리를 할당하는 동시에 초기화하는 함수를 사용하면 위와같이 leak 하는 것은 안된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 나온 값을 가지고 offset 을 구하면 되는데,&lt;/p&gt;
&lt;p&gt;간혹 이 방법이 안통할 때가 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그럴땐 libc_base = unsorted bin_leak - libc.symbols['__malloc_hook'] - 0x10 이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;주소를 보면 main_arena + 88 에 위치한 추소는 malloc_hook + 0x10 에 존재하기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y1jpw/btqVcs9A2x5/eBIKpsq6zQiekapIhK68lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y1jpw/btqVcs9A2x5/eBIKpsq6zQiekapIhK68lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y1jpw/btqVcs9A2x5/eBIKpsq6zQiekapIhK68lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy1jpw%2FbtqVcs9A2x5%2FeBIKpsq6zQiekapIhK68lK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2EHG/btqVbW35bxx/ziVtPTeLILtbuTUZvyS5sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2EHG/btqVbW35bxx/ziVtPTeLILtbuTUZvyS5sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2EHG/btqVbW35bxx/ziVtPTeLILtbuTUZvyS5sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2EHG%2FbtqVbW35bxx%2FziVtPTeLILtbuTUZvyS5sk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;두 주소가 같은것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Heap Exploitation</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/86</guid>
      <comments>https://pwnable-study.tistory.com/86#entry86comment</comments>
      <pubDate>Sun, 31 Jan 2021 18:17:26 +0900</pubDate>
    </item>
    <item>
      <title>UAF vs Double free Bug간단 정리</title>
      <link>https://pwnable-study.tistory.com/83</link>
      <description>&lt;p&gt;UAF vs Double free Bug&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;UAF(Use After free) 는&amp;nbsp;&lt;/p&gt;
&lt;p&gt;malloc() 하고 free() 했을때 , 또다시 동일 size를 malloc() 하게 되면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기존에 존재하던 heap 영역을 재사용 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;근데 만약 heap 에 포인터가 존재한다면 그 포인터를 system() 과 같은 주소로 덮게 되면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;exploit 이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 UAF 는 glibc2.23 이상은 막혔다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Double free Bug&lt;/p&gt;
&lt;p&gt;DFB는 free() 를 연속으로 하게되면 발생하는 버그이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611898403683&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;free(ptr1)
free(ptr1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-&amp;gt; glibc 2.23 까지는 이와같이 free() 해도 무방했는데,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이제 더이상 위와같이 free()하게 되면 오류가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611898535963&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;free(ptr1)
free(ptr2)
free(ptr1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그래서 위와같이 free() 시켜주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DBF는 unlink 취약점과 관련이 있는데,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;fd + 12 -&amp;gt; bk 가 들어가고,&lt;/p&gt;
&lt;p&gt;bk + 8&amp;nbsp; -&amp;gt; fd 가 들어가게 되는데,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만약 fd의 위치에 function@got - 12 를 넣고&lt;/p&gt;
&lt;p&gt;bk 의 위치에 system@plt 를 넣으면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;exploit 이 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;혹은 heap overflow 가 가능할시,&lt;/p&gt;
&lt;p&gt;&lt;span&gt;P_flag&lt;/span&gt;&lt;span&gt;의&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;변경해서 &lt;/span&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;값과&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;prev_size&lt;/span&gt;&lt;span&gt;값을&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;수정해주고, size 값을 변경하게 되면&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;실제로 free() 하지 않았는데도, 컴퓨터가 free() 되었다고 착각하도록 만드는 것이다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;이렇게 착각하게 되면 unlink 매크로가 실행되면서 exploit 이 가능해 진다.&lt;/p&gt;</description>
      <category>Heap Exploitation</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/83</guid>
      <comments>https://pwnable-study.tistory.com/83#entry83comment</comments>
      <pubDate>Fri, 29 Jan 2021 14:49:51 +0900</pubDate>
    </item>
    <item>
      <title>[glibc2.23] Heap bins 정리 4 (largebin)</title>
      <link>https://pwnable-study.tistory.com/82</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;large bin&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;large bin 은 512 바이트 이상의 크기의 chunk가 해제 되었을 때 사용되는 bin이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;large bin 은 이중연결리스트를 사용하고, FIFO 구조를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;large bin 만의 특성이 있는데 이는 fd_nextsize , bk_nextsize 를 사용한다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611825379252&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     if (!in_smallbin_range (nb))		// large bin &amp;gt;= 512
        {
          bin = bin_at (av, idx);
          /* skip scan if empty or largest chunk is too small */
          if ((victim = first (bin)) != bin &amp;amp;&amp;amp;
              (unsigned long) (victim-&amp;gt;size) &amp;gt;= (unsigned long) (nb))
            {
              victim = victim-&amp;gt;bk_nextsize;
              while (((unsigned long) (size = chunksize (victim)) &amp;lt;
                      (unsigned long) (nb)))
                victim = victim-&amp;gt;bk_nextsize;
              /* Avoid removing the first entry for a size so that the skip
                 list does not have to be rerouted.  */
              if (victim != last (bin) &amp;amp;&amp;amp; victim-&amp;gt;size == victim-&amp;gt;fd-&amp;gt;size)
                victim = victim-&amp;gt;fd;
              remainder_size = size - nb;
              unlink (av, victim, bck, fwd);
              /* Exhaust */
              if (remainder_size &amp;lt; MINSIZE)
                {
                  set_inuse_bit_at_offset (victim, size);
                  if (av != &amp;amp;main_arena)
                    victim-&amp;gt;size |= NON_MAIN_ARENA;
                }
              /* Split */
              else
                {
                  remainder = chunk_at_offset (victim, nb);
                  /* We cannot assume the unsorted list is empty and therefore
                     have to perform a complete insert here.  */
                  bck = unsorted_chunks (av);
                  fwd = bck-&amp;gt;fd;
	  if (__glibc_unlikely (fwd-&amp;gt;bk != bck))
                    {
                      errstr = &quot;malloc(): corrupted unsorted chunks&quot;;
                      goto errout;
                    }
                  remainder-&amp;gt;bk = bck;
                  remainder-&amp;gt;fd = fwd;
                  bck-&amp;gt;fd = remainder;
                  fwd-&amp;gt;bk = remainder;
                  if (!in_smallbin_range (remainder_size))
                    {
                      remainder-&amp;gt;fd_nextsize = NULL;
                      remainder-&amp;gt;bk_nextsize = NULL;
                    }
                  set_head (victim, nb | PREV_INUSE |
                            (av != &amp;amp;main_arena ? NON_MAIN_ARENA : 0));
                  set_head (remainder, remainder_size | PREV_INUSE);
                  set_foot (remainder, remainder_size);
                }
              check_malloced_chunk (av, victim, nb);
              void *p = chunk2mem (victim);
              alloc_perturb (p, bytes);
              return p;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;맨 위부터 분석 해 보자면 large bin에 들어있는 크기인지 검사한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이후 large bin 이 비어있는지, 혹은 가장 큰 chunk가 요청했던 크기보다 큰지 검사한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611825619180&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (((unsigned long) (size = chunksize (victim)) &amp;lt; (unsigned long) (nb)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이후 위 반복문을 반복하면서 사용자의 요청에 부합하는 chunk를 찾는다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611825711052&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unlink (av, victim, bck, fwd);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;fd , bk 의 연결리스트를 유지하기 위해 unlink 함수가 쓰인다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611825784825&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  /* Exhaust */
              if (remainder_size &amp;lt; MINSIZE)
                {
                  set_inuse_bit_at_offset (victim, size);
                  if (av != &amp;amp;main_arena)
                    victim-&amp;gt;size |= NON_MAIN_ARENA;
                }
              /* Split */
              else
                {
                  remainder = chunk_at_offset (victim, nb);
                  /* We cannot assume the unsorted list is empty and therefore
                     have to perform a complete insert here.  */
                  bck = unsorted_chunks (av);
                  fwd = bck-&amp;gt;fd;
	  if (__glibc_unlikely (fwd-&amp;gt;bk != bck))
                    {
                      errstr = &quot;malloc(): corrupted unsorted chunks&quot;;
                      goto errout;
                    }
                  remainder-&amp;gt;bk = bck;
                  remainder-&amp;gt;fd = fwd;
                  bck-&amp;gt;fd = remainder;
                  fwd-&amp;gt;bk = remainder;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이후 large bin chunk 가 요청된 크기보다 큰 경우 remainder_size 를 검사해&amp;nbsp;&lt;/p&gt;
&lt;p&gt;MINSIZE 보다 크면 현재 chunk가 unsorted_chunk 에 들어가고&lt;/p&gt;
&lt;p&gt;fd_nextsize 와 bk_nextsize 를 NULL로 초기화 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1611825899180&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;                  set_head (victim, nb | PREV_INUSE |
                            (av != &amp;amp;main_arena ? NON_MAIN_ARENA : 0));
                  set_head (remainder, remainder_size | PREV_INUSE);
                  set_foot (remainder, remainder_size);
                }
              check_malloced_chunk (av, victim, nb);
              void *p = chunk2mem (victim);
              alloc_perturb (p, bytes);
              return p;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;마지막으로 반환될 chuhnk의 prev_inuse 비트를 설정하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;분활되어 남은 remainder chunk 또한 prev-inuse bit 를 설정해 현재 반환될 chunk가 할당되었다는 것을 나타낸다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Heap Exploitation</category>
      <author>2020/03/31</author>
      <guid isPermaLink="true">https://pwnable-study.tistory.com/82</guid>
      <comments>https://pwnable-study.tistory.com/82#entry82comment</comments>
      <pubDate>Thu, 28 Jan 2021 18:27:11 +0900</pubDate>
    </item>
  </channel>
</rss>