<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>arsenic 알쓰닉?</title>
    <link>https://arsenic-dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 13:35:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>arsenic-dev</managingEditor>
    <image>
      <title>arsenic 알쓰닉?</title>
      <url>https://tistory1.daumcdn.net/tistory/7294624/attach/56650978555f47af918fc5a8e3e47dfc</url>
      <link>https://arsenic-dev.tistory.com</link>
    </image>
    <item>
      <title>3D CAD 1차시: Fusion 360 간단한 기초 동작</title>
      <link>https://arsenic-dev.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;경희대학교 중앙동아리 쿠러그의 3D CAD 강의를 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Fusion 360이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치수 기반의 3D CAD 프로그램으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기구, 기계, 건축 등 설계 및 실제 제품 제작에 적합한 프로그램이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JjB2I/dJMcabYtYhq/2AVvAKUywJnK2vXhSlh6N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JjB2I/dJMcabYtYhq/2AVvAKUywJnK2vXhSlh6N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JjB2I/dJMcabYtYhq/2AVvAKUywJnK2vXhSlh6N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJjB2I%2FdJMcabYtYhq%2F2AVvAKUywJnK2vXhSlh6N1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1830&quot; height=&quot;1107&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1107&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;※ blender: 그래픽 작업을 위한 3D 프로그램으로 캐릭터, 애니메이션, 조형물 등 비정형 형상 모델링에 적합한 프로그램이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;0. 환경 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O3c5G/dJMcagk9KVu/D0xHKBRtDZnOi2wROK2IXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O3c5G/dJMcagk9KVu/D0xHKBRtDZnOi2wROK2IXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O3c5G/dJMcagk9KVu/D0xHKBRtDZnOi2wROK2IXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO3c5G%2FdJMcagk9KVu%2FD0xHKBRtDZnOi2wROK2IXk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1830&quot; height=&quot;1109&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pan, Zoom, Orbit shortcuts는 특별히 사용하는 3D tool이 있는 게 아니라면, Tinkercad로 설정하는 걸 추천한다.&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;※ Reverse zoom direction 체크 이유: 마우스 휠 위로 올릴 때 확대, 아래로 하면 축소 등 우리가 기본적으로 아는 방식으로 사용하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 스케치 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHEgf/dJMcadPsbmL/A84zTlKfQEkgfNQRb6ACdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHEgf/dJMcadPsbmL/A84zTlKfQEkgfNQRb6ACdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHEgf/dJMcadPsbmL/A84zTlKfQEkgfNQRb6ACdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHEgf%2FdJMcadPsbmL%2FA84zTlKfQEkgfNQRb6ACdk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1816&quot; height=&quot;1107&quot; data-origin-width=&quot;1816&quot; data-origin-height=&quot;1107&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 화면 조작&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brHLSN/dJMcadom4Fw/9KFaBiFmAohOTj5X7b3vm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brHLSN/dJMcadom4Fw/9KFaBiFmAohOTj5X7b3vm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brHLSN/dJMcadom4Fw/9KFaBiFmAohOTj5X7b3vm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrHLSN%2FdJMcadom4Fw%2F9KFaBiFmAohOTj5X7b3vm0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1820&quot; height=&quot;1109&quot; data-origin-width=&quot;1820&quot; data-origin-height=&quot;1109&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 스케치 인터페이스&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czItod/dJMcaaSOinL/tEF2zVCqcDK7dlkurugBr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czItod/dJMcaaSOinL/tEF2zVCqcDK7dlkurugBr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czItod/dJMcaaSOinL/tEF2zVCqcDK7dlkurugBr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczItod%2FdJMcaaSOinL%2FtEF2zVCqcDK7dlkurugBr1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;1100&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1100&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b41pJi/dJMcahxC3Rw/YkqFGJKIdFN4OawJSgeyxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b41pJi/dJMcahxC3Rw/YkqFGJKIdFN4OawJSgeyxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b41pJi/dJMcahxC3Rw/YkqFGJKIdFN4OawJSgeyxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb41pJi%2FdJMcahxC3Rw%2FYkqFGJKIdFN4OawJSgeyxk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;1100&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선 그리기 상태에서 delete를 누르면 선 그리기 도구가 해제되는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 구속을 원하는 선을 누른 후 D를 누르면 구속 설정이 가능하다.&amp;nbsp;&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;또한, 구속된 선을 delete로 해제하면 점을 잡고 자유자재로 길이 조절이 가능하다. (구속 설정을 한 경우, 임의로 길이 조절 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1825&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLHBnN/dJMcaf7DvRR/CcDzlkjkpkW1Sc7Lj4gyc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLHBnN/dJMcaf7DvRR/CcDzlkjkpkW1Sc7Lj4gyc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLHBnN/dJMcaf7DvRR/CcDzlkjkpkW1Sc7Lj4gyc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLHBnN%2FdJMcaf7DvRR%2FCcDzlkjkpkW1Sc7Lj4gyc0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1825&quot; height=&quot;1107&quot; data-origin-width=&quot;1825&quot; data-origin-height=&quot;1107&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 사각형 도구&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1828&quot; data-origin-height=&quot;1113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bepada/dJMcaciKXv4/1zR7fcoKBMHX2ZHB6JGOhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bepada/dJMcaciKXv4/1zR7fcoKBMHX2ZHB6JGOhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bepada/dJMcaciKXv4/1zR7fcoKBMHX2ZHB6JGOhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbepada%2FdJMcaciKXv4%2F1zR7fcoKBMHX2ZHB6JGOhK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1828&quot; height=&quot;1113&quot; data-origin-width=&quot;1828&quot; data-origin-height=&quot;1113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사각형의 경우 3점 사각형, 2점 사각형 등이 선택 가능하다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 요소 선택&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq2dU7/dJMcagS26JN/5Ju5Va3YnMboTFS8wZKQSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq2dU7/dJMcagS26JN/5Ju5Va3YnMboTFS8wZKQSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq2dU7/dJMcagS26JN/5Ju5Va3YnMboTFS8wZKQSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq2dU7%2FdJMcagS26JN%2F5Ju5Va3YnMboTFS8wZKQSK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1818&quot; height=&quot;1107&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1107&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vS1gq/dJMcagerwBM/7qzqpsVPQecenHjo9adwaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vS1gq/dJMcagerwBM/7qzqpsVPQecenHjo9adwaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vS1gq/dJMcagerwBM/7qzqpsVPQecenHjo9adwaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvS1gq%2FdJMcagerwBM%2F7qzqpsVPQecenHjo9adwaK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1818&quot; height=&quot;1100&quot; data-origin-width=&quot;1818&quot; data-origin-height=&quot;1100&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;드래그 or ctrl 을 통해 도형에 포함된 선을 모두 잡고 도형에 포함된 점 하나를 누른 상태로 이동하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;실습 과제&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 직사각형 구속 조건 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzO05p/dJMcahYHCos/b12SOQM4MnemKmLd8kt8eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzO05p/dJMcahYHCos/b12SOQM4MnemKmLd8kt8eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzO05p/dJMcahYHCos/b12SOQM4MnemKmLd8kt8eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzO05p%2FdJMcahYHCos%2Fb12SOQM4MnemKmLd8kt8eK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;493&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;493&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 각도 구속&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;941&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ETop7/dJMcadWhrbp/CG1cVgXCYyDaK8MGidxxU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ETop7/dJMcadWhrbp/CG1cVgXCYyDaK8MGidxxU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ETop7/dJMcadWhrbp/CG1cVgXCYyDaK8MGidxxU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FETop7%2FdJMcadWhrbp%2FCG1cVgXCYyDaK8MGidxxU1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1233&quot; height=&quot;941&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 직선 사이의 각도 구속 조건을 넣고 싶을 때는 두 직선을 선택후 D를 누르면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참고자료&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. 오토데스크 교육용 플랜: 계정 생성 및 자격 확인 (자격 확인되면 1년간 사용 가능, 자격 유지되는 한 갱신 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zRhjGPa9uj8&quot;&gt;https://www.youtube.com/watch?v=zRhjGPa9uj8&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=zRhjGPa9uj8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bt9xF9/dJMb87N1us4/oedKYc4DGfE1GCV9oTKfQK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177,https://scrap.kakaocdn.net/dn/C9MXd/dJMb8VNAqlX/S4k9hZe1CFKZzcdKHMXjM0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177,https://scrap.kakaocdn.net/dn/dzcvJo/dJMb8Qeq368/vfKwMGMdP0JRECNkKw9aBK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;오토데스크 교육용 플랜: 계정 생성 및 자격 확인.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zRhjGPa9uj8&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&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;span style=&quot;color: #666666;&quot;&gt;2. 오토데스크 교육용 플랜: 제품 받기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=grAb6w6XK6o&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=grAb6w6XK6o&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=grAb6w6XK6o&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/hmelR/dJMb8T94aCZ/W0BvKG20PRFb0GHtOgmAPK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=98_80_161_149,https://scrap.kakaocdn.net/dn/rKfPL/dJMb8Xkj0Mc/HXKIss3thPFAkY0VvOBFU0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=98_80_161_149,https://scrap.kakaocdn.net/dn/j1bHy/dJMb8YXQcvw/5pxdGw0M8tyKYY4psNkmCk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=98_80_161_149&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;오토데스크 교육용 플랜: 제품 받기.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/grAb6w6XK6o&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&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;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=zRhjGPa9uj8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cSwvBT/dJMb83Snx0l/4kQuDuJqUuVGMxlc0ZGRT0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177,https://scrap.kakaocdn.net/dn/bcpMex/dJMb89yic6b/WNm7TVuhZhaHTE8SPkoQxk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177,https://scrap.kakaocdn.net/dn/ClXQX/dJMb887drhh/FnSITQWVJy4ZMMULJb5Hgk/img.jpg?width=480&amp;amp;height=360&amp;amp;face=24_132_65_177&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;오토데스크 교육용 플랜: 계정 생성 및 자격 확인.&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zRhjGPa9uj8&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>3D CAD/Fusion 360</category>
      <category>3D</category>
      <category>autodesk</category>
      <category>cad</category>
      <category>Fusion 360</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/123</guid>
      <comments>https://arsenic-dev.tistory.com/123#entry123comment</comments>
      <pubDate>Thu, 14 May 2026 07:15:28 +0900</pubDate>
    </item>
    <item>
      <title>Chapter 9: Heaps, Priority Queues, and Graphs</title>
      <link>https://arsenic-dev.tistory.com/122</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 박제만 교수님의 자료구조 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Heap&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A heap is a &lt;u&gt;binary tree&lt;/u&gt; that satisfies these special &lt;u&gt;SHAPE&lt;/u&gt; and &lt;u&gt;ORDER&lt;/u&gt; properties:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;Shape&lt;/u&gt;: Heaps' shape must be a &lt;u&gt;complete binary tree&lt;/u&gt;. (위쪽, 왼쪽부터 채움)&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Order&lt;/u&gt;: &lt;u&gt;Parents value &amp;gt; Child values&lt;/u&gt; (&lt;u&gt;MAX heap&lt;/u&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mL0L0/dJMcafylQ6v/CwUM1vH8s5Qe9MqSKDkvV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mL0L0/dJMcafylQ6v/CwUM1vH8s5Qe9MqSKDkvV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mL0L0/dJMcafylQ6v/CwUM1vH8s5Qe9MqSKDkvV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmL0L0%2FdJMcafylQ6v%2FCwUM1vH8s5Qe9MqSKDkvV0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;449&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Heap Example&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;Largest (Smallest) Value in a Heap -&amp;gt; root&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BST와 Heap은 비슷한 듯 다르니, 구분할 수 있어야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Heap: 부모 &amp;gt;= 자식&lt;/li&gt;
&lt;li&gt;BST: 왼쪽 서브트리 &amp;lt;&amp;nbsp; 노드 &amp;lt; 오른쪽 서브트리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ MAX heap &amp;lt;-&amp;gt; MIN heap&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xxTHy/dJMcafLS8ID/hak5pWJ548UkBxKBuOukok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xxTHy/dJMcafLS8ID/hak5pWJ548UkBxKBuOukok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xxTHy/dJMcafLS8ID/hak5pWJ548UkBxKBuOukok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxxTHy%2FdJMcafLS8ID%2Fhak5pWJ548UkBxKBuOukok%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1265&quot; height=&quot;484&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Array Representation of Heaps&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;complete binary tree&lt;/u&gt; -&amp;gt; array! (minimized empty space)&lt;/li&gt;
&lt;li&gt;&lt;u&gt;위에서 아래로, 왼쪽에서 오른쪽으로 번호를 붙임&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;array이기에 linked structure로 구현한 것에 비해 확장성이 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Heap Operations&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Insert a New Node&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byzVJe/dJMcafkOVfy/gQe5Og2DVwWImhxXBcCTm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byzVJe/dJMcafkOVfy/gQe5Og2DVwWImhxXBcCTm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byzVJe/dJMcafkOVfy/gQe5Og2DVwWImhxXBcCTm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyzVJe%2FdJMcafkOVfy%2FgQe5Og2DVwWImhxXBcCTm1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;474&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clc5Ec/dJMcaiPkUaU/0NAUjGymvwtwdcOjyOazD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clc5Ec/dJMcaiPkUaU/0NAUjGymvwtwdcOjyOazD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clc5Ec/dJMcaiPkUaU/0NAUjGymvwtwdcOjyOazD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclc5Ec%2FdJMcaiPkUaU%2F0NAUjGymvwtwdcOjyOazD1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;502&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds7dON/dJMcagD2TNB/quFogueq9XbIDS7KmR8dYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds7dON/dJMcagD2TNB/quFogueq9XbIDS7KmR8dYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds7dON/dJMcagD2TNB/quFogueq9XbIDS7KmR8dYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds7dON%2FdJMcagD2TNB%2FquFogueq9XbIDS7KmR8dYk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;511&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Quj8g/dJMcahJIssS/sUOeMDoeBFW9zvaSigMcU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Quj8g/dJMcahJIssS/sUOeMDoeBFW9zvaSigMcU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Quj8g/dJMcahJIssS/sUOeMDoeBFW9zvaSigMcU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQuj8g%2FdJMcahJIssS%2FsUOeMDoeBFW9zvaSigMcU0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;514&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c12cwX/dJMcagjIQxB/itl2kXyrTYPFbJbRkeR1tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c12cwX/dJMcagjIQxB/itl2kXyrTYPFbJbRkeR1tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c12cwX/dJMcagjIQxB/itl2kXyrTYPFbJbRkeR1tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc12cwX%2FdJMcagjIQxB%2Fitl2kXyrTYPFbJbRkeR1tk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;526&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0US7Z/dJMcabiqktH/7zGYqfjTlDAyqre1DvMSU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0US7Z/dJMcabiqktH/7zGYqfjTlDAyqre1DvMSU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0US7Z/dJMcabiqktH/7zGYqfjTlDAyqre1DvMSU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0US7Z%2FdJMcabiqktH%2F7zGYqfjTlDAyqre1DvMSU0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;507&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Logical Level - insertItem(65)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. Insert the new element in the &lt;u&gt;next bottome leftmost place&lt;/u&gt; -&amp;gt; shape 만족&lt;/li&gt;
&lt;li&gt;2. Fix the heap property by calling &lt;u&gt;ReheapUp&lt;/u&gt; -&amp;gt; order 만
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;u&gt;If heap property is violated (chile&amp;gt; parent) -&amp;gt; Swap nodes&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QxpvX/dJMcacVVxfD/NaecpAe2YkEugalEELaQW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QxpvX/dJMcacVVxfD/NaecpAe2YkEugalEELaQW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QxpvX/dJMcacVVxfD/NaecpAe2YkEugalEELaQW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQxpvX%2FdJMcacVVxfD%2FNaecpAe2YkEugalEELaQW1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;416&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ reheapUp() - Implementation Level&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;root: root의 idx&lt;/li&gt;
&lt;li&gt;boottom_id: 현재 비교하는 값의 idx&lt;/li&gt;
&lt;/ul&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;u&gt;Why Do We Need a Heap?&lt;/u&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;find max (or min) in root&lt;/u&gt; -&amp;gt; &lt;u&gt;O(1)&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;e.g., &lt;u&gt;priority queue&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 메모리 공간 heap 과는 아무런 상관이 없다. (just 이름만 같음)&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;※ priority_dequeue()&lt;/p&gt;
&lt;pre id=&quot;code_1765381727114&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template&amp;lt;class ItemType&amp;gt;
bool QueueType&amp;lt;ItemType&amp;gt;::priority_dequeue(ItemType&amp;amp; ret) { // 원형큐의 경우 에러 발생 시 -&amp;gt; % maxQueue 했는지 확인
    if(isEmpty()){
        cout &amp;lt;&amp;lt; &quot;[ERROR] Queue is Empty. Dequeue Failed.&quot; &amp;lt;&amp;lt; endl;
        return false;
    }
    
    int i = front;
    int min_index = (front + 1) % maxQueue; // front는 reserved_space이기에 + 1 해야 첫 번째 값임
    do {
        i = (i + 1) % maxQueue;
        if (data[min_index].priority &amp;gt; data[i].priority) {
            min_index = i;
        }
    } while (i != rear);

    ret = data[min_index];

    i = min_index;
    while (i != rear) {
        data[i] = data[(i + 1) % maxQueue];
        i = (i + 1) % maxQueue;
    }

    rear = (rear - 1 + maxQueue) % maxQueue; // 음수될 위험 방지
    
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Priority Queue&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A priority queue is an ADT with the property that only the &lt;u&gt;highest-priority element&lt;/u&gt; can be accessed at any time.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g., CPU task queue
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;For tasks that &lt;u&gt;require immediate processing&lt;/u&gt; (important interrupts) we can assign &lt;u&gt;higher priorities&lt;/u&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DTdwl/dJMcacn5XR3/xsWkXXe9vZ6hOHJpEHY120/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DTdwl/dJMcacn5XR3/xsWkXXe9vZ6hOHJpEHY120/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DTdwl/dJMcacn5XR3/xsWkXXe9vZ6hOHJpEHY120/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDTdwl%2FdJMcacn5XR3%2FxsWkXXe9vZ6hOHJpEHY120%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;162&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Priority Queue using a Array&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;time complexity to find a task with the highest priority: O(N)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Can we make it better?&lt;/span&gt;&lt;/blockquote&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;u&gt;Yes, use Heap!&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbMQW/dJMcaaX7nmH/nLElr4A0HQlkCxVN4y7y00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbMQW/dJMcaaX7nmH/nLElr4A0HQlkCxVN4y7y00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbMQW/dJMcaaX7nmH/nLElr4A0HQlkCxVN4y7y00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtbMQW%2FdJMcaaX7nmH%2FnLElr4A0HQlkCxVN4y7y00%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;486&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Priority Queue using a Heap&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;time complexity to find a task with the highest priority: O(1)&lt;/li&gt;
&lt;/ul&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;b&gt;Get (remove) a Largest Value&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mztlp/dJMcahppFM3/I7syN3n2eXJu5sjvgkLvj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mztlp/dJMcahppFM3/I7syN3n2eXJu5sjvgkLvj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mztlp/dJMcahppFM3/I7syN3n2eXJu5sjvgkLvj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmztlp%2FdJMcahppFM3%2FI7syN3n2eXJu5sjvgkLvj0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;495&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcKO38/dJMcajgoSAY/HswsdSZ5Wr9D5Lk58cDZbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcKO38/dJMcajgoSAY/HswsdSZ5Wr9D5Lk58cDZbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcKO38/dJMcajgoSAY/HswsdSZ5Wr9D5Lk58cDZbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcKO38%2FdJMcajgoSAY%2FHswsdSZ5Wr9D5Lk58cDZbK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;490&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVRkfC/dJMcaaw22dS/FoOF3pbO2mp0Bwlt9QVvu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVRkfC/dJMcaaw22dS/FoOF3pbO2mp0Bwlt9QVvu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVRkfC/dJMcaaw22dS/FoOF3pbO2mp0Bwlt9QVvu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVRkfC%2FdJMcaaw22dS%2FFoOF3pbO2mp0Bwlt9QVvu0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;488&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUd3Y3/dJMcahJIt4l/gJsRCHVGxu20oVQvLhVTWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUd3Y3/dJMcahJIt4l/gJsRCHVGxu20oVQvLhVTWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUd3Y3/dJMcahJIt4l/gJsRCHVGxu20oVQvLhVTWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUd3Y3%2FdJMcahJIt4l%2FgJsRCHVGxu20oVQvLhVTWk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1251&quot; height=&quot;495&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oJith/dJMcahbRC3N/ntEU9lmZirglTHIvJy5yBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oJith/dJMcahbRC3N/ntEU9lmZirglTHIvJy5yBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oJith/dJMcahbRC3N/ntEU9lmZirglTHIvJy5yBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoJith%2FdJMcahbRC3N%2FntEU9lmZirglTHIvJy5yBk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;476&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcLGhc/dJMcaaqhmpU/mV7XguJEKdk6RKTjfy8gEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcLGhc/dJMcaaqhmpU/mV7XguJEKdk6RKTjfy8gEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcLGhc/dJMcaaqhmpU/mV7XguJEKdk6RKTjfy8gEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcLGhc%2FdJMcaaqhmpU%2FmV7XguJEKdk6RKTjfy8gEk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1246&quot; height=&quot;493&quot; data-origin-width=&quot;1246&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mqlgi/dJMcagKNuGT/9c9YT3zjCWicEZd0ArQOj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mqlgi/dJMcagKNuGT/9c9YT3zjCWicEZd0ArQOj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mqlgi/dJMcagKNuGT/9c9YT3zjCWicEZd0ArQOj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqlgi%2FdJMcagKNuGT%2F9c9YT3zjCWicEZd0ArQOj0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;488&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Logical Level&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. &lt;u&gt;Copy&lt;/u&gt; the &lt;u&gt;bottom rightmost item&lt;/u&gt; to the &lt;u&gt;root&lt;/u&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;2. &lt;u&gt;Delete&lt;/u&gt; the &lt;u&gt;bottom rightmost node&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;3. Fix the heap property by calling &lt;u&gt;ReheapDown&lt;/u&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Swap nodes if child &amp;gt; parent&lt;/li&gt;
&lt;li&gt;Compare with the lager child node (MAX heap)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wKBkV/dJMcaiPkV4z/mIKTITIrARaBtFxKBjtgY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wKBkV/dJMcaiPkV4z/mIKTITIrARaBtFxKBjtgY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wKBkV/dJMcaiPkV4z/mIKTITIrARaBtFxKBjtgY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwKBkV%2FdJMcaiPkV4z%2FmIKTITIrARaBtFxKBjtgY1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;670&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ reheapDown() - Implementation Level&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eztmk/dJMcachj7iC/z8w2Uk4hgq6cNLmj2AwrOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eztmk/dJMcachj7iC/z8w2Uk4hgq6cNLmj2AwrOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eztmk/dJMcachj7iC/z8w2Uk4hgq6cNLmj2AwrOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEztmk%2FdJMcachj7iC%2Fz8w2Uk4hgq6cNLmj2AwrOk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;635&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ PQType Definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3BKUL/dJMcadgbtzN/QhUgGsu0tiVZK1JKeJsJvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3BKUL/dJMcadgbtzN/QhUgGsu0tiVZK1JKeJsJvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3BKUL/dJMcadgbtzN/QhUgGsu0tiVZK1JKeJsJvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3BKUL%2FdJMcadgbtzN%2FQhUgGsu0tiVZK1JKeJsJvk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;341&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ HeapType Definition&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;items:&amp;nbsp; 힙이 아이템을 보관하는 array&lt;/li&gt;
&lt;li&gt;num_items: 아이템의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pw8kz/dJMcab3M5DC/2V43Qt31QKf3jhjlmdGVuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pw8kz/dJMcab3M5DC/2V43Qt31QKf3jhjlmdGVuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pw8kz/dJMcab3M5DC/2V43Qt31QKf3jhjlmdGVuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPw8kz%2FdJMcab3M5DC%2F2V43Qt31QKf3jhjlmdGVuk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;222&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Constructor&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIzP7g/dJMcafLTauK/9XhKZuXJknXP8Uql83UoOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIzP7g/dJMcafLTauK/9XhKZuXJknXP8Uql83UoOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIzP7g/dJMcafLTauK/9XhKZuXJknXP8Uql83UoOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIzP7g%2FdJMcafLTauK%2F9XhKZuXJknXP8Uql83UoOk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;379&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ destructor &amp;amp; clear()&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba0mGZ/dJMcaaX7nSP/vHlx6qeYbckPsuRnZ3kr31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba0mGZ/dJMcaaX7nSP/vHlx6qeYbckPsuRnZ3kr31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba0mGZ/dJMcaaX7nSP/vHlx6qeYbckPsuRnZ3kr31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba0mGZ%2FdJMcaaX7nSP%2FvHlx6qeYbckPsuRnZ3kr31%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;350&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ enqueue()&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baSgN5/dJMcacVVzvM/VFFtL1tcDBmfvA6kJBKoh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baSgN5/dJMcacVVzvM/VFFtL1tcDBmfvA6kJBKoh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baSgN5/dJMcacVVzvM/VFFtL1tcDBmfvA6kJBKoh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaSgN5%2FdJMcacVVzvM%2FVFFtL1tcDBmfvA6kJBKoh1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;383&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ dequeue()&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;b&gt;Big-O comparison&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmTIt5/dJMcacIpbhn/iSeCWO22hkGqgSp7kdJ7ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmTIt5/dJMcacIpbhn/iSeCWO22hkGqgSp7kdJ7ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmTIt5/dJMcacIpbhn/iSeCWO22hkGqgSp7kdJ7ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmTIt5%2FdJMcacIpbhn%2FiSeCWO22hkGqgSp7kdJ7ek%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;304&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;304&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;BST는 높이가 랜덤하지만, heap은 완전 이진 트리로 높이가 log N 으로 고정이기에 위와 같은 결과가 나오는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;heap의 enqueue는 reheapUp, dequeue는 reheapDown임&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Sorted list의 경우는 array/linked structure, 오름차순/내림차순, 이렇게 4가지 경우의 수가 나올 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;enqueue: 모두 O(N)&lt;/li&gt;
&lt;li&gt;dequeue
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;array: 오름차순의 경우 O(1), 내림차순의 경우 O(N)&lt;/li&gt;
&lt;li&gt;linked structure: 오름차순의 경우 O(N), 내림차순의 경우 O(1)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;이때, &lt;/span&gt;enqueue는 특정 item의 위치를 찾아 삽입하는 것이지만, dequeue는 맨 앞(max)의 값을 찾을 필요 없이 제거하니 주의한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또한, array의 경우 제거하거나 삽입할 때 한 칸씩 앞으로 당기거나 뒤로 미는 행위를 해야되니 주의해야 한다.&lt;/span&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;linked structure로 heap 구현 -&amp;gt; 시간복잡도 및 코드 알아야 함!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Graph&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0iwyb/dJMb995Y7D3/XQ8cBKmaXqbtjrj3O02kk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0iwyb/dJMb995Y7D3/XQ8cBKmaXqbtjrj3O02kk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0iwyb/dJMb995Y7D3/XQ8cBKmaXqbtjrj3O02kk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0iwyb%2FdJMb995Y7D3%2FXQ8cBKmaXqbtjrj3O02kk0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1257&quot; height=&quot;430&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Graph&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;A data structure that consists of a set of &lt;u&gt;nodes (vertices)&lt;/u&gt; and a set of &lt;u&gt;edges&lt;/u&gt; that relate the nodes to each other.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THe set of &lt;u&gt;edges&lt;/u&gt; describes r&lt;u&gt;elationships among the vertices&lt;/u&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;b&gt;Formal Definition&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A graph G is defined as floolows:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;G = (V, E)&lt;/u&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;u&gt;V(G)&lt;/u&gt;: 한 개 이상의 유한한 개수의 노드 집합&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;E(G)&lt;/u&gt;: a sef of &lt;u&gt;edges (pairs of veritces)&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XlvwK/dJMcagD25Fm/gg5WGl7Xt48eiPkFuXtXs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XlvwK/dJMcagD25Fm/gg5WGl7Xt48eiPkFuXtXs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XlvwK/dJMcagD25Fm/gg5WGl7Xt48eiPkFuXtXs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXlvwK%2FdJMcagD25Fm%2Fgg5WGl7Xt48eiPkFuXtXs1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;406&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Undirected Graph&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the edges in a graph have no direction&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/basNkD/dJMcagjI14j/VRDU4XEig7EcDcAYctw431/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/basNkD/dJMcagjI14j/VRDU4XEig7EcDcAYctw431/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/basNkD/dJMcagjI14j/VRDU4XEig7EcDcAYctw431/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbasNkD%2FdJMcagjI14j%2FVRDU4XEig7EcDcAYctw431%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;402&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Directed Graph&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;the edges in a graph have direction&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Directed Graph에서 E(G)를 정의할 때는 &lt;u&gt;vertices의 순서가 중요&lt;/u&gt;하니 주의하여야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;출발 -&amp;gt; 도착&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uyFil/dJMcacn561j/uBDaffOuOWMPcmUQCUpn5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uyFil/dJMcacn561j/uBDaffOuOWMPcmUQCUpn5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uyFil/dJMcacn561j/uBDaffOuOWMPcmUQCUpn5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuyFil%2FdJMcacn561j%2FuBDaffOuOWMPcmUQCUpn5K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;484&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Tree&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;Trees are special cases of graphs.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Acyclic structure: 자기로부터 시작해서 다른 점을 돌아 자기 자신에게 돌아오는 것이 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Terms&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;Adjacent nodes&lt;/u&gt;: 인접한 노드 (edge로 연결된 노드)&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Path&lt;/u&gt;: 특정 노드로부터 다른 특정한 노드까지 이동할 때 지나가는 노드들의 순서&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Complete graph&lt;/u&gt;: a graph in which every vertex is directly connected to every other vertex&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ7MHp/dJMcagD25T0/7ChGqMkY5ijvW6xIQoyedK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ7MHp/dJMcagD25T0/7ChGqMkY5ijvW6xIQoyedK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ7MHp/dJMcagD25T0/7ChGqMkY5ijvW6xIQoyedK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ7MHp%2FdJMcagD25T0%2F7ChGqMkY5ijvW6xIQoyedK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;320&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶ Complete Directed Graph&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 노드들끼리 직접적으로 연결되어 있어야 함&lt;/li&gt;
&lt;/ul&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;What is the number of edges in a complete directed graph with N vertices?&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;N * (N-1)&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;nP2: 시작 정점 N가지 * 도착 정점은 자기 자신을 뺀 N-1가지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;-&amp;gt; 공간 복잡도: O(N^2)&lt;/u&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;※ Big-O는 Upper Bound의 개념으로, 가장 최악의 상황을 감안했을 때의 estimate를 표현해준다. 그리고 이를 시간에 적용하면 시간 복잡도 혹은 메모리를 얼마나 사용하는지를 나타내기 위해 메모리에 적용하면 공간(space) 복잡도가 되는 것이다. 즉, &quot;Big-O = 시간 복잡도&quot;는 아니니 주의하여야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QaCfv/dJMcagxga7U/uw9074uIBvgVbI9ELHAimk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QaCfv/dJMcagxga7U/uw9074uIBvgVbI9ELHAimk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QaCfv/dJMcagxga7U/uw9074uIBvgVbI9ELHAimk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQaCfv%2FdJMcagxga7U%2Fuw9074uIBvgVbI9ELHAimk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;441&quot; height=&quot;369&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Complete Undirected Graph&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 노드들끼리 직접적으로 연결되어 있어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;What is the number of edges in a complete undirected graph with N vertices?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;N * (N-1) / 2&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;nC2&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;-&amp;gt; 공간 복잡도: O(N^2)&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HkXCI/dJMcaiBNGLl/OG4ADEp5UAe3Bum9VFLOj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HkXCI/dJMcaiBNGLl/OG4ADEp5UAe3Bum9VFLOj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HkXCI/dJMcaiBNGLl/OG4ADEp5UAe3Bum9VFLOj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHkXCI%2FdJMcaiBNGLl%2FOG4ADEp5UAe3Bum9VFLOj0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;416&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Weighted Graph&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;each edge carries a value&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;graph는 네트워크나 인공지능을 나타내어 분석하는 데에 효과적인 자료구조이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ5bY7/dJMcacn59Nj/TI4IYeRSq7S2MtiFHFDlG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ5bY7/dJMcacn59Nj/TI4IYeRSq7S2MtiFHFDlG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ5bY7/dJMcacn59Nj/TI4IYeRSq7S2MtiFHFDlG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ5bY7%2FdJMcacn59Nj%2FTI4IYeRSq7S2MtiFHFDlG1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;651&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Adjacency Matrix&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0: edge 존재 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;We can use two matrices to represent a graph (컴퓨터가 이해하기 쉽게 나타냄)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 1D array: to represent vertices&lt;/li&gt;
&lt;li&gt;A 2D array (adjacency matrix):&amp;nbsp; to represent the edges&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLr45/dJMcagD29ga/cyE8lQu8Z9fE7lQCCIMMKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLr45/dJMcagD29ga/cyE8lQu8Z9fE7lQCCIMMKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLr45/dJMcagD29ga/cyE8lQu8Z9fE7lQCCIMMKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLr45%2FdJMcagD29ga%2FcyE8lQu8Z9fE7lQCCIMMKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;607&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Adjacency List&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;We can also use a linked list (and on array) to represent a graph&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 1D array: to represent vertices&lt;/li&gt;
&lt;li&gt;A linked list (adjacency list):&amp;nbsp; to represent the edges&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4UtfE/dJMcadmWUt3/slcycmH038Iq4wUkoqb6pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4UtfE/dJMcadmWUt3/slcycmH038Iq4wUkoqb6pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4UtfE/dJMcadmWUt3/slcycmH038Iq4wUkoqb6pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4UtfE%2FdJMcadmWUt3%2FslcycmH038Iq4wUkoqb6pk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1023&quot; height=&quot;561&quot; data-origin-width=&quot;1023&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Adjacency Matrix vs. List&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;E: edge&lt;/li&gt;
&lt;li&gt;V: vertex&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcTSER/dJMcadtJkHb/NdwHIZf95YPQtvqbUg3GM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcTSER/dJMcadtJkHb/NdwHIZf95YPQtvqbUg3GM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcTSER/dJMcadtJkHb/NdwHIZf95YPQtvqbUg3GM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcTSER%2FdJMcadtJkHb%2FNdwHIZf95YPQtvqbUg3GM0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;659&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kw8m9/dJMcacBDINn/qr1D0ydDvSnCgB4elMxvD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kw8m9/dJMcacBDINn/qr1D0ydDvSnCgB4elMxvD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kw8m9/dJMcacBDINn/qr1D0ydDvSnCgB4elMxvD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkw8m9%2FdJMcacBDINn%2Fqr1D0ydDvSnCgB4elMxvD0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;423&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ GraphType Definition&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mark: DFS, BFS 할 때 방문 여부를 담는 배열 -&amp;gt; 방문하면 true, 아직 방문 안 했으면 false&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVDjhd/dJMb99ZcO87/LJm2I7W5rMLKtk5ftPhxfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVDjhd/dJMb99ZcO87/LJm2I7W5rMLKtk5ftPhxfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVDjhd/dJMb99ZcO87/LJm2I7W5rMLKtk5ftPhxfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVDjhd%2FdJMb99ZcO87%2FLJm2I7W5rMLKtk5ftPhxfk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;453&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Constructor&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;edge: 더블 포인터 (int 포인터를 가리키는 포인터) -&amp;gt; 2차원 배열
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;edges는 int가 아닌 int*들의 배열 -&amp;gt; edges[i]가 i번째 행을 가리키는 포인터 (adjacency matrix)&lt;/li&gt;
&lt;li&gt;행 할당: edges = new int* [maxVertices];&lt;/li&gt;
&lt;li&gt;열 할당: for문 -&amp;gt; edges[i] = new int[maxVertices];&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWh3RS/dJMcac2ETqv/k3SRtoOXcxUKfNYiTqEU6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWh3RS/dJMcac2ETqv/k3SRtoOXcxUKfNYiTqEU6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWh3RS/dJMcac2ETqv/k3SRtoOXcxUKfNYiTqEU6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWh3RS%2FdJMcac2ETqv%2Fk3SRtoOXcxUKfNYiTqEU6K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;371&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ Destructor&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYEWx3/dJMcafd3HkN/PKhJ6zxTd7o9PkMNeS97l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYEWx3/dJMcafd3HkN/PKhJ6zxTd7o9PkMNeS97l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYEWx3/dJMcafd3HkN/PKhJ6zxTd7o9PkMNeS97l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYEWx3%2FdJMcafd3HkN%2FPKhJ6zxTd7o9PkMNeS97l1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;393&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ addVertex()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 정점을 vertices의 맨 끝에 넣음&lt;/li&gt;
&lt;li&gt;새 정점과 &quot;기존 정점들&quot; 사이 간선 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DvanG/dJMcabpbnwB/xG7f5uJtwjJ2WnR5RsKyBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DvanG/dJMcabpbnwB/xG7f5uJtwjJ2WnR5RsKyBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DvanG/dJMcabpbnwB/xG7f5uJtwjJ2WnR5RsKyBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDvanG%2FdJMcabpbnwB%2FxG7f5uJtwjJ2WnR5RsKyBk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;397&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ addEdge()&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CCeNQ/dJMcaa4SEhK/FyJUjQLKTErNxZmOcZLLh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CCeNQ/dJMcaa4SEhK/FyJUjQLKTErNxZmOcZLLh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CCeNQ/dJMcaa4SEhK/FyJUjQLKTErNxZmOcZLLh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCCeNQ%2FdJMcaa4SEhK%2FFyJUjQLKTErNxZmOcZLLh1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1015&quot; height=&quot;337&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ getVertexIndex()&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uWwL/dJMcaiIzHr3/boPr8s4enHFKyZqm4CTM40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uWwL/dJMcaiIzHr3/boPr8s4enHFKyZqm4CTM40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uWwL/dJMcaiIzHr3/boPr8s4enHFKyZqm4CTM40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uWwL%2FdJMcaiIzHr3%2FboPr8s4enHFKyZqm4CTM40%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;428&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ getWeight()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;edges 이차원 배열이 adjacency matrix임&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Graph Searching&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 노드를 연결하는 path를 찾는 것을 의미&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Methods&lt;/u&gt;: &lt;u&gt;Depth-First-Search (DFS)&lt;/u&gt; or &lt;u&gt;Breadth-First-Search (BFS)&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Depth-First Searching (DFS)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;What is the idae behind DFS?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Visit all in a branch to its deepest point before moving up&lt;/li&gt;
&lt;li&gt;Travel as far as you can down a path&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS can be implemented efficiently using a &lt;u&gt;stack&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHEAi/dJMcabW1Cw4/BA1bGliKTJ8x1XPuAMgmrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHEAi/dJMcabW1Cw4/BA1bGliKTJ8x1XPuAMgmrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHEAi/dJMcabW1Cw4/BA1bGliKTJ8x1XPuAMgmrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHEAi%2FdJMcabW1Cw4%2FBA1bGliKTJ8x1XPuAMgmrK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;694&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTTNgf/dJMcagxgdHu/yBgFbtImcEYqGjqY2ThcAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTTNgf/dJMcagxgdHu/yBgFbtImcEYqGjqY2ThcAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTTNgf/dJMcagxgdHu/yBgFbtImcEYqGjqY2ThcAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTTNgf%2FdJMcagxgdHu%2FyBgFbtImcEYqGjqY2ThcAk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;638&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;638&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Depth-first Searching (DFS)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn4h5U/dJMcafrAEur/5oQBhpnNJq0OxmU6FyZuF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn4h5U/dJMcafrAEur/5oQBhpnNJq0OxmU6FyZuF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn4h5U/dJMcafrAEur/5oQBhpnNJq0OxmU6FyZuF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn4h5U%2FdJMcafrAEur%2F5oQBhpnNJq0OxmU6FyZuF0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1359&quot; height=&quot;735&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQpcAo/dJMcac2ETz4/ymmL6j0bBfCjufDyKLQeyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQpcAo/dJMcac2ETz4/ymmL6j0bBfCjufDyKLQeyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQpcAo/dJMcac2ETz4/ymmL6j0bBfCjufDyKLQeyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQpcAo%2FdJMcac2ETz4%2FymmL6j0bBfCjufDyKLQeyk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;726&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z9MX7/dJMcaiu2Auj/KJtsOZmLYryB08T7R0hA0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z9MX7/dJMcaiu2Auj/KJtsOZmLYryB08T7R0hA0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z9MX7/dJMcaiu2Auj/KJtsOZmLYryB08T7R0hA0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz9MX7%2FdJMcaiu2Auj%2FKJtsOZmLYryB08T7R0hA0K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1367&quot; height=&quot;733&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZX69j/dJMcacPadUh/LVuV5voXrBMNHnmPnb2oKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZX69j/dJMcacPadUh/LVuV5voXrBMNHnmPnb2oKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZX69j/dJMcacPadUh/LVuV5voXrBMNHnmPnb2oKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZX69j%2FdJMcacPadUh%2FLVuV5voXrBMNHnmPnb2oKk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1358&quot; height=&quot;733&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AOPzW/dJMcagjI49i/netNxlfSWoV27vqX01ADEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AOPzW/dJMcagjI49i/netNxlfSWoV27vqX01ADEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AOPzW/dJMcagjI49i/netNxlfSWoV27vqX01ADEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAOPzW%2FdJMcagjI49i%2FnetNxlfSWoV27vqX01ADEK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;730&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cci75b/dJMcacayJZP/kRu8yowIlfjMFdoJez0Zkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cci75b/dJMcacayJZP/kRu8yowIlfjMFdoJez0Zkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cci75b/dJMcacayJZP/kRu8yowIlfjMFdoJez0Zkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcci75b%2FdJMcacayJZP%2FkRu8yowIlfjMFdoJez0Zkk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;728&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UOomV/dJMcacPadVb/fuVo7FTTZAfVYXdmC2zFo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UOomV/dJMcacPadVb/fuVo7FTTZAfVYXdmC2zFo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UOomV/dJMcacPadVb/fuVo7FTTZAfVYXdmC2zFo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUOomV%2FdJMcacPadVb%2FfuVo7FTTZAfVYXdmC2zFo1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1351&quot; height=&quot;731&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ywAYZ/dJMcagxgdMp/sp3jjnPD4ehLjxP40gnEV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ywAYZ/dJMcagxgdMp/sp3jjnPD4ehLjxP40gnEV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ywAYZ/dJMcagxgdMp/sp3jjnPD4ehLjxP40gnEV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FywAYZ%2FdJMcagxgdMp%2Fsp3jjnPD4ehLjxP40gnEV1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;733&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z57Yd/dJMcahbRPQZ/d1KV16ZezGahdaPetOMwbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z57Yd/dJMcahbRPQZ/d1KV16ZezGahdaPetOMwbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z57Yd/dJMcahbRPQZ/d1KV16ZezGahdaPetOMwbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ57Yd%2FdJMcahbRPQZ%2Fd1KV16ZezGahdaPetOMwbK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1342&quot; height=&quot;722&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ DFS uses STACK&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. Pop from Stack&lt;/li&gt;
&lt;li&gt;2. Visit the popped coordinate (node)&lt;/li&gt;
&lt;li&gt;3. Push the adjacent coordinates (nodes)&lt;/li&gt;
&lt;li&gt;4. Repeat 1-3&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;만약 경로가 없을 경우엔, end를 pop 하지 못했는데 어느 순간 스택이 비어버리게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;Why STACK?&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OAZG3/dJMcai9EMpw/UjSaiklcsOYWUvnAxlIY9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OAZG3/dJMcai9EMpw/UjSaiklcsOYWUvnAxlIY9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OAZG3/dJMcai9EMpw/UjSaiklcsOYWUvnAxlIY9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOAZG3%2FdJMcai9EMpw%2FUjSaiklcsOYWUvnAxlIY9k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;672&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ DepthFirstSearch()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기화&lt;/li&gt;
&lt;li&gt;DFS
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;pop the node&lt;/li&gt;
&lt;li&gt;endVertex에 도달하면 return true&lt;/li&gt;
&lt;li&gt;eddVertex에 도달하지 못했으면 push adjacents&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4J9oc/dJMcafym815/68l23KSZFvvJ1vrKv5bzo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4J9oc/dJMcafym815/68l23KSZFvvJ1vrKv5bzo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4J9oc/dJMcafym815/68l23KSZFvvJ1vrKv5bzo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4J9oc%2FdJMcafym815%2F68l23KSZFvvJ1vrKv5bzo1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;383&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ getAdjacents()&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;⭐ 경로의 합을 구하는 것과, 최단 경로 (weight) 구하는 것과, 경로 출력하는 함수도 만들어 볼 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Breadth-First Searching (BFS)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;What is the idae behind BFS?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Visit all nodes on one level before going to the next level&lt;/li&gt;
&lt;li&gt;Look at all possible paths at the same depth before you go at a deeper level&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;BFS can be implemented efficiently using a &lt;u&gt;queue&lt;/u&gt;.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DDBBk/dJMcaaRm8Nz/2Vw0Wt0VpbXH3lImaNmV90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DDBBk/dJMcaaRm8Nz/2Vw0Wt0VpbXH3lImaNmV90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DDBBk/dJMcaaRm8Nz/2Vw0Wt0VpbXH3lImaNmV90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDDBBk%2FdJMcaaRm8Nz%2F2Vw0Wt0VpbXH3lImaNmV90%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1331&quot; height=&quot;724&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;724&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Breadth-First Searching (BFS)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oIj2b/dJMcafd4JhV/WCDSnnPU6AyodnY1hqNbw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oIj2b/dJMcafd4JhV/WCDSnnPU6AyodnY1hqNbw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oIj2b/dJMcafd4JhV/WCDSnnPU6AyodnY1hqNbw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoIj2b%2FdJMcafd4JhV%2FWCDSnnPU6AyodnY1hqNbw0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1365&quot; height=&quot;729&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvZJjz/dJMcaaqiyJj/Ww7OPjKbiVR8fAEdXdFsN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvZJjz/dJMcaaqiyJj/Ww7OPjKbiVR8fAEdXdFsN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvZJjz/dJMcaaqiyJj/Ww7OPjKbiVR8fAEdXdFsN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvZJjz%2FdJMcaaqiyJj%2FWw7OPjKbiVR8fAEdXdFsN1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;731&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6q9Bn/dJMcaajwNG3/bnx3721fkSqVWY83nHI2H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6q9Bn/dJMcaajwNG3/bnx3721fkSqVWY83nHI2H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6q9Bn/dJMcaajwNG3/bnx3721fkSqVWY83nHI2H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6q9Bn%2FdJMcaajwNG3%2Fbnx3721fkSqVWY83nHI2H1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;736&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctrLHe/dJMcaaX8AL2/8FK74eV98ClLyE5fr6je6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctrLHe/dJMcaaX8AL2/8FK74eV98ClLyE5fr6je6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctrLHe/dJMcaaX8AL2/8FK74eV98ClLyE5fr6je6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctrLHe%2FdJMcaaX8AL2%2F8FK74eV98ClLyE5fr6je6K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;741&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blSqh3/dJMcaaw4f2D/7vt4D9AHINyP9rdAVMrnMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blSqh3/dJMcaaw4f2D/7vt4D9AHINyP9rdAVMrnMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blSqh3/dJMcaaw4f2D/7vt4D9AHINyP9rdAVMrnMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblSqh3%2FdJMcaaw4f2D%2F7vt4D9AHINyP9rdAVMrnMk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;731&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBoavi/dJMcagxhdqc/fSdx7S1ZRx2LBS8kDCkqC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBoavi/dJMcagxhdqc/fSdx7S1ZRx2LBS8kDCkqC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBoavi/dJMcagxhdqc/fSdx7S1ZRx2LBS8kDCkqC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBoavi%2FdJMcagxhdqc%2FfSdx7S1ZRx2LBS8kDCkqC1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;600&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NpXOi/dJMcafLUnpE/shZnfcBD3jqoeRpXovDwgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NpXOi/dJMcafLUnpE/shZnfcBD3jqoeRpXovDwgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NpXOi/dJMcafLUnpE/shZnfcBD3jqoeRpXovDwgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpXOi%2FdJMcafLUnpE%2FshZnfcBD3jqoeRpXovDwgk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;603&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAMhL2/dJMcaiu3zmo/KmjZcTgkQM3FD5RxunsoNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAMhL2/dJMcaiu3zmo/KmjZcTgkQM3FD5RxunsoNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAMhL2/dJMcaiu3zmo/KmjZcTgkQM3FD5RxunsoNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAMhL2%2FdJMcaiu3zmo%2FKmjZcTgkQM3FD5RxunsoNk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;563&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NDdXp/dJMb99SsYSR/IdkKb2Zz1o4LWKcIl7dGSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NDdXp/dJMb99SsYSR/IdkKb2Zz1o4LWKcIl7dGSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NDdXp/dJMb99SsYSR/IdkKb2Zz1o4LWKcIl7dGSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNDdXp%2FdJMb99SsYSR%2FIdkKb2Zz1o4LWKcIl7dGSK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1314&quot; height=&quot;708&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opA50/dJMcahQutLW/32MHlyKhaH16itAnQLRZ0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opA50/dJMcahQutLW/32MHlyKhaH16itAnQLRZ0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opA50/dJMcahQutLW/32MHlyKhaH16itAnQLRZ0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FopA50%2FdJMcahQutLW%2F32MHlyKhaH16itAnQLRZ0k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1312&quot; height=&quot;705&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V57Mv/dJMcadmXXu1/MKL4sbtNpvXincJmgTMHj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V57Mv/dJMcadmXXu1/MKL4sbtNpvXincJmgTMHj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V57Mv/dJMcadmXXu1/MKL4sbtNpvXincJmgTMHj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV57Mv%2FdJMcadmXXu1%2FMKL4sbtNpvXincJmgTMHj0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;661&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo8jMN/dJMb99LGOyp/irxPHexkwYRh4MMT9qJhRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo8jMN/dJMb99LGOyp/irxPHexkwYRh4MMT9qJhRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo8jMN/dJMb99LGOyp/irxPHexkwYRh4MMT9qJhRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo8jMN%2FdJMb99LGOyp%2FirxPHexkwYRh4MMT9qJhRk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1230&quot; height=&quot;661&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2xDrq/dJMb99ZdRQs/t7JNOAva8bkXVk0X7CcZfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2xDrq/dJMb99ZdRQs/t7JNOAva8bkXVk0X7CcZfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2xDrq/dJMb99ZdRQs/t7JNOAva8bkXVk0X7CcZfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2xDrq%2FdJMb99ZdRQs%2Ft7JNOAva8bkXVk0X7CcZfK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1225&quot; height=&quot;663&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oEv9Q/dJMcafym9zh/bbNTyxQEyKktCRsaKJpyO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oEv9Q/dJMcafym9zh/bbNTyxQEyKktCRsaKJpyO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oEv9Q/dJMcafym9zh/bbNTyxQEyKktCRsaKJpyO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoEv9Q%2FdJMcafym9zh%2FbbNTyxQEyKktCRsaKJpyO1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1233&quot; height=&quot;663&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IiZa1/dJMcaihzhT4/NHG8KQbRu32wTfeQKgKKVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IiZa1/dJMcaihzhT4/NHG8KQbRu32wTfeQKgKKVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IiZa1/dJMcaihzhT4/NHG8KQbRu32wTfeQKgKKVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIiZa1%2FdJMcaihzhT4%2FNHG8KQbRu32wTfeQKgKKVK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1233&quot; height=&quot;659&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/el9kll/dJMcafLUnAZ/egBvTARlZk7IbQQrUHsHRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/el9kll/dJMcafLUnAZ/egBvTARlZk7IbQQrUHsHRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/el9kll/dJMcafLUnAZ/egBvTARlZk7IbQQrUHsHRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fel9kll%2FdJMcafLUnAZ%2FegBvTARlZk7IbQQrUHsHRk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;666&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ BFS uses QUEUE&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. Dequeue from Queue&lt;/li&gt;
&lt;li&gt;2. Visit the dequeued coordinate (node)&lt;/li&gt;
&lt;li&gt;3. Enqueue the adjacent coordinates (nodes)&lt;/li&gt;
&lt;li&gt;4. Repeat 1-3&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 경로가 있구나! 판단&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 경로가 없을 경우엔, end를 dequeue 하지 못했는데 어느 순간 큐가 비어버리게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 경로가 없구나! 판단&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Why QUEUE?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;⭐ 찾아낸 경로가 효율적일 가능성이 BFS보다 높지만, 경로를 찾아내는 과정 자체는 비효율적이다. (DFS와 반대!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFzgoW/dJMcagcZrlP/YNdsFUkqcVHqOp89WuNefK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFzgoW/dJMcagcZrlP/YNdsFUkqcVHqOp89WuNefK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFzgoW/dJMcagcZrlP/YNdsFUkqcVHqOp89WuNefK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFzgoW%2FdJMcagcZrlP%2FYNdsFUkqcVHqOp89WuNefK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;598&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ breadthFirstSearch()&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;⭐ 경로의 합을 구하는 것 해보기!!! (int 반환)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;⭐&lt;span&gt; &lt;/span&gt;&lt;/span&gt;DFS, BFS 장단점 고민해볼 것!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Shortest Path Problem&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TdQx6/dJMcagcZr2w/ABw7kfOlKlexrLx8WZ3gQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TdQx6/dJMcagcZr2w/ABw7kfOlKlexrLx8WZ3gQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TdQx6/dJMcagcZr2w/ABw7kfOlKlexrLx8WZ3gQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTdQx6%2FdJMcagcZr2w%2FABw7kfOlKlexrLx8WZ3gQK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1111&quot; height=&quot;561&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnxn6m/dJMcafLUouU/zMpZQoB6qWJV9KfBIiYP11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnxn6m/dJMcafLUouU/zMpZQoB6qWJV9KfBIiYP11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnxn6m/dJMcafLUouU/zMpZQoB6qWJV9KfBIiYP11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnxn6m%2FdJMcafLUouU%2FzMpZQoB6qWJV9KfBIiYP11%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1181&quot; height=&quot;465&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정한&amp;nbsp;정점을&amp;nbsp;출발해서&amp;nbsp;다른&amp;nbsp;정점들로&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;최단&amp;nbsp;경로들의&amp;nbsp;값을&amp;nbsp;구해주는&amp;nbsp;방식&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;참고자료&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arsenic-dev.tistory.com/68&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arsenic-dev.tistory.com/68&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1765381738212&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Programming Exercise: Lab #3&quot; data-og-description=&quot;경희대학교 박제만 교수님의 자료구조 수업을 기반으로 정리한 글입니다.Exercise #1ProblemsImplement rotateFirstItem() in Circular Queue with Reserved space.This function &amp;quot;ROTATES&amp;quot; the first item of the queue.▶ Both are OKAY (in&quot; data-og-host=&quot;arsenic-dev.tistory.com&quot; data-og-source-url=&quot;https://arsenic-dev.tistory.com/68&quot; data-og-url=&quot;https://arsenic-dev.tistory.com/68&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/belj7m/hyZO6zuMpU/pJ2JOvJnFUhxJAQz90AlEK/img.png?width=800&amp;amp;height=345&amp;amp;face=0_0_800_345,https://scrap.kakaocdn.net/dn/S9Oo5/hyZPcsW0rr/j9qROQkcKi9hKi2h1GD9fK/img.png?width=800&amp;amp;height=345&amp;amp;face=0_0_800_345,https://scrap.kakaocdn.net/dn/g5EIZ/hyZO9JLgtN/iYDL2LlQZRNlm5kXiXgMwk/img.png?width=2310&amp;amp;height=999&amp;amp;face=0_0_2310_999&quot;&gt;&lt;a href=&quot;https://arsenic-dev.tistory.com/68&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://arsenic-dev.tistory.com/68&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/belj7m/hyZO6zuMpU/pJ2JOvJnFUhxJAQz90AlEK/img.png?width=800&amp;amp;height=345&amp;amp;face=0_0_800_345,https://scrap.kakaocdn.net/dn/S9Oo5/hyZPcsW0rr/j9qROQkcKi9hKi2h1GD9fK/img.png?width=800&amp;amp;height=345&amp;amp;face=0_0_800_345,https://scrap.kakaocdn.net/dn/g5EIZ/hyZO9JLgtN/iYDL2LlQZRNlm5kXiXgMwk/img.png?width=2310&amp;amp;height=999&amp;amp;face=0_0_2310_999');&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;Programming Exercise: Lab #3&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;경희대학교 박제만 교수님의 자료구조 수업을 기반으로 정리한 글입니다.Exercise #1ProblemsImplement rotateFirstItem() in Circular Queue with Reserved space.This function &quot;ROTATES&quot; the first item of the queue.▶ Both are OKAY (in&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;arsenic-dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;</description>
      <category>CS/자료구조</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/122</guid>
      <comments>https://arsenic-dev.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 14 Dec 2025 14:53:01 +0900</pubDate>
    </item>
    <item>
      <title>9-1. 소프트웨어 퍼징의 개념과 기술</title>
      <link>https://arsenic-dev.tistory.com/120</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;1. 기본 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bug&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발자의 실수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Software &quot;Bug&quot; e.g., 버퍼오버플로우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btsfbm/dJMcacPa49a/4Nlzg3y3qBdMOCt3XzdkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btsfbm/dJMcacPa49a/4Nlzg3y3qBdMOCt3XzdkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btsfbm/dJMcacPa49a/4Nlzg3y3qBdMOCt3XzdkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtsfbm%2FdJMcacPa49a%2F4Nlzg3y3qBdMOCt3XzdkKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;552&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;552&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;이때 말하는 버그는 런타임 버그이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버그는 컴파일 버그와 런타임 버그가 있는데, 컴파일 버그는 소스 코드 작성 시 문법같은 거 틀렸을 때 발생하는 버그로, 애당초 이 버그로 인해 프로그램이 만들어지지도 않기에 문제가 되지 않음&lt;/li&gt;
&lt;li&gt;런타임 버그: 소프트웨어 사용하는 시점에서 문제가 되는 버그&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, 버그는 메모리 버그, 로직 버그 등 종류가 다양한데, 퍼저가 타겟하여 찾고자 하는 버그는 메모리 버그이다. (e.g. ,BOF)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물론, 고도화된 연구를 통해 로직 버그도 퍼징하는 게 존재하긴 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edCQpu/dJMcabirtiQ/FkPUOB3GXZGxe9Eced2qK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edCQpu/dJMcabirtiQ/FkPUOB3GXZGxe9Eced2qK0/img.png&quot; data-alt=&quot;버그의 발견이 흥미로운 이유 -&amp;amp;gt; 해커들이 사고 팜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edCQpu/dJMcabirtiQ/FkPUOB3GXZGxe9Eced2qK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedCQpu%2FdJMcabirtiQ%2FFkPUOB3GXZGxe9Eced2qK0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;519&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버그의 발견이 흥미로운 이유 -&amp;gt; 해커들이 사고 팜&lt;/figcaption&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;때문에, 이런 파급력이 높은 버그를 막기 위해 퍼징이라는 기술을 통해 자동으로 버그를 찾고자 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Fuzzing Basics&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Input&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퍼징 대상 프로그램에게 주는 입력 (Data) -&amp;gt; 해커가 조작할 수 있는 입력인 것이 중요&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해커가 줄 법한 입력을 메모리에 넣고 복잡한 일을 하는 소프트웨어가 가장 퍼징을 하기 좋은 소프트웨어임&lt;/li&gt;
&lt;/ul&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;b&gt;Corpus&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fuzzing에 사용되는 Input의 집합을 칭함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;퍼징의 기본단계&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAJG5x/dJMcai2SMi9/URbcqA7JJYKkph6yWgKNq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAJG5x/dJMcai2SMi9/URbcqA7JJYKkph6yWgKNq1/img.png&quot; data-alt=&quot;프로그램이 crash 날 때까지 반복&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAJG5x/dJMcai2SMi9/URbcqA7JJYKkph6yWgKNq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAJG5x%2FdJMcai2SMi9%2FURbcqA7JJYKkph6yWgKNq1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;372&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그램이 crash 날 때까지 반복&lt;/figcaption&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;b&gt;1. Input 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 하면 &quot;좋은 Input&quot;을 생성할 수 있을까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Dumb Fuzzing: 순수하게 Random Data 생성&lt;/li&gt;
&lt;li&gt;Smart/Hybrid fuzzing: Random + @ 를 이용해서 버그 발견 확률을 증대&lt;/li&gt;
&lt;/ul&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;b&gt;2. 프로그램 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 하면 &quot;빠르게&quot; 실행할까?&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;b&gt;3. 결과 관찰&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 하면 &quot;Bug&quot;를 놓치지 않을까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Fuzzing 분류&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Black Box Fuzzing&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;프로그램 내부를 전혀 모른 채 입력값만 무작위로 계속 넣어보는 방식 (그래서 블랙박스 -&amp;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;b&gt;2. White Box Fuzzing&lt;/b&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;b&gt;3. Gray Box Fuzzing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Black, White의 중간 방식으로 가장 많이 사용하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Instrumentation 기반 -&amp;gt; Coverage 측정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-pm-slice=&quot;0 0 []&quot;&gt;인스트루멘테이션: 실행 중 어떤 코드가 지나갔는지 기록하려고 프로그램에 계측(로그/표식) 코드를 심는 것&lt;/li&gt;
&lt;li&gt;커버리지: 특정 입력을 넣었을 때 프로그램의 코드가 얼마나/어디까지 실행됐는지를 나타내는 지표&lt;/li&gt;
&lt;/ul&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;b&gt;Input 생성에 기반한 분류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generative vs Mutational&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;1. Generative Fuzzing&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Input을 바닥부터 생성
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로그램의 input specification을 알아야 함&lt;/li&gt;
&lt;li&gt;Fuzzer가 empty set에서부터 input들을 생성함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Initial Corpus가 필요하지 않음 (샘플 필요 없다는 의미)&lt;/li&gt;
&lt;li&gt;모든 경우를 균일하게 테스트 해갈 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;mutation보다 input의 효율이 떨어짐: 놓치는 경우들이 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. Mutational Fuzzing&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Input을 정상적인 Sample로부터 Mutation(조금씩 변형 -&amp;gt; 돌연변이 input)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;일반적으로 Bug Trigger 효과가 뛰어남&lt;/li&gt;
&lt;li&gt;Input Specification에 대한 완전한 정보가 없어도 되므로 Generative 보다 구현이 쉬움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Initial Corpus의 수집 과정이 필요함&lt;/li&gt;
&lt;li&gt;Initial Corpus의 범주를 크게 벗어난 테스팅이 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Address Sanitizer&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에서 퍼징을 위해 만든 도구이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o5CCh/dJMcacPa5EH/7UYP9lNyYFk3KbHChsWcx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o5CCh/dJMcacPa5EH/7UYP9lNyYFk3KbHChsWcx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o5CCh/dJMcacPa5EH/7UYP9lNyYFk3KbHChsWcx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo5CCh%2FdJMcacPa5EH%2F7UYP9lNyYFk3KbHChsWcx0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;124&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;124&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;C언어에서 배열의 인덱스는 0번부터 시작하기에 100개의 element를 선언한 배열의 마지막 인덱스는 99이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 100번을 참조했으니&amp;nbsp; 건드리면 안 되는 남의 메모리 위치, 즉 버퍼를 넘어서 참조했기에 버그이다.&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-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;CPU가 메모리에 접근할 때, 접근 순간마다 즉시 오류를 발생시키는 것이 아니라 페이지(Page)라는 단위를 기준으로 접근 권한을 검사한다. 메모리는 보통 4KB의 페이지로 나뉘어 있으며, 각 페이지마다 &amp;ldquo;읽기 가능&amp;rdquo;, &amp;ldquo;쓰기 가능&amp;rdquo;, &amp;ldquo;실행 가능&amp;rdquo;과 같은 권한이 설정된다.&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;따라서 배열의 99번째 요소에 정상적으로 읽기 또는 쓰기가 가능했다면, 그 바로 옆인 100번째 요소도 같은 페이지에 속해 있을 가능성이 높아 CPU는 이를 즉시 잘못된 접근으로 판단하지 않는다.&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;-&amp;gt; 때문에, 아무리 퍼징을 해도 버그가 안 잡히는데, 이를 해결하기 위한 도구가 address sanitizer[쎄니타이절]이다.&amp;nbsp;&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;address sanitizer의 원리는 프로그램의 소스 코드가 바이너리로 컴파일 될 때 약간의 변형을 가하여 소프트웨어의 로직을 건들지는 않지만 메모리 접근시마다 무슨 검사를 하는 추가 로직을 집어 넣는다. (instrument)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckQswe/dJMb99ZdHeS/KMEhL3YU2lN8LBRUOF7tt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckQswe/dJMb99ZdHeS/KMEhL3YU2lN8LBRUOF7tt0/img.png&quot; data-alt=&quot;버퍼 영역 벗어난 접근이다라는 판단이 서면 그 즉시 프로그램 중단&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckQswe/dJMb99ZdHeS/KMEhL3YU2lN8LBRUOF7tt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckQswe%2FdJMb99ZdHeS%2FKMEhL3YU2lN8LBRUOF7tt0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;603&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버퍼 영역 벗어난 접근이다라는 판단이 서면 그 즉시 프로그램 중단&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm57DR/dJMcac2FMp3/YRc4vVyOFBLa8cA7nohGrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm57DR/dJMcac2FMp3/YRc4vVyOFBLa8cA7nohGrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm57DR/dJMcac2FMp3/YRc4vVyOFBLa8cA7nohGrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm57DR%2FdJMcac2FMp3%2FYRc4vVyOFBLa8cA7nohGrk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;260&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;260&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-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;어드레스 새니타이저(AddressSanitizer)가 적용된 프로그램을 만들기 위해서는 소스 코드부터 다시 빌드해야 한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류가 발생하면 AddressSanitizer 관련 메시지가 출력되며, 어떤 종류의 메모리 오류인지, 어디에서 왜 문제가 발생했는지에 대한 상세한 로그와 스택 트레이스를 함께 제공한다.&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;-&amp;gt; 훨씬 효율적이고, 많은 버거들을 놓치지 않고 잘 잡아낼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Corpus Pruning?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjHGES/dJMcagYlpWC/a57IMeOsxnwxNBLcjEbGKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjHGES/dJMcagYlpWC/a57IMeOsxnwxNBLcjEbGKK/img.png&quot; data-alt=&quot;saturation: 포화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjHGES/dJMcagYlpWC/a57IMeOsxnwxNBLcjEbGKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjHGES%2FdJMcagYlpWC%2Fa57IMeOsxnwxNBLcjEbGKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;577&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;saturation: 포화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca6Gg5/dJMcacn6ZkN/ylfjG8KRdafdNMqK4eo2sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca6Gg5/dJMcacn6ZkN/ylfjG8KRdafdNMqK4eo2sK/img.png&quot; data-alt=&quot;code coverage를 크게 하는 인풋이 좋은 인풋 -&amp;amp;gt; bug trigger 할 확률 높은 인풋 -&amp;amp;gt; 빨간색 제거!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca6Gg5/dJMcacn6ZkN/ylfjG8KRdafdNMqK4eo2sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca6Gg5%2FdJMcacn6ZkN%2FylfjG8KRdafdNMqK4eo2sK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;535&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;code coverage를 크게 하는 인풋이 좋은 인풋 -&amp;gt; bug trigger 할 확률 높은 인풋 -&amp;gt; 빨간색 제거!&lt;/figcaption&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;이때, 어떤 걸 지우는 게 좋을지 판단하는 것을 coverage라는 개념을 통해 하게 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;coverage가 작은 녀석들을 지우는 게 기본 원리 or 중복 커버리지 갖는 인풋 지움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;2. Coverage 기반 퍼징&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;퍼징에 유전 알고리즘을 적용&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Coverage?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwcOg/dJMcaaRmY7y/zCM8Un1RLIXLJzhHXfketk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwcOg/dJMcaaRmY7y/zCM8Un1RLIXLJzhHXfketk/img.png&quot; data-alt=&quot;basic block, edge: 어셈블리의 레벨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwcOg/dJMcaaRmY7y/zCM8Un1RLIXLJzhHXfketk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmwcOg%2FdJMcaaRmY7y%2FzCM8Un1RLIXLJzhHXfketk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1004&quot; height=&quot;614&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;basic block, edge: 어셈블리의 레벨&lt;/figcaption&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR2cRM/dJMb99LGD1G/tpkDHMsh0fAzzFXNFzVxkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR2cRM/dJMb99LGD1G/tpkDHMsh0fAzzFXNFzVxkk/img.png&quot; data-alt=&quot;4개 중 주황색으로 표시된 3개의 블럭은 최소 한 번 이사 실행 흐름이 온 블럭이고, 하얀 블럭은 한 번도 실행된 적이 없음을 뜻함 -&amp;amp;gt; block coverage는 75%&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR2cRM/dJMb99LGD1G/tpkDHMsh0fAzzFXNFzVxkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR2cRM%2FdJMb99LGD1G%2FtpkDHMsh0fAzzFXNFzVxkk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;668&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;4개 중 주황색으로 표시된 3개의 블럭은 최소 한 번 이사 실행 흐름이 온 블럭이고, 하얀 블럭은 한 번도 실행된 적이 없음을 뜻함 -&amp;gt; block coverage는 75%&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l05pp/dJMcagcZhCj/tCeQNeFxa2IctuRVv6lXu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l05pp/dJMcagcZhCj/tCeQNeFxa2IctuRVv6lXu0/img.png&quot; data-alt=&quot;edge: 블록 간에 이동할 수 있는 라인 (자료구조에서 노드를 연결하는 엣지)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l05pp/dJMcagcZhCj/tCeQNeFxa2IctuRVv6lXu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl05pp%2FdJMcagcZhCj%2FtCeQNeFxa2IctuRVv6lXu0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;705&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;edge: 블록 간에 이동할 수 있는 라인 (자료구조에서 노드를 연결하는 엣지)&lt;/figcaption&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;block보다 edge가 더 세밀하게 측량 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;그리고 block와 edge는 어셈블리만 가지고 표현이 되는 정보이기에 분석하는 소프트웨어의 소스 코드가 없이, 바이너리만 가지고도 다 얻을 수 있지만, line 같은 경우는 소스 코드가 몇 번째 줄까지 실행 됐느냐를 나타내기에 소스 코드가 없으면 알 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; line coverage로 퍼징을 하는 일은 거의 X, 대부분이 block, edge O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;유전 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmA2V/dJMcagxg4Nm/W01GAWPDU232C9WuSvF921/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmA2V/dJMcagxg4Nm/W01GAWPDU232C9WuSvF921/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmA2V/dJMcagxg4Nm/W01GAWPDU232C9WuSvF921/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmA2V%2FdJMcagxg4Nm%2FW01GAWPDU232C9WuSvF921%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;481&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EmpMb/dJMcaiaNeNK/7tNInOtxTUyDhCAyIIR4d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EmpMb/dJMcaiaNeNK/7tNInOtxTUyDhCAyIIR4d1/img.png&quot; data-alt=&quot;퍼저 도구에서의 c의 main과 같은 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EmpMb/dJMcaiaNeNK/7tNInOtxTUyDhCAyIIR4d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmpMb%2FdJMcaiaNeNK%2F7tNInOtxTUyDhCAyIIR4d1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1057&quot; height=&quot;598&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퍼저 도구에서의 c의 main과 같은 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;퍼저는 실행 경로(커버리지)를 보고 조건을 하나씩 통과하는 입력만 살아남게 하면서,&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;결국 크래시를 일으키는 입력(HI!)을 찾아낸다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 1/(26*3) 경우로 찾을 수 있음 (선형, 지수에 비해 훨씬 빠른 시간 안에 해결)&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;만약, 커버리지 측정 안 하고 걍 랜덤으로 돌리면 1/26^3 경우로 찾을 수 있음 (지수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AFL (American Fuzzy Lop)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxKHK/dJMcagxg4Ok/WmFcYbXSoEFX50pMawp2D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxKHK/dJMcagxg4Ok/WmFcYbXSoEFX50pMawp2D1/img.png&quot; data-alt=&quot;초기 AFL 퍼저의 경우, 타겟 소프트웨어와 퍼저 소프트웨어가 독립적이었음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxKHK/dJMcagxg4Ok/WmFcYbXSoEFX50pMawp2D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxKHK%2FdJMcagxg4Ok%2FWmFcYbXSoEFX50pMawp2D1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;628&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기 AFL 퍼저의 경우, 타겟 소프트웨어와 퍼저 소프트웨어가 독립적이었음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;libFuzzer&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X3zDM/dJMcafLUei4/LmARKEdwdnN8SESknHiOh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X3zDM/dJMcafLUei4/LmARKEdwdnN8SESknHiOh0/img.png&quot; data-alt=&quot;초기부터, 퍼징 당하는 소프트웨어와 퍼징하는 소프트웨어가 독립적이지 않은 1개의 소프트웨어였음(In-Process), 산업계에서 실제로 많이 사용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X3zDM/dJMcafLUei4/LmARKEdwdnN8SESknHiOh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX3zDM%2FdJMcafLUei4%2FLmARKEdwdnN8SESknHiOh0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;623&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기부터, 퍼징 당하는 소프트웨어와 퍼징하는 소프트웨어가 독립적이지 않은 1개의 소프트웨어였음(In-Process), 산업계에서 실제로 많이 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;3. Structured Input Fuzzing&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBvMdj/dJMcad1zvTX/aCCeN92jCS3DHV6oFM0XG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBvMdj/dJMcad1zvTX/aCCeN92jCS3DHV6oFM0XG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBvMdj/dJMcad1zvTX/aCCeN92jCS3DHV6oFM0XG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBvMdj%2FdJMcad1zvTX%2FaCCeN92jCS3DHV6oFM0XG0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;638&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;645&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpfPgo/dJMcahQukgC/3PaUr2iVgsOGkuANCiJ680/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpfPgo/dJMcahQukgC/3PaUr2iVgsOGkuANCiJ680/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpfPgo/dJMcahQukgC/3PaUr2iVgsOGkuANCiJ680/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpfPgo%2FdJMcahQukgC%2F3PaUr2iVgsOGkuANCiJ680%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;645&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;645&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsQmNp/dJMcag47F7X/QYARWhhEcMRfIddjQWxfY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsQmNp/dJMcag47F7X/QYARWhhEcMRfIddjQWxfY1/img.png&quot; data-alt=&quot;연구 방향: 소스 코드를 트리 자료 구조로 변환하고, 이 자료 구조를 mutation 하는 식으로 퍼징함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsQmNp/dJMcag47F7X/QYARWhhEcMRfIddjQWxfY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsQmNp%2FdJMcag47F7X%2FQYARWhhEcMRfIddjQWxfY1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;626&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연구 방향: 소스 코드를 트리 자료 구조로 변환하고, 이 자료 구조를 mutation 하는 식으로 퍼징함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;4. Hybrid Fuzzing&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUU0bi/dJMcadN2bxo/QxRszqNSjWVw3Jz77g6E70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUU0bi/dJMcadN2bxo/QxRszqNSjWVw3Jz77g6E70/img.png&quot; data-alt=&quot;퍼징에 분석 추가!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUU0bi/dJMcadN2bxo/QxRszqNSjWVw3Jz77g6E70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUU0bi%2FdJMcadN2bxo%2FQxRszqNSjWVw3Jz77g6E70%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;290&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퍼징에 분석 추가!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceUeXf/dJMcaihy9nJ/9cAjSeSwdTXJfoKmRB7yc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceUeXf/dJMcaihy9nJ/9cAjSeSwdTXJfoKmRB7yc0/img.png&quot; data-alt=&quot;Data Flow Sanitizer: DFSan&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceUeXf/dJMcaihy9nJ/9cAjSeSwdTXJfoKmRB7yc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceUeXf%2FdJMcaihy9nJ%2F9cAjSeSwdTXJfoKmRB7yc0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;540&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Data Flow Sanitizer: DFSan&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 -&amp;gt; 변수 영향 예측&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJ2kLC/dJMcaaX8rUJ/rlJhm2RrgbZv620bml04qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJ2kLC/dJMcaaX8rUJ/rlJhm2RrgbZv620bml04qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJ2kLC/dJMcaaX8rUJ/rlJhm2RrgbZv620bml04qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJ2kLC%2FdJMcaaX8rUJ%2FrlJhm2RrgbZv620bml04qK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;689&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;689&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Maoif/dJMcabW2u1Z/GdpEx1vKrfS0cgl9uGV1ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Maoif/dJMcabW2u1Z/GdpEx1vKrfS0cgl9uGV1ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Maoif/dJMcabW2u1Z/GdpEx1vKrfS0cgl9uGV1ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMaoif%2FdJMcabW2u1Z%2FGdpEx1vKrfS0cgl9uGV1ek%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;703&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;703&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;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;5. Anti-Fuzzing&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Adme7/dJMcagjJY1H/hFfIDy2HaLbz8GbJaeeQH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Adme7/dJMcagjJY1H/hFfIDy2HaLbz8GbJaeeQH0/img.png&quot; data-alt=&quot;내 실수를 찾지 마라! -&amp;amp;gt; 버그 못 찾게 함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Adme7/dJMcagjJY1H/hFfIDy2HaLbz8GbJaeeQH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAdme7%2FdJMcagjJY1H%2FhFfIDy2HaLbz8GbJaeeQH0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;691&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내 실수를 찾지 마라! -&amp;gt; 버그 못 찾게 함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;6. Distributed Fuzzing&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkivbh/dJMcai9ED7B/vxR4s7TOFozt7jY7ZWW2mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkivbh/dJMcai9ED7B/vxR4s7TOFozt7jY7ZWW2mK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkivbh/dJMcai9ED7B/vxR4s7TOFozt7jY7ZWW2mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdkivbh%2FdJMcai9ED7B%2FvxR4s7TOFozt7jY7ZWW2mK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;694&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtLkZQ/dJMcabpceX7/CmbZKkXU6vqVauojnIF411/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtLkZQ/dJMcabpceX7/CmbZKkXU6vqVauojnIF411/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtLkZQ/dJMcabpceX7/CmbZKkXU6vqVauojnIF411/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtLkZQ%2FdJMcabpceX7%2FCmbZKkXU6vqVauojnIF411%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1037&quot; height=&quot;631&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QhB3U/dJMcajgpYgq/QH6Fbzq2sGRU8POW3wZTWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QhB3U/dJMcajgpYgq/QH6Fbzq2sGRU8POW3wZTWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QhB3U/dJMcajgpYgq/QH6Fbzq2sGRU8POW3wZTWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQhB3U%2FdJMcajgpYgq%2FQH6Fbzq2sGRU8POW3wZTWk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;705&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byeByc/dJMcaaDPfOW/k4ujKslkLwu0yTDt9xBsmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byeByc/dJMcaaDPfOW/k4ujKslkLwu0yTDt9xBsmK/img.png&quot; data-alt=&quot;자동화 잘 되어 있다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byeByc/dJMcaaDPfOW/k4ujKslkLwu0yTDt9xBsmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyeByc%2FdJMcaaDPfOW%2Fk4ujKslkLwu0yTDt9xBsmK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1034&quot; height=&quot;705&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자동화 잘 되어 있다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs4qaS/dJMcadN2bqm/1xxHwKO80FludjXVtvzpX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs4qaS/dJMcadN2bqm/1xxHwKO80FludjXVtvzpX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs4qaS/dJMcadN2bqm/1xxHwKO80FludjXVtvzpX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs4qaS%2FdJMcadN2bqm%2F1xxHwKO80FludjXVtvzpX0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;638&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>CS/소프트웨어보안</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/120</guid>
      <comments>https://arsenic-dev.tistory.com/120#entry120comment</comments>
      <pubDate>Sun, 14 Dec 2025 03:25:24 +0900</pubDate>
    </item>
    <item>
      <title>7-2. BoF Exploit 2</title>
      <link>https://arsenic-dev.tistory.com/119</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;보호 기법 3가지 (보호 옵션)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. ASLR&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Address Space Layout Randomization의 약자로, 실행 파일과 관련된 공유 라이브러리, 스택, 힙이 매핑되는 메모리 영역의 주소를 랜덤으로 배치하는 것을 말한다. ('영역' 단위로 랜덤화, e.g., stack, heap, libc)&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;ASLR이 활성화되어 있으면 7-1의 실습 2 처럼 점프할 주소를 직접 입력하는 행위는 불가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 leak을 통해 점프할 주소를 알아와야 하는 번거로움 발생&lt;/li&gt;
&lt;li&gt;리눅스 설치시 자동으로 켜지는 보호 기법&lt;/li&gt;
&lt;li&gt;브루트 포싱을 한다고 하더라도 같은 프로세스 안에서 계속해서 브루트 포싱을 하는 게 쉽지가 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QboJN/dJMcaaDO7CR/awFzSVqkdqfzkNmbtqvTw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QboJN/dJMcaaDO7CR/awFzSVqkdqfzkNmbtqvTw1/img.png&quot; data-alt=&quot;cp: 복사 명령어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QboJN/dJMcaaDO7CR/awFzSVqkdqfzkNmbtqvTw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQboJN%2FdJMcaaDO7CR%2FawFzSVqkdqfzkNmbtqvTw1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;505&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cp: 복사 명령어&lt;/figcaption&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;11~15행: main, secret 함수의 주소가 뭔지, 그리고 지금 할당한 버퍼의 주소가 뭔지에 대한 printf 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca5LdE/dJMb99LGv59/6FXclWHRtjjPLy6x1s0V40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca5LdE/dJMb99LGv59/6FXclWHRtjjPLy6x1s0V40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca5LdE/dJMb99LGv59/6FXclWHRtjjPLy6x1s0V40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca5LdE%2FdJMb99LGv59%2F6FXclWHRtjjPLy6x1s0V40%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;504&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ImJfJ/dJMcag47yav/HfWu2nDHDv2ZSzA9Scnm0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ImJfJ/dJMcag47yav/HfWu2nDHDv2ZSzA9Scnm0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ImJfJ/dJMcag47yav/HfWu2nDHDv2ZSzA9Scnm0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FImJfJ%2FdJMcag47yav%2FHfWu2nDHDv2ZSzA9Scnm0k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1071&quot; height=&quot;502&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;502&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;aslr이 랜덤화 하는 단위는 '영역'이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;ASLR은 메모리 영역을 랜덤 위치에 배치하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;non-PIE 실행 파일의 코드 영역은 절대 주소로 고정되어 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASLR만으로는 함수 주소를 랜덤화할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PIE를 사용해야 코드 영역도 ASLR의 대상이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. NX&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;No-Execute bit의 약자로, 실행 가능한 메모리 영역이 아닌 스택, 힙과 같은 영역에서 코드가 실행되는 것을 막는 보호 기법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;-z execstack&quot; 옵션을 빼고 빌드 -&amp;gt; nx 활성화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NX bit가 활성화되어 있으면, 스택에 쉘코드를 업로드하여 실행시키는 행위는 불가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjJbGY/dJMcaaX8j4A/PUrlf7D2NknComZ9Rl3IBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjJbGY/dJMcaaX8j4A/PUrlf7D2NknComZ9Rl3IBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjJbGY/dJMcaaX8j4A/PUrlf7D2NknComZ9Rl3IBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjJbGY%2FdJMcaaX8j4A%2FPUrlf7D2NknComZ9Rl3IBK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;367&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;367&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. PIE [파이]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Position-Independent Executable의 약자로, 바이너리가 로딩될 때 main, secret 함수와 같은 각가지 주소들이 랜덤한 주소에 매핑되는 기법으로 바이너리를 실행할 때마다 바이너리의 주소가 랜덤화되게 한다.&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;스택의 RET 주소에 함수 주소를 직접 확인하고 넣는 것이 불가능해진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 주소를 알 수 있을 때 동적으로 삽입할 수 있는 기술 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esnEOM/dJMcah31glb/rGOYVmzabz55Pi6q9kjhA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esnEOM/dJMcah31glb/rGOYVmzabz55Pi6q9kjhA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esnEOM/dJMcah31glb/rGOYVmzabz55Pi6q9kjhA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesnEOM%2FdJMcah31glb%2FrGOYVmzabz55Pi6q9kjhA1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;509&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로, -fno-stack-protector 이 옵션이 스택 카다리 관련 옵션이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;BoF 실습&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASLR 활성화: 스택의 주소가 매번 변화하는 상황&lt;/li&gt;
&lt;li&gt;NX bit 활성화: 스택에서 코드 실행이 불가능한 상황&lt;/li&gt;
&lt;li&gt;PIE: 활성화: 매번 적재되는 함수의 주소가 달라지는 상황&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcp6a2/dJMcab3N36T/ZJyoteuuDAUoIwFS7kITN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcp6a2/dJMcab3N36T/ZJyoteuuDAUoIwFS7kITN0/img.png&quot; data-alt=&quot;get_shell() 함수를 호출할 수 있으면 시스템 쉘 획득 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcp6a2/dJMcab3N36T/ZJyoteuuDAUoIwFS7kITN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcp6a2%2FdJMcab3N36T%2FZJyoteuuDAUoIwFS7kITN0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;638&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;get_shell() 함수를 호출할 수 있으면 시스템 쉘 획득 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcUWWv/dJMcahJJvEH/NyiGiABQ0N98ykAhOyvRc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcUWWv/dJMcahJJvEH/NyiGiABQ0N98ykAhOyvRc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcUWWv/dJMcahJJvEH/NyiGiABQ0N98ykAhOyvRc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcUWWv%2FdJMcahJJvEH%2FNyiGiABQ0N98ykAhOyvRc0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1377&quot; height=&quot;512&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;512&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;바이너리 분석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수 심볼 분석&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3MoV/dJMcahJJvHB/uO9KlinKQrsnjo2FuyCbH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3MoV/dJMcahJJvHB/uO9KlinKQrsnjo2FuyCbH1/img.png&quot; data-alt=&quot;readelf -&amp;amp;gt; 함수 훑어보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3MoV/dJMcahJJvHB/uO9KlinKQrsnjo2FuyCbH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3MoV%2FdJMcahJJvHB%2FuO9KlinKQrsnjo2FuyCbH1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1351&quot; height=&quot;526&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;readelf -&amp;gt; 함수 훑어보기&lt;/figcaption&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;main, vuln, get_shell 함수가 존재하는 것을 확인 가능&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;b&gt;pwndbg를 사용해 bof_sample2 분석&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL6yhL/dJMcagqvASn/1X8AMMPkWRUmd65cNwXHz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL6yhL/dJMcagqvASn/1X8AMMPkWRUmd65cNwXHz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL6yhL/dJMcagqvASn/1X8AMMPkWRUmd65cNwXHz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL6yhL%2FdJMcagqvASn%2F1X8AMMPkWRUmd65cNwXHz0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;983&quot; height=&quot;75&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcUOqn/dJMcaiV7oIn/TTbFqSbn59JYefO5oAcTuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcUOqn/dJMcaiV7oIn/TTbFqSbn59JYefO5oAcTuK/img.png&quot; data-alt=&quot;main 함수 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcUOqn/dJMcaiV7oIn/TTbFqSbn59JYefO5oAcTuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcUOqn%2FdJMcaiV7oIn%2FTTbFqSbn59JYefO5oAcTuK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;467&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main 함수 분석&lt;/figcaption&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;main 함수 내에서는 간단하게 vuln 함수를 호출하는 것을 확인 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main 함수는 vuln 함수 호출 외에 하는 게 없고, vuln이 핵심&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbm25V/dJMcahJJvIF/PGjw03GkUmATbXhYjOdjKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbm25V/dJMcahJJvIF/PGjw03GkUmATbXhYjOdjKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbm25V/dJMcahJJvIF/PGjw03GkUmATbXhYjOdjKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbm25V%2FdJMcahJJvIF%2FPGjw03GkUmATbXhYjOdjKk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;635&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJsnMX/dJMcaihy3D1/F3Oxk0n6Bqmsc3TMlSCfv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJsnMX/dJMcaihy3D1/F3Oxk0n6Bqmsc3TMlSCfv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJsnMX/dJMcaihy3D1/F3Oxk0n6Bqmsc3TMlSCfv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJsnMX%2FdJMcaihy3D1%2FF3Oxk0n6Bqmsc3TMlSCfv0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1379&quot; height=&quot;516&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfYs7E/dJMcadHhunB/9EzrXsCVrBwdpavR2cuLK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfYs7E/dJMcadHhunB/9EzrXsCVrBwdpavR2cuLK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfYs7E/dJMcadHhunB/9EzrXsCVrBwdpavR2cuLK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfYs7E%2FdJMcadHhunB%2F9EzrXsCVrBwdpavR2cuLK0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1403&quot; height=&quot;519&quot; data-origin-width=&quot;1403&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byJTaL/dJMcahbSEar/hOvxCpKKCfk7sm1YAmFZ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byJTaL/dJMcahbSEar/hOvxCpKKCfk7sm1YAmFZ91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byJTaL/dJMcahbSEar/hOvxCpKKCfk7sm1YAmFZ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyJTaL%2FdJMcahbSEar%2FhOvxCpKKCfk7sm1YAmFZ91%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1405&quot; height=&quot;519&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYmTJ4/dJMcaa4TtYo/N4eo7qmuNhbkIKkjlIsGU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYmTJ4/dJMcaa4TtYo/N4eo7qmuNhbkIKkjlIsGU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYmTJ4/dJMcaa4TtYo/N4eo7qmuNhbkIKkjlIsGU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYmTJ4%2FdJMcaa4TtYo%2FN4eo7qmuNhbkIKkjlIsGU0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;547&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;547&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-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;secret 문제에서는 PIE가 비활성화되어 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;disass에서 확인한 함수 주소가 실제 실행 주소와 동일했기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 주소로 직접 점프가 가능했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 본 문제에서는 PIE가 활성화되어 있어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;disass에서 확인되는 주소는 실제 실행 주소가 아닌 ELF 내부 오프셋이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 실행 시 base 주소가 결정되므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소 leak 없이는 해당 함수로 직접 점프할 수 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주소 leak e.g., printf(&quot;%p&quot;, get_shell)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGNDyc/dJMcacPa1QU/EX8g0PBjiBQbXwc35qhSJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGNDyc/dJMcacPa1QU/EX8g0PBjiBQbXwc35qhSJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGNDyc/dJMcacPa1QU/EX8g0PBjiBQbXwc35qhSJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGNDyc%2FdJMcacPa1QU%2FEX8g0PBjiBQbXwc35qhSJ0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1032&quot; height=&quot;134&quot; data-origin-width=&quot;1032&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sEmx1/dJMcahQueRL/DAXTbuYkcLt07rkLzFvHIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sEmx1/dJMcahQueRL/DAXTbuYkcLt07rkLzFvHIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sEmx1/dJMcahQueRL/DAXTbuYkcLt07rkLzFvHIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsEmx1%2FdJMcahQueRL%2FDAXTbuYkcLt07rkLzFvHIK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1321&quot; height=&quot;623&quot; data-origin-width=&quot;1321&quot; data-origin-height=&quot;623&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$(명령): 괄호 안 명령을 먼저 실행 후, 그 출력 결과를 문자열로 바꿈&lt;/li&gt;
&lt;li&gt;&amp;lt;&amp;lt;&amp;lt;: 문자열을 stdin으로 넣음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13Utg/dJMcagjJTTz/jA86zdIpHtutB1cG3nQV70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13Utg/dJMcagjJTTz/jA86zdIpHtutB1cG3nQV70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13Utg/dJMcagjJTTz/jA86zdIpHtutB1cG3nQV70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13Utg%2FdJMcagjJTTz%2FjA86zdIpHtutB1cG3nQV70%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1233&quot; height=&quot;243&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 일단, 기본적으로 main 함수의 스택이 얼만큼 벌어져 있는지, 내가 입력하고자 하는 그 버퍼로부터 rbp+8 이라는 return address가 얼만큼 떨어져 있는지를 디버깅을 통해 알아내야 한다.&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;그리고 get_shell의 주소가 매번 바뀌기에, 프로그램을 실행할 때마다 그 주소를 가지고 와서 passing을 통해 동적으로 페이로드를 작성할 수 있는 기술 스택이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 프로그램이 실행될 때 get_shell()의 주소를 알려주니, 그 정보를 이용해 코드를 작성해 get_shell()을 실행하고자 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RZWNC/dJMcahpqG4M/d4ZdGmstfcBb7iINWJsTXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RZWNC/dJMcahpqG4M/d4ZdGmstfcBb7iINWJsTXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RZWNC/dJMcahpqG4M/d4ZdGmstfcBb7iINWJsTXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRZWNC%2FdJMcahpqG4M%2Fd4ZdGmstfcBb7iINWJsTXK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;540&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9pdKX/dJMcaiBOwuD/kIpKtIN4kozRckXe5Wiu00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9pdKX/dJMcaiBOwuD/kIpKtIN4kozRckXe5Wiu00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9pdKX/dJMcaiBOwuD/kIpKtIN4kozRckXe5Wiu00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9pdKX%2FdJMcaiBOwuD%2FkIpKtIN4kozRckXe5Wiu00%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1387&quot; height=&quot;589&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LxT6Y/dJMcaiIAwBq/nqXQT6u38n9C8uLRMs1u7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LxT6Y/dJMcaiIAwBq/nqXQT6u38n9C8uLRMs1u7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LxT6Y/dJMcaiIAwBq/nqXQT6u38n9C8uLRMs1u7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLxT6Y%2FdJMcaiIAwBq%2FnqXQT6u38n9C8uLRMs1u7k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;488&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;488&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;div style=&quot;position: relative; background-color: #ffffff; padding: 10px 25px 10px 65px; margin: 0.5em 0; border: 1px solid #787878; border-radius: 10px;&quot;&gt;
&lt;div style=&quot;position: absolute; top: -1px; left: 14px; width: 30px; height: 47px; background-color: #4a4a4a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;position: absolute; top: 17px; left: 14px; width: 0; height: 0; border: 15px solid; border-color: transparent transparent #ffffff transparent;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;위아래 변수 추가시, payload 다시 계산 하는 연습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765636943980&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void vuln(){
  int x;          // 4바이트
  char buf[0x40]; // 64바이트
  long y;         // 8바이트 (x86-64에서 long=8)
  gets(buf);
}&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;buf만 있을 경우엔&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;buf = rbp-0x40&lt;/li&gt;
&lt;li&gt;ret = rbp+8&lt;/li&gt;
&lt;li&gt;거리 = 0x40 + 8 = 0x48&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1765637059726&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;높은 주소
[rbp+8]   : return address   &amp;lt;-- 우리가 덮고 싶은 곳
[rbp+0]   : saved rbp
--------------------------------
[rbp-0x8] : (padding or y의 일부 위치일 수도)
[rbp-0x10]: y (8 bytes)
[rbp-0x14]: padding (정렬 맞추기)
[rbp-0x18]: x (4 bytes) + padding
[rbp-0x58] ~ [rbp-0x19]: buf[0x40] (64 bytes)
낮은 주소&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;위 배치에서 buf 시작이 rbp-0x58이면 거리 = 0x58 + 8 = 0x60&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lp2ga/dJMcafZq7sK/acnVsK1ijKoaU5mOYp8BRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lp2ga/dJMcafZq7sK/acnVsK1ijKoaU5mOYp8BRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lp2ga/dJMcafZq7sK/acnVsK1ijKoaU5mOYp8BRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flp2ga%2FdJMcafZq7sK%2FacnVsK1ijKoaU5mOYp8BRk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;560&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9fKSY/dJMcahbSEck/h48qTQ5F8t9wl6X8OFeEHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9fKSY/dJMcahbSEck/h48qTQ5F8t9wl6X8OFeEHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9fKSY/dJMcahbSEck/h48qTQ5F8t9wl6X8OFeEHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9fKSY%2FdJMcahbSEck%2Fh48qTQ5F8t9wl6X8OFeEHK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1352&quot; height=&quot;402&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YrkgC/dJMcaa4TtZc/kcV95DjlLgdOgOQr2NKgWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YrkgC/dJMcaa4TtZc/kcV95DjlLgdOgOQr2NKgWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YrkgC/dJMcaa4TtZc/kcV95DjlLgdOgOQr2NKgWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYrkgC%2FdJMcaa4TtZc%2FkcV95DjlLgdOgOQr2NKgWK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;246&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbm0mJ/dJMcai9Eytr/bh2z12rSoaE2kgbDrN19vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbm0mJ/dJMcai9Eytr/bh2z12rSoaE2kgbDrN19vK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbm0mJ/dJMcai9Eytr/bh2z12rSoaE2kgbDrN19vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcbm0mJ%2FdJMcai9Eytr%2Fbh2z12rSoaE2kgbDrN19vK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1291&quot; height=&quot;434&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzzH7/dJMcai9Eytx/jICuiAvB1yl0fNgWgKhAXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzzH7/dJMcai9Eytx/jICuiAvB1yl0fNgWgKhAXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzzH7/dJMcai9Eytx/jICuiAvB1yl0fNgWgKhAXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzzH7%2FdJMcai9Eytx%2FjICuiAvB1yl0fNgWgKhAXK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;122&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAXrJ/dJMcafd4u9X/PkhfL8P4zJPgVtWHzm5G21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAXrJ/dJMcafd4u9X/PkhfL8P4zJPgVtWHzm5G21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAXrJ/dJMcafd4u9X/PkhfL8P4zJPgVtWHzm5G21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAXrJ%2FdJMcafd4u9X%2FPkhfL8P4zJPgVtWHzm5G21%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;614&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;614&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 프로그램이 출력하는 주소를 받아서 (addr)&lt;/li&gt;
&lt;li&gt;2. 그 주소를 정수로 파싱하고&lt;/li&gt;
&lt;li&gt;3. offset만큼 채운 뒤&lt;/li&gt;
&lt;li&gt;4. ret에 addr을 덮어 쓴 payload를 보내고&lt;/li&gt;
&lt;li&gt;5. 쉘이 뜨면 interactive()로 직접 조작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSsuo/dJMcad1zq3v/5ZZXqSlueIyk7LHNdbpwKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSsuo/dJMcad1zq3v/5ZZXqSlueIyk7LHNdbpwKK/img.png&quot; data-alt=&quot;b: 문자열을 바이너리로 받겠다는 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSsuo/dJMcad1zq3v/5ZZXqSlueIyk7LHNdbpwKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSsuo%2FdJMcad1zq3v%2F5ZZXqSlueIyk7LHNdbpwKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1410&quot; height=&quot;556&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;b: 문자열을 바이너리로 받겠다는 의미&lt;/figcaption&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;recvuntill(b&quot;addr:&quot;): &quot;addr&quot; 문자열이 나올 때까지 기다리겠다는 의미&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;recvline(): 한 줄 읽고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;decode(): 문자열로 변환하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strip(): 앞뒤 공백 자르고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; line에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm9yBZ/dJMcagcZdJV/kYCVhrZ7ap2aXAF646YwH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm9yBZ/dJMcagcZdJV/kYCVhrZ7ap2aXAF646YwH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm9yBZ/dJMcagcZdJV/kYCVhrZ7ap2aXAF646YwH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm9yBZ%2FdJMcagcZdJV%2FkYCVhrZ7ap2aXAF646YwH0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1410&quot; height=&quot;551&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edEP75/dJMcadN16wt/OgD5l9lh4lK0VMJBEVuUvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edEP75/dJMcadN16wt/OgD5l9lh4lK0VMJBEVuUvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edEP75/dJMcadN16wt/OgD5l9lh4lK0VMJBEVuUvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedEP75%2FdJMcadN16wt%2FOgD5l9lh4lK0VMJBEVuUvk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1396&quot; height=&quot;374&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘 획득 -&amp;gt; 서버 장악&lt;/p&gt;</description>
      <category>CS/소프트웨어보안</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/119</guid>
      <comments>https://arsenic-dev.tistory.com/119#entry119comment</comments>
      <pubDate>Sun, 14 Dec 2025 00:20:49 +0900</pubDate>
    </item>
    <item>
      <title>7-1. BoF Exploit 1</title>
      <link>https://arsenic-dev.tistory.com/118</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;BoF (Buffer Overflow)&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 입력 값에 대한 길일 검증을 하지 않아, 프로그래머가 할당한 크기의 버퍼보다 큰 데이터를 입력받아 메모리의 다른 영역을 오염시키는 취약점이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버퍼: 문자열을 입력받거나 특정 스택에서 공간을 할당 받는 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwlj48/dJMcaiV67C3/wGqia8LPyMCUoonTcHyzo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwlj48/dJMcaiV67C3/wGqia8LPyMCUoonTcHyzo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwlj48/dJMcaiV67C3/wGqia8LPyMCUoonTcHyzo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwlj48%2FdJMcaiV67C3%2FwGqia8LPyMCUoonTcHyzo0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;399&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;399&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;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 실습 준비&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제 코드 작성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0VCQV/dJMcag47j4V/gENriKACnNI6IY5TYfjbA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0VCQV/dJMcag47j4V/gENriKACnNI6IY5TYfjbA0/img.png&quot; data-alt=&quot;vi bof_sample.c&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0VCQV/dJMcag47j4V/gENriKACnNI6IY5TYfjbA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0VCQV%2FdJMcag47j4V%2FgENriKACnNI6IY5TYfjbA0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;379&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vi bof_sample.c&lt;/figcaption&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;gets 함수는 사용자의 입력 값에 대한 길이 제한이 없기에, 사용자는 프로그래머가 지정한 buf의 사이즈인 16 바이트를 넘어, 더 큰 입력을 입력할 수 있게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 스택에 할당된 16 바이트를 넘어서 return address까지 바꾸거나, 또는 그 이상의 행위를 할 수 있는 취약점&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;secret() 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main 함수에서 호출되지 않는 함수 -&amp;gt; stack buffer overflow를 이용해 강제 실행 가능&lt;/li&gt;
&lt;li&gt;이 함수를 강제로 호출하는 것이 '실습 1'의 목표&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ vi 사용법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i (입력 시작)&lt;/li&gt;
&lt;li&gt;exc (입력 탈출)&lt;/li&gt;
&lt;li&gt;shift -&amp;gt; :wq (w: wrtie 저장 / q: 탈출 종료 0 -&amp;gt; vi 탈출 종료)&lt;/li&gt;
&lt;/ul&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;b&gt;소스 코드 컴파일&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 초급 실습을 위해 모든 보호 기법 제거하여 컴파일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YTEmw/dJMcafd4eLi/Eef8ktQkFfyHuPKqMu66LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YTEmw/dJMcafd4eLi/Eef8ktQkFfyHuPKqMu66LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YTEmw/dJMcafd4eLi/Eef8ktQkFfyHuPKqMu66LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYTEmw%2FdJMcafd4eLi%2FEef8ktQkFfyHuPKqMu66LK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;87&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;87&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gcc: C 컴파일러&lt;/li&gt;
&lt;li&gt;bof_sample: 출력 파일 이름 (-o: output)&lt;/li&gt;
&lt;li&gt;bof_sample.c: 컴파일 할 소스 코드 (방금 작성한 예제 코드)&lt;/li&gt;
&lt;li&gt;-fno-stack-protector: 스택 보호 기법인 Stack Canary 비활성화
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;canary: stack BOF 탐지 위해, 반환 주소 앞에 삽입되는 무결성 검사 값으로, canary 값이 변하면 BOF 발생으로 판단하여 프로그램을 즉시 종료함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;-z execstack: 스택에 실행 권한 부여 (기본적으론 컴파일 시 실행 권한 부여 X)&lt;/li&gt;
&lt;li&gt;-no-pie: PIE 비활성화 -&amp;gt; 실행 파일의 코드 주소가 고정되게 함&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASLR을 비활성화하는 옵션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ PIE: Position Independent Executable의 약자로, 실행 파일을 위치 독립적으로 로드될 수 있게 만들어, ASLR이 적용될 때 실행 파일 코드도 매 실행마다 다른 주소에 배치될 수 있게 하는 기능이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASLR: &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;공유 라이브러리의 위치를 랜덤화하여 ROP(Return Oriented Programming)&amp;nbsp;공격을 방지하기 위한 기술이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;ROP: &lt;span style=&quot;color: #222222; text-align: start;&quot;&gt;정상적으로 존재하는 어셈블리 Return 조각들을 연결하여 악성 코드의 조합으로 만들어 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LlSv3/dJMcaiIAfGh/t7fA3PWWexjgcqkCIgegh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LlSv3/dJMcaiIAfGh/t7fA3PWWexjgcqkCIgegh0/img.png&quot; data-alt=&quot;컴파일 옵션 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LlSv3/dJMcaiIAfGh/t7fA3PWWexjgcqkCIgegh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLlSv3%2FdJMcaiIAfGh%2Ft7fA3PWWexjgcqkCIgegh0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;225&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컴파일 옵션 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⭐ 2. 실습 1: BOF를 이용하여 호출되지 않는 함수를 호출&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Return Address 덮어 쓰기에 대한 이해&lt;/b&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;1. 소스 코드를 모른다는 가정하에 어떤 함수가 존재하는지 탐색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z2EcC/dJMcacn6GGK/bKi1JQuldpemBGBTKlFgCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z2EcC/dJMcacn6GGK/bKi1JQuldpemBGBTKlFgCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z2EcC/dJMcacn6GGK/bKi1JQuldpemBGBTKlFgCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz2EcC%2FdJMcacn6GGK%2FbKi1JQuldpemBGBTKlFgCK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1093&quot; height=&quot;206&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;206&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;-s: symbol table 출력 옵션&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디버그 모드로 컴파일을 하거나 심볼을 살려놓고 컴파일을 하게 되면 위와 같이 심볼들이 존재함&lt;/li&gt;
&lt;li&gt;어떤 함수들이 존재하는지 미리 확인 가능&lt;/li&gt;
&lt;li&gt;secret function이 존재하는 것을 확인할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. pwndbg를 사용해 bof_sample 분석 - main 함수 분석&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFrXhV/dJMcaaqh6Mo/4PwkKqpvc9GTzUHBv33111/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFrXhV/dJMcaaqh6Mo/4PwkKqpvc9GTzUHBv33111/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFrXhV/dJMcaaqh6Mo/4PwkKqpvc9GTzUHBv33111/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFrXhV%2FdJMcaaqh6Mo%2F4PwkKqpvc9GTzUHBv33111%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1099&quot; height=&quot;308&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디버거로 프로그램 실행 -&amp;gt; 메모리 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dO7JR3/dJMcafrBgBP/kQqiu5qsa1M1V0orcUhhDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dO7JR3/dJMcafrBgBP/kQqiu5qsa1M1V0orcUhhDk/img.png&quot; data-alt=&quot;disass main: main 함수의 assembly 코드 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dO7JR3/dJMcafrBgBP/kQqiu5qsa1M1V0orcUhhDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdO7JR3%2FdJMcafrBgBP%2FkQqiu5qsa1M1V0orcUhhDk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1139&quot; height=&quot;407&quot; data-origin-width=&quot;1139&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;disass main: main 함수의 assembly 코드 확인 가능&lt;/figcaption&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. main 함수 진입
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;push rbp: 이전 함수의 rbp 값을 스택에 저장(백업) -&amp;gt; 나중에 함수 끝나고 원래대로 되돌리기 위함&lt;/li&gt;
&lt;li&gt;mov rbp, rsp: 현재 스택 포인터 rsp를 프레임 포인터 rbp로 고정 -&amp;gt; 현재 함수의 기준점을 rbp로 잡음&lt;/li&gt;
&lt;li&gt;sub rsp, 0x10: 스택에 16바이트만큼 공간 확보&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. 첫 번째 printf 함수 호출 준비/호출
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;lea rax, [rip+0xe8b]:&amp;nbsp; rip+0xe8b에 있는 문자열의 주소를 rax에 넣음&lt;/li&gt;
&lt;li&gt;mov rdi, rax: printf의 첫 번째 인자 rdi에 주소값을 넣음 -&amp;gt; printf(0x40202e) 준비 완료&lt;/li&gt;
&lt;li&gt;mov eax, 0x0: eax를 0으로 맞춤 (관례)&lt;/li&gt;
&lt;li&gt;call 0x401070 &amp;lt;printf@plt&amp;gt;: printf 호출 (@plt는 실제 libc의 printf로 연결해주는 점프 테이블 PLT 경유 호출)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. gets 함수 호출 준비/호출
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;u&gt;lea rax, [rbp-0x10]:&amp;nbsp; 버퍼 시작 주소 rbp-0x10를 rax에 넣음 (확보한 16바이트 버퍼의 시작점)&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;mov rdi, rax: gets의 첫 번째 인자 rdi에 버퍼 주소를 넣음 -&amp;gt; gets(buf) 준비 완료&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;mov eax, 0x0: eax를 0으로 맞춤 (관례)&lt;/li&gt;
&lt;li&gt;call 0x401080 &amp;lt;gets@plt&amp;gt;: gets(buf) 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4. 두 번째 printf 함수 호출 준비/호출
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;lea rax, [rbp-0x10]:&amp;nbsp; 버퍼 주소를 rax에 로드&lt;/li&gt;
&lt;li&gt;mov rsi, rax: printf의 두 번째 인자 rsi에 버퍼 주소를 넣음&lt;/li&gt;
&lt;li&gt;lea rax, [rip+0xe6c]: 두 번째 printf에서 쓸 포맷 스트링 주소를 rax에 로드&lt;/li&gt;
&lt;li&gt;mov rdi, rax: printf 첫 번째 인자 rdi에 포맷 스트링 주소를 넣음&lt;/li&gt;
&lt;li&gt;mov eax, 0x0: eax를 0으로 맞춤 (관례)&lt;/li&gt;
&lt;li&gt;call 0x401070 &amp;lt;printf@plt&amp;gt;: printf(fmt, buf) 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;5. 함수 종료 (리턴)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mov eax, 0x0: main의 반환값을 0으로 설정 (return 0;)&lt;/li&gt;
&lt;li&gt;leave: mov rsp, rbp + &lt;u&gt;pop rbp&lt;/u&gt;를 합친 축약 명령 -&amp;gt; 스택 프레임 정리 (로컬 공간 해제 + rbp 복원)&lt;/li&gt;
&lt;li&gt;ret: &lt;u&gt;pop rip&lt;/u&gt; 축약 명령 -&amp;gt; 리턴 주소로 점프해서 함수 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택에 할당된 공간은 0x10&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; gets 함수를 사용할 경우 입력에 대한 크기 검증을 하지 않아 스택이 덮어 써지게 됨 (BOF)&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;3. pwndbg를 사용해 bof_sample 분석 - 프로그램을 실행 시켜 스택보다 큰 입력을 주어 테스트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/16Fah/dJMcabCJxTn/zHmiY6BW8jt2HNmfm4Saxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/16Fah/dJMcabCJxTn/zHmiY6BW8jt2HNmfm4Saxk/img.png&quot; data-alt=&quot;'A' 16개, 'B' 8개, 'C' 8개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/16Fah/dJMcabCJxTn/zHmiY6BW8jt2HNmfm4Saxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F16Fah%2FdJMcabCJxTn%2FzHmiY6BW8jt2HNmfm4Saxk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1074&quot; height=&quot;456&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'A' 16개, 'B' 8개, 'C' 8개&lt;/figcaption&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;스택보다 큰 값을 입력했을 때 SIGSEGV, Segmentation fault와 Invalid address ... 를 확인 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 BOF로 인해 rbp+8(Ret addr, 되돌아가야 할 주소)이 문자 'C'(0x42)로 덮어 써지면서 잘못된 주소로 인한 crash&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ rbp+8 == rip 인 것은, 'AAAAAAAAAAAAAAAABBBBBBBBCCCCCCCC'을 16바이트짜리 buf에 입력했을 때, B 8개는 rbp에, 그리고 C는 rip에 저장된 것을 보고 유추한 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rbp에 8개가 찬 후, 넘친 것은 rip에 저장 -&amp;gt; rbp는 8바이트이고, rbp 다음엔 rip가 오는구나!&lt;/li&gt;
&lt;/ul&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;gt; 다른 함수를 호출하기 위한 아이디어&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 BOF를 이용하여 return address(rip, 다음에 실행될 코드 주소)를 변조 시킬 수 있음&lt;/li&gt;
&lt;li&gt;해당 행위를 위해서 main 함수 내의 스택의 상태를 알고 있어야 덮어 쓸 수 있음&lt;/li&gt;
&lt;li&gt;secret 함수의 주소를 알고 있어야 함 -&amp;gt; 이 함수 주소를 강제로 rbp+8, 즉 return address에 넣어 강제 호출 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B3vba/dJMcacuSCfu/Klwf3YldKQlyGF7jBKYn61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B3vba/dJMcacuSCfu/Klwf3YldKQlyGF7jBKYn61/img.png&quot; data-alt=&quot;rbp, rsp 위치 동일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B3vba/dJMcacuSCfu/Klwf3YldKQlyGF7jBKYn61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB3vba%2FdJMcacuSCfu%2FKlwf3YldKQlyGF7jBKYn61%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;477&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rbp, rsp 위치 동일&lt;/figcaption&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;※ i r $rsp: info register $rsp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diHY7q/dJMcahCWBaE/mRHaEwvMNirrOvpqDbfSG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diHY7q/dJMcahCWBaE/mRHaEwvMNirrOvpqDbfSG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diHY7q/dJMcahCWBaE/mRHaEwvMNirrOvpqDbfSG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiHY7q%2FdJMcahCWBaE%2FmRHaEwvMNirrOvpqDbfSG0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1093&quot; height=&quot;414&quot; data-origin-width=&quot;1093&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOFIY0/dJMcaiaMZxw/uWcCIMpNP8GBTOSXBtp6g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOFIY0/dJMcaiaMZxw/uWcCIMpNP8GBTOSXBtp6g0/img.png&quot; data-alt=&quot;0x10만큼 stack에 할당받은 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOFIY0/dJMcaiaMZxw/uWcCIMpNP8GBTOSXBtp6g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOFIY0%2FdJMcaiaMZxw%2FuWcCIMpNP8GBTOSXBtp6g0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1030&quot; height=&quot;458&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;0x10만큼 stack에 할당받은 모습&lt;/figcaption&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;rbp+8 즉, 0x7fffffffffffe108은 main 함수가 끝나고 돌아갈 주소가 담겨 있는 스택의 주소이다. (pop 하며 위로가며 읽음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDD62d/dJMcajnbey3/6JYC17qUth2ORJossULMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDD62d/dJMcajnbey3/6JYC17qUth2ORJossULMhk/img.png&quot; data-alt=&quot;c: continue&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDD62d/dJMcajnbey3/6JYC17qUth2ORJossULMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDD62d%2FdJMcajnbey3%2F6JYC17qUth2ORJossULMhk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;414&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;c: continue&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rbp가 0x7fffffffffffe100 이므고, rax에는 0x7fffffffffffe0f0, 즉 현재 스택의 위치가 담긴다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YTOkT/dJMcaaw3Sv7/BT9CF8K1LkxWnOXhm1Nos0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YTOkT/dJMcaaw3Sv7/BT9CF8K1LkxWnOXhm1Nos0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YTOkT/dJMcaaw3Sv7/BT9CF8K1LkxWnOXhm1Nos0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYTOkT%2FdJMcaaw3Sv7%2FBT9CF8K1LkxWnOXhm1Nos0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;421&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjD88/dJMcabQgx6M/86iVwbgUDQ97MVI43rKjpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjD88/dJMcabQgx6M/86iVwbgUDQ97MVI43rKjpk/img.png&quot; data-alt=&quot;$rbp+8: ret 주소 / $rsp: 스택 꼭대기 주소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjD88/dJMcabQgx6M/86iVwbgUDQ97MVI43rKjpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjD88%2FdJMcabQgx6M%2F86iVwbgUDQ97MVI43rKjpk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;353&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;$rbp+8: ret 주소 / $rsp: 스택 꼭대기 주소&lt;/figcaption&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;-&amp;gt; 24개의 문자를 넣고, 그 다음에 원하는 주소를 넣게 되면 그 주소로 덮어 쓸 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e0f0 ~ e108까지를 24개의 문자로 채움&lt;/li&gt;
&lt;li&gt;그 다음이 ret 주소 부분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qfryb/dJMcabQgx6P/jktSuzTzIfcANvwqxUqod0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qfryb/dJMcabQgx6P/jktSuzTzIfcANvwqxUqod0/img.png&quot; data-alt=&quot;$rsp 보다는 인자로 사용한 $rbp-0x10을 사용하는 것이 더 정확함 (rsp는 변수가 하나일 때만 사용 가능)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qfryb/dJMcabQgx6P/jktSuzTzIfcANvwqxUqod0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQfryb%2FdJMcabQgx6P%2FjktSuzTzIfcANvwqxUqod0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;281&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;$rsp 보다는 인자로 사용한 $rbp-0x10을 사용하는 것이 더 정확함 (rsp는 변수가 하나일 때만 사용 가능)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HX15d/dJMcagqvrb0/AvpKWS5ftmWolMqZNAcCKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HX15d/dJMcagqvrb0/AvpKWS5ftmWolMqZNAcCKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HX15d/dJMcagqvrb0/AvpKWS5ftmWolMqZNAcCKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHX15d%2FdJMcagqvrb0%2FAvpKWS5ftmWolMqZNAcCKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;453&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecyQrj/dJMcai9Eoin/UlYK80mfyj2YPeB18HtVZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecyQrj/dJMcai9Eoin/UlYK80mfyj2YPeB18HtVZk/img.png&quot; data-alt=&quot;리틀엔디안 -&amp;amp;gt; 00 00 00 00 00 40 11 76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecyQrj/dJMcai9Eoin/UlYK80mfyj2YPeB18HtVZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecyQrj%2FdJMcai9Eoin%2FUlYK80mfyj2YPeB18HtVZk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;339&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리틀엔디안 -&amp;gt; 00 00 00 00 00 40 11 76&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HuoPS/dJMcahJJlL0/8dEFKeC7gFM27DuVfB6mc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HuoPS/dJMcahJJlL0/8dEFKeC7gFM27DuVfB6mc1/img.png&quot; data-alt=&quot;b* main+81: leave 명령어 실행 전 break&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HuoPS/dJMcahJJlL0/8dEFKeC7gFM27DuVfB6mc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHuoPS%2FdJMcahJJlL0%2F8dEFKeC7gFM27DuVfB6mc1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1102&quot; height=&quot;374&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;b* main+81: leave 명령어 실행 전 break&lt;/figcaption&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;-ne: n은 맨 끝에 줄바꿈 \n을 붙이지 말라는 의미이고, e는 이스케이프 문자로 출력하라는 의미이다.&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;이때, PIE가 켜져 있으면 시크릿 주소가 매번 바뀌기에 위와 같은 방법 적용이 어렵다. (시크릿 주소로 점프 어려움)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k23Xd/dJMcabQgx81/KDlHcG6l8csKKxRUxM4Ndk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k23Xd/dJMcabQgx81/KDlHcG6l8csKKxRUxM4Ndk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k23Xd/dJMcabQgx81/KDlHcG6l8csKKxRUxM4Ndk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk23Xd%2FdJMcabQgx81%2FKDlHcG6l8csKKxRUxM4Ndk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1114&quot; height=&quot;367&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;367&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;참고로, secret 함수 호출이 끝나고 되돌아가려고 rbp를 보면 aaaaaaaa로 깨져 있기에, 프로그램이 죽는다. (crash)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 실습 2: 64비트 환경에서 Shell Code 실행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;보호기법이 적용되지 않은 스택에 쉘코드를 어떻게 올리고 실행할 수 있는지&lt;/b&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;실제 공격자는 Shell Code를 스택에 적재하여 shell을 실행시키는 것을 목표로 함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택 영역에서 실행 권한이 존재할 때&lt;/li&gt;
&lt;li&gt;권한이 없다면 다른 기법을 사용해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격의 원리는 실습 1과 같으나, 어떻게 스택에 쉘코드를 적재하고 실행할지 고민 필요&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;0. 실습 준비&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnbODA/dJMcagqvrfj/Ko67cYMX97iqioqGhoxIVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnbODA/dJMcagqvrfj/Ko67cYMX97iqioqGhoxIVK/img.png&quot; data-alt=&quot;buf 크기:16바이트 -&amp;amp;gt; 64바이트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnbODA/dJMcagqvrfj/Ko67cYMX97iqioqGhoxIVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnbODA%2FdJMcagqvrfj%2FKo67cYMX97iqioqGhoxIVK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;500&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;buf 크기:16바이트 -&amp;gt; 64바이트&lt;/figcaption&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;1. 스택 영역의 실행 권한 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQrNh/dJMcaajwrjT/3tj3kbkqAVlXuuoDP0WVWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQrNh/dJMcaajwrjT/3tj3kbkqAVlXuuoDP0WVWK/img.png&quot; data-alt=&quot;-l: loadable program headers(세그먼트) 목록을 출력하라는 옵션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQrNh/dJMcaajwrjT/3tj3kbkqAVlXuuoDP0WVWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQrNh%2FdJMcaajwrjT%2F3tj3kbkqAVlXuuoDP0WVWK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;504&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;-l: loadable program headers(세그먼트) 목록을 출력하라는 옵션&lt;/figcaption&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;Stack: Executable -&amp;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;2. exploit 도구 pwntools 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6VtLh/dJMcadgchFK/71QdZVkzpKwRQUtaYhuKY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6VtLh/dJMcadgchFK/71QdZVkzpKwRQUtaYhuKY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6VtLh/dJMcadgchFK/71QdZVkzpKwRQUtaYhuKY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6VtLh%2FdJMcadgchFK%2F71QdZVkzpKwRQUtaYhuKY1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1005&quot; height=&quot;220&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;220&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;3. shell code&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HRjQp/dJMcagcY3u9/MLkj16l8IZvkBkBR9arhJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HRjQp/dJMcagcY3u9/MLkj16l8IZvkBkBR9arhJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HRjQp/dJMcagcY3u9/MLkj16l8IZvkBkBR9arhJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHRjQp%2FdJMcagcY3u9%2FMLkj16l8IZvkBkBR9arhJk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;159&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3vLdR/dJMcaihyTuE/RHTiAdvmoL2ea9Ni4pQfok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3vLdR/dJMcaihyTuE/RHTiAdvmoL2ea9Ni4pQfok/img.png&quot; data-alt=&quot;buf address에는 이 주소를 사용해 돌아갈 주소를 지정하는 것인데, 돌아갈 주소의 경우 얻는 과정 생량 (사유: 넘 어렵)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3vLdR/dJMcaihyTuE/RHTiAdvmoL2ea9Ni4pQfok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3vLdR%2FdJMcaihyTuE%2FRHTiAdvmoL2ea9Ni4pQfok%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;479&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;buf address에는 이 주소를 사용해 돌아갈 주소를 지정하는 것인데, 돌아갈 주소의 경우 얻는 과정 생량 (사유: 넘 어렵)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0OjBh/dJMcafd4lmB/T3Tvkh2o0mjtJkYnqNblzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0OjBh/dJMcafd4lmB/T3Tvkh2o0mjtJkYnqNblzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0OjBh/dJMcafd4lmB/T3Tvkh2o0mjtJkYnqNblzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0OjBh%2FdJMcafd4lmB%2FT3Tvkh2o0mjtJkYnqNblzK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;460&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;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;이때 만약, alr이 켜져 있으면 계속 랜덤으로 되기에 원하는 주소로 점프하는 상황이 조금 어렵게 된다.&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;즉, aslr이 켜져 있을 때 정확한 위치로 점프하고 싶으면 다른 취약점이나 버퍼 오버플로우를 체이닝 하여 그 주소를 알아내야 하는 번거로움이 생긴다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체이닝: 최종 공격에 필요한 정보/조건을 만들기 위해, 여러 취약점(또는 여러 단계의 페이로드)을 순서대로 연결해서 쓰는 것&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>CS/소프트웨어보안</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/118</guid>
      <comments>https://arsenic-dev.tistory.com/118#entry118comment</comments>
      <pubDate>Sat, 13 Dec 2025 18:50:58 +0900</pubDate>
    </item>
    <item>
      <title>8. Toyransome</title>
      <link>https://arsenic-dev.tistory.com/117</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Ransomware 소개&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecB86d/dJMcagxesRN/NIilPD3WQCr0Rgtn1RACGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecB86d/dJMcagxesRN/NIilPD3WQCr0Rgtn1RACGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecB86d/dJMcagxesRN/NIilPD3WQCr0Rgtn1RACGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecB86d%2FdJMcagxesRN%2FNIilPD3WQCr0Rgtn1RACGk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;337&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ransomware&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ransom(몸값)과 software(소프트웨어)의 합성어&lt;/li&gt;
&lt;li&gt;시스템을 잠그거나 데이터를 암호화해 사용할 수 없도록 하고 이를 인질로 금전을 요구하는 악성 프로그램&lt;/li&gt;
&lt;li&gt;신뢰할 수 없는 사이트, 스팸메일, 파일공유 사이트 등을 통해 유포됨&amp;nbsp;&lt;/li&gt;
&lt;li&gt;이렇게 특정한 경로로 피해자 PC에 접근을 한 후, 바이러스를 통해 피해자가 가지고 있는 파일들을 암호화 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;※ 실습과 달리, 현대의 암호화는 키 없이 복호화가 불가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX1OQh/dJMcaihwkNI/zPG1GQ6wDokCGy7025M52K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX1OQh/dJMcaihwkNI/zPG1GQ6wDokCGy7025M52K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX1OQh/dJMcaihwkNI/zPG1GQ6wDokCGy7025M52K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX1OQh%2FdJMcaihwkNI%2FzPG1GQ6wDokCGy7025M52K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;313&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;랜섬웨어는 위와 같이 고유한 확장자와 함께 감염된 시스템 드라이브의 파일을 암호화한다. 암호화되면서 파일이 손상되어 정상적으로 실행하거나 읽을 수 없게 되고, 해커는 복호화 키에 대해 거액의 돈을 요구한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdotkQ/dJMcagjHm2M/GOK5ZrCmh2cLZqeKb7v4tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdotkQ/dJMcagjHm2M/GOK5ZrCmh2cLZqeKb7v4tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdotkQ/dJMcagjHm2M/GOK5ZrCmh2cLZqeKb7v4tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdotkQ%2FdJMcagjHm2M%2FGOK5ZrCmh2cLZqeKb7v4tK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1185&quot; height=&quot;150&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;간단한 복호화 로직&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;xor 복호화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xor 연산은 비트 단위의 연산으로, 두 개의 비트를 비교하여 서로 다를 때 '1', 같을 때 '0'을 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A = 1010, B = 1100 (이진수)&lt;/li&gt;
&lt;li&gt;C = A ^ B = 1010 ^ 1100 = 0110 (암호화 과정, key = B)&lt;/li&gt;
&lt;li&gt;A = C ^ B = A ^ B ^ B = A ^ 0 = A (복호화&amp;nbsp; 과정, key = B)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pzcox/dJMcaiohhWI/lwO7TorhvVnWTKrURgU5h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pzcox/dJMcaiohhWI/lwO7TorhvVnWTKrURgU5h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pzcox/dJMcaiohhWI/lwO7TorhvVnWTKrURgU5h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPzcox%2FdJMcaiohhWI%2FlwO7TorhvVnWTKrURgU5h0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;323&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;323&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;-&amp;gt; xor 연산은 대칭적이며 같은 키를 이용하여 암호화와 복호화를 모두 수행할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;다중 암호화와 복호화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화를 여러 단계로 적용하였을 때, 복호화 과정은 암호화 한 순서의 &lt;u&gt;역순&lt;/u&gt;으로 해독해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMOWy/dJMcahbP4Ze/sXFNfEu4FKf2Qt70kxMosk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMOWy/dJMcahbP4Ze/sXFNfEu4FKf2Qt70kxMosk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMOWy/dJMcahbP4Ze/sXFNfEu4FKf2Qt70kxMosk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMOWy%2FdJMcahbP4Ze%2FsXFNfEu4FKf2Qt70kxMosk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;477&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;477&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;※ xor 암호화는 순서 바꿔도 상관 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;실습&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실습 목적&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;암호화되어 있는 파일 복호화&lt;/li&gt;
&lt;li&gt;바이너리 파일을 분석하여 복호화 로직 구하여 평문 flag 획득&lt;/li&gt;
&lt;/ul&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;b&gt;문제 접근 방식&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;toryransome2를 제외하고는 소스코드가 없음&lt;/li&gt;
&lt;li&gt;따라서 리버스 엔지니어링을 통해 바이너리를 분석 후 flag 획득&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. toyransome2&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 소스코드 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&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;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flag.enc: 암호화된 flag 파일&lt;/li&gt;
&lt;li&gt;toyransome2: 암호화 바이너리 파일&lt;/li&gt;
&lt;li&gt;toyransome2.txt: 암호화 바이너리 파일의 소스코드 (C 언어)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSbj46/dJMcabWZI7S/JB7tPuPCqcK64mVuMwiVEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSbj46/dJMcabWZI7S/JB7tPuPCqcK64mVuMwiVEK/img.png&quot; data-alt=&quot;ll -A: ls long all&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSbj46/dJMcabWZI7S/JB7tPuPCqcK64mVuMwiVEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSbj46%2FdJMcabWZI7S%2FJB7tPuPCqcK64mVuMwiVEK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1557&quot; height=&quot;162&quot; data-origin-width=&quot;1557&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ll -A: ls long all&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPSOqR/dJMcad1wS3s/F6K3TamK87NLDJEvvewnh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPSOqR/dJMcad1wS3s/F6K3TamK87NLDJEvvewnh1/img.png&quot; data-alt=&quot;target_file에 암호화 할 파일을 넣으면 됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPSOqR/dJMcad1wS3s/F6K3TamK87NLDJEvvewnh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPSOqR%2FdJMcad1wS3s%2FF6K3TamK87NLDJEvvewnh1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1916&quot; height=&quot;273&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;target_file에 암호화 할 파일을 넣으면 됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/smLbj/dJMcadULm1v/GAafMi7gDg7PDpbj6jFiqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/smLbj/dJMcadULm1v/GAafMi7gDg7PDpbj6jFiqK/img.png&quot; data-alt=&quot;예시로 fake_flag.txt 파일을 만들어 암호화 한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/smLbj/dJMcadULm1v/GAafMi7gDg7PDpbj6jFiqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsmLbj%2FdJMcadULm1v%2FGAafMi7gDg7PDpbj6jFiqK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1153&quot; height=&quot;432&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예시로 fake_flag.txt 파일을 만들어 암호화 한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/18deH/dJMcaiPjmJn/vaN5JBtf5Tq7PMLSh3bxdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/18deH/dJMcaiPjmJn/vaN5JBtf5Tq7PMLSh3bxdk/img.png&quot; data-alt=&quot;toyransome2.txt&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/18deH/dJMcaiPjmJn/vaN5JBtf5Tq7PMLSh3bxdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F18deH%2FdJMcaiPjmJn%2FvaN5JBtf5Tq7PMLSh3bxdk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;630&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;toyransome2.txt&lt;/figcaption&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;toyransome2 바이너리에 타겟 파일을 넣으면 이 타겟 파일이 암호화되는 그런 로직이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타겟 파일을 읽어와 버퍼에 저장을 하고, key로 xor 암호화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 아스키 'A' = &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;0x41&lt;span&gt; = 0100 0001&lt;/span&gt;&lt;/span&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;먼저, fread 함수를 통해 buf에 타겟 파일을 담는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, fread의 반환 값은 읽은 바이트 수이기 때문에, r에는 파일의 길이가 담긴다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;r: flag_length&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나서 flag_length만큼 for문이 돌면서 암호화를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;※ main 함수의 인자&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;argc: 인자 개수&lt;/li&gt;
&lt;li&gt;argv: 인자로 들어가는 내용
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;e.g., argv[0] = &quot;./toyransome2&quot;, argv[1] = &quot;fake_flag.txt&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765015598786&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fp = fopen(strncat(argv[1], &quot;.enc&quot;, 4), &quot;wb+&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ argv[1] 뒤에 .enc를 붙여서 그 이름으로 바이너리(b) 파일을 새로 만들고(w) 읽기/쓰기 가능(+)하게 여는 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;XOR로 암호화된 것을 복원하려면?&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XOR로 암호화 된 것은 XOR로 복원하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XOR 연산은 &quot;A ^ B ^ B = A ^ 0 = A&quot; 이렇게 상쇄되는 특징이 있기에, 이를 이용해 복호화하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1765017488507&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;flag.enc&quot;,&quot;rb&quot;) as f_ptr:
    flag_data =f_ptr.read()

flag_key=&quot;8C9031DB7A03F189&quot;

flag_key=bytes.fromhex(flag_key)

plain_flag=b''

for i in range(len(flag_data)):
    plain_flag += bytes([flag_key[i%len(flag_key)]^flag_data[i]])

print(plain_flag)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;16진수 표기에서 A~F 는 대소문자를 가리지 않으므로 복호화할 때 대문자로 써도 결과 바이트 값이 완전히 동일하게 나온다.&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xePcB/dJMcajtUBu2/JjgCeGW20iTkUfiquel5QK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xePcB/dJMcajtUBu2/JjgCeGW20iTkUfiquel5QK/img.png&quot; data-alt=&quot;복호화 결과 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xePcB/dJMcajtUBu2/JjgCeGW20iTkUfiquel5QK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxePcB%2FdJMcajtUBu2%2FJjgCeGW20iTkUfiquel5QK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1898&quot; height=&quot;810&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과 1&lt;/figcaption&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;혹은 한 번 더 xor, 즉 한 번 더 암호화 해주는 방식으로도 복호화가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr5cYI/dJMcaa4QZhW/xz6tStAgkl8nwnfKWzgU2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr5cYI/dJMcaa4QZhW/xz6tStAgkl8nwnfKWzgU2k/img.png&quot; data-alt=&quot;복호화 결과 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr5cYI/dJMcaa4QZhW/xz6tStAgkl8nwnfKWzgU2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr5cYI%2FdJMcaa4QZhW%2Fxz6tStAgkl8nwnfKWzgU2k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1872&quot; height=&quot;166&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. toyransome3&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 바이너리 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flag.enc: 암호화된 flag 파일&lt;/li&gt;
&lt;li&gt;toyransome3: 암호화 바이너리 파일 (64bit ELF 파일 형식)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAJfH/dJMcaaKynln/971xZ9dJhJufuRHJHN4dG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAJfH/dJMcaaKynln/971xZ9dJhJufuRHJHN4dG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAJfH/dJMcaaKynln/971xZ9dJhJufuRHJHN4dG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAJfH%2FdJMcaaKynln%2F971xZ9dJhJufuRHJHN4dG1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;988&quot; height=&quot;140&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;140&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;b&gt;문제 풀이 팁&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 코드 제공 X -&amp;gt; 리버스 엔지니어링을 통해 어셈블리 분석하는 기술 필요&lt;/li&gt;
&lt;li&gt;IDA와 같은 리버싱 툴을 이용하여 어셈블리를 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YIfwN/dJMcacawYhS/FJli26HIZmcji6QNpGHbz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YIfwN/dJMcacawYhS/FJli26HIZmcji6QNpGHbz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YIfwN/dJMcacawYhS/FJli26HIZmcji6QNpGHbz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYIfwN%2FdJMcacawYhS%2FFJli26HIZmcji6QNpGHbz1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;565&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;565&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;pre id=&quot;code_1765019522764&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int __fastcall main(int argc, const char **argv, const char **envp)
{
  char v3; // r12
  char v4; // r12
  char *v5; // rdx
  int i; // [rsp+10h] [rbp-1040h]
  int j; // [rsp+10h] [rbp-1040h]
  int v10; // [rsp+14h] [rbp-103Ch]
  int v11; // [rsp+14h] [rbp-103Ch]
  FILE *stream; // [rsp+18h] [rbp-1038h]
  FILE *streama; // [rsp+18h] [rbp-1038h]
  char ptr[16]; // [rsp+30h] [rbp-1020h] BYREF
  unsigned __int64 v15; // [rsp+1038h] [rbp-18h]

  v15 = __readfsqword(0x28u);
  if ( argc == 2 )
  {
    stream = fopen(argv[1], &quot;rb&quot;);
    if ( stream )
    {
      v10 = fread(ptr, 1u, 0x1000u, stream);
      printf(&quot;%d bytes read\n&quot;, v10);
      for ( i = 0; i &amp;lt; v10; ++i )
      {
        v3 = ptr[i];
        ptr[i] = byte_204C[i % strlen(byte_204C)] ^ v3;
      }
      puts(ptr);
      for ( j = 0; j &amp;lt; v10; ++j )
      {
        v4 = ptr[j];
        ptr[j] = byte_2055[j % strlen(byte_2055)] ^ v4;
      }
      fclose(stream);
      v5 = (char *)argv[1];
      strcat(v5, &quot;.enc&quot;);
      streama = fopen(v5, &quot;wb+&quot;);
      v11 = fwrite(ptr, 1u, j, streama);
      printf(&quot;%d bytes encrypted\n&quot;, v11);
    }
    else
    {
      printf(&quot;can't open %s\n&quot;, argv[1]);
    }
  }
  else
  {
    puts(&quot;usage: ./toyransome3 [target_file]&quot;);
  }
  return __readfsqword(0x28u) ^ v15;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ IDA로 디컴파일 한 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLei50/dJMcaf6ajNj/XgSpyaPkkGj82JvVaU3lw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLei50/dJMcaf6ajNj/XgSpyaPkkGj82JvVaU3lw1/img.png&quot; data-alt=&quot;toyransome3 vs toyransome4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLei50/dJMcaf6ajNj/XgSpyaPkkGj82JvVaU3lw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLei50%2FdJMcaf6ajNj%2FXgSpyaPkkGj82JvVaU3lw1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2878&quot; height=&quot;1377&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1377&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;toyransome3 vs toyransome4&lt;/figcaption&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;toyransome2와 비교해 보면 가운데 for문만 다르다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;toyransome2는 for문이 한 번 있고, toyransome3는 for문이 두 번 있어 암호화가 두 번 된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DjdPk/dJMcahCUjFq/0HqT6kbKWvehXZO79Kd4ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DjdPk/dJMcahCUjFq/0HqT6kbKWvehXZO79Kd4ck/img.png&quot; data-alt=&quot;key 값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DjdPk/dJMcahCUjFq/0HqT6kbKWvehXZO79Kd4ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDjdPk%2FdJMcahCUjFq%2F0HqT6kbKWvehXZO79Kd4ck%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1144&quot; height=&quot;138&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;key 값&lt;/figcaption&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;첫 번째 XOR 연산의 key 값은 &quot;8c9031db7a03f189&quot;이고, 두 번째 XOR 연산의 key 값은 &quot;c9330180f7&quot;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'1'의 아스키 코드 = 0x31&lt;/li&gt;
&lt;li&gt;'z'의 아스키 코드 = 0x7a&lt;/li&gt;
&lt;li&gt;'3'의 아스키 코드 = 0x33&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중 암호화의 경우 역순으로 해독해야 한다. 물론, xor의 특성상 교환 법칙이 성립하여 현재 코드에선 순서가 중요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;toyransome2의 복호화 코드를 이용해 toyransome3의 복호화 코드를 짜면 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1765020992089&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;flag.enc&quot;,&quot;rb&quot;) as f_ptr:
    flag_data =f_ptr.read()

flag_key=&quot;c9330180f7&quot;

flag_key=bytes.fromhex(flag_key)

plain_flag=b''

for i in range(len(flag_data)):
    plain_flag += bytes([flag_key[i%len(flag_key)]^flag_data[i]])

flag_key=&quot;8c9031db7a03f189&quot;

flag_key=bytes.fromhex(flag_key)

for i in range(len(plain_flag)):
    plain_flag += bytes([flag_key[i%len(flag_key)]^plain_flag[i]])

print(plain_flag)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPNmd/dJMcaiaKFQm/WJ1EEixmpubE1jwyJqTDB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPNmd/dJMcaiaKFQm/WJ1EEixmpubE1jwyJqTDB1/img.png&quot; data-alt=&quot;복호화 결과 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPNmd/dJMcaiaKFQm/WJ1EEixmpubE1jwyJqTDB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPNmd%2FdJMcaiaKFQm%2FWJ1EEixmpubE1jwyJqTDB1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1687&quot; height=&quot;238&quot; data-origin-width=&quot;1687&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과 1&lt;/figcaption&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;xor 연산은 순서가 중요하지 않기에 다음과 같이 암호화를 그냥 한 번 더 하는 방식으로도 복호화가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FmzmL/dJMcafE58ya/KXZFW1R6IC7A7ndAzizpmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FmzmL/dJMcafE58ya/KXZFW1R6IC7A7ndAzizpmK/img.png&quot; data-alt=&quot;복호화 결과 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FmzmL/dJMcafE58ya/KXZFW1R6IC7A7ndAzizpmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmzmL%2FdJMcafE58ya%2FKXZFW1R6IC7A7ndAzizpmK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1856&quot; height=&quot;192&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. toyransome4&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 바이너리 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;program.bin.enc: 암호화된 바이너리 파일 (Hint. 암호화 전 바이너리는 elf 파일)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqald3/dJMcab3LBpH/7ByonU2mc34nfnZnIq2au0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqald3/dJMcab3LBpH/7ByonU2mc34nfnZnIq2au0/img.png&quot; data-alt=&quot;IDA 상에서 바이너리를 열었을 때의 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqald3/dJMcab3LBpH/7ByonU2mc34nfnZnIq2au0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqald3%2FdJMcab3LBpH%2F7ByonU2mc34nfnZnIq2au0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;309&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IDA 상에서 바이너리를 열었을 때의 화면&lt;/figcaption&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⭐ 4. toyransome5&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 바이너리 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flag.enc: 암호화된 flag 파일&lt;/li&gt;
&lt;li&gt;toyransome5: 암호화 바이너리 파일&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;안티리버싱이 적용되어 있어 어셈블리 언어로만 분석해야 함 (C 코드로 복원 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmq8AT/dJMcahJGRSf/2GzrGRZyS9CC0WtdqnaGCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmq8AT/dJMcahJGRSf/2GzrGRZyS9CC0WtdqnaGCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmq8AT/dJMcahJGRSf/2GzrGRZyS9CC0WtdqnaGCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmq8AT%2FdJMcahJGRSf%2F2GzrGRZyS9CC0WtdqnaGCK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1067&quot; height=&quot;151&quot; data-origin-width=&quot;1067&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 풀이 팁&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IDA 분석 시도
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;함수 초반의 반복문으로 인해 스택 프레임이 커져서 IDA 헥스레이 기능 이용 불가능 (안티리버싱)&lt;/li&gt;
&lt;li&gt;복호화된 코드가 아닌 어셈블리 분석 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVBMZ/dJMcadULlPd/12EMXgztSZGJkRf9F32Kv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVBMZ/dJMcadULlPd/12EMXgztSZGJkRf9F32Kv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVBMZ/dJMcadULlPd/12EMXgztSZGJkRf9F32Kv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVBMZ%2FdJMcadULlPd%2F12EMXgztSZGJkRf9F32Kv0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1041&quot; height=&quot;623&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;623&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;1230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TyWa6/dJMcadmVhQk/ghGBCQUMjcMGfilkVlRe8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TyWa6/dJMcadmVhQk/ghGBCQUMjcMGfilkVlRe8K/img.png&quot; data-alt=&quot;fopen, fread 그리고 fclose 사이 loc_1361과 loc_131F가 암호화하는 반복문임&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TyWa6/dJMcadmVhQk/ghGBCQUMjcMGfilkVlRe8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTyWa6%2FdJMcadmVhQk%2FghGBCQUMjcMGfilkVlRe8K%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;1230&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;1230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;fopen, fread 그리고 fclose 사이 loc_1361과 loc_131F가 암호화하는 반복문임&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F6v3j/dJMcad1wWkt/e5lFDQOOcutRQthqmxB3i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F6v3j/dJMcad1wWkt/e5lFDQOOcutRQthqmxB3i1/img.png&quot; data-alt=&quot;핵심이 되는 basic block&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F6v3j/dJMcad1wWkt/e5lFDQOOcutRQthqmxB3i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF6v3j%2FdJMcad1wWkt%2Fe5lFDQOOcutRQthqmxB3i1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;752&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;핵심이 되는 basic block&lt;/figcaption&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;instruction 설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mov: 오른쪽에 있는 값을 왼쪽으로 넣음 (해당 코드에선 초기값 0)&lt;/li&gt;
&lt;li&gt;cdqe: 32bits -&amp;gt; 64bits extension (알 필요 X)&lt;/li&gt;
&lt;li&gt;movzx: 'fread'의 ptr이므로, ptr을 통해 파일 데이터를 0번부터 가져오는 것을 알 수 있음&lt;/li&gt;
&lt;li&gt;add: 1을 더하는 것으로 보아, 반복문 한 번 끝날 때 마다 인덱스 하나가 증가할 때의 그 인덱스임을 알 수 있음 -&amp;gt; 네이밍&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어셈블리 명령어를 해석하면 오른쪽으로 1비트만큼 시프트 한 값과 왼쪽으로 7번 시프트 한 값을 or 하는 게 로테이션 로직임을 알 수 있다. 결국, 이를 해석하면 총 8비트에서 맨 오른쪽 하위 비트가 젤 상위 비트로 올라오고 나머지 비트는 한 비트씩 밀리는, 로테이션식의 손실 없는 암호화 로직임을 알 수 있다.&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;그리고 그 값을 'dl' 레지스터를 이용해 다시 ptr로 넣는 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;position: relative; background-color: #ffffff; padding: 10px 25px 10px 65px; margin: 0.5em 0; border: 1px solid #787878; border-radius: 10px;&quot;&gt;
&lt;div style=&quot;position: absolute; top: -1px; left: 14px; width: 30px; height: 47px; background-color: #4a4a4a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;position: absolute; top: 17px; left: 14px; width: 0; height: 0; border: 15px solid; border-color: transparent transparent #ffffff transparent;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;어셈블리 명령어 정리&lt;/b&gt;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 데이터 이동 계열&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mov &amp;ndash; MOVe: 오른쪽 값(레지스터/메모리)을 왼쪽에 복사&lt;/li&gt;
&lt;li&gt;movzx &amp;ndash; MOV with Zero eXtend: 작은 크기 값을 큰 레지스터로 옮기면서 상위 비트를 0으로 채움&lt;/li&gt;
&lt;li&gt;movsx &amp;ndash; MOV with Sign eXtend: 작은 크기 값을 큰 레지스터로 옮기면서 부호비트를 유지해서 채움&lt;/li&gt;
&lt;li&gt;cdqe &amp;ndash; Convert Doubleword to Quadword Extended: EAX(32비트)를 RAX(64비트)로 부호 확장해서 변환 (32bit int &amp;rarr; 64bit, 캐스팅(형 변환 느낌)&lt;/li&gt;
&lt;/ul&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;b&gt;비트 연산/시프트 계열&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sar &amp;ndash; Shift Arithmetic Right: 오른쪽으로 n비트 쉬프트, 왼쪽 끝은 부호비트 그대로 유지 (나누기 2^n)&lt;/li&gt;
&lt;li&gt;shl &amp;ndash; SHift Left: 왼쪽으로 n비트 쉬프트, 오른쪽은 0으로 채움 (곱하기 2^n)&lt;/li&gt;
&lt;li&gt;or &amp;ndash; bitwise OR: 두 값의 비트를 OR 연산. 하나라도 1이면 1&lt;/li&gt;
&lt;li&gt;xor &amp;ndash; bitwise XOR (eXclusive OR): 두 비트가 다를 때만 1&lt;/li&gt;
&lt;/ul&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;b&gt;산술/비교/분기 기본&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add &amp;ndash; ADD: 왼쪽 피연산자에 오른쪽 값을 더함&lt;/li&gt;
&lt;li&gt;sub &amp;ndash; SUBtract: 왼쪽 피연산자에서 오른쪽 값을 뺌&lt;/li&gt;
&lt;li&gt;cmp &amp;ndash; CoMPare: &quot;왼쪽 - 오른쪽&quot;을 계산해서 결과만 플래그에 기록하여 다음에 오는 점프의 조건을 결정&lt;/li&gt;
&lt;li&gt;jmp &amp;ndash; JuMP: 무조건 해당 라벨/주소로 점프&lt;/li&gt;
&lt;li&gt;je / jne &amp;ndash; Jump if Equal / Jump if Not Equal: 바로 전에 cmp한 결과가 같으면/다르면 점프&lt;/li&gt;
&lt;li&gt;jg / jge &amp;ndash; Jump if Greater / Jump if Greater or Equal: 비교 결과가 크다/크거나 같다이면 점프 (signed 기준)&lt;/li&gt;
&lt;li&gt;jl / jle &amp;ndash; Jump if Less / Jump if Less or Equal: 비교 결과가 작다/작거나 같다면 점프 (signed 기준)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ RAX 계열 레지스터 크기별 이름&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAX: 전체 64비트&lt;/li&gt;
&lt;li&gt;EAX: RAX의 하위 32비트&lt;/li&gt;
&lt;li&gt;AX: RAX의 하위 16비트&lt;/li&gt;
&lt;li&gt;AH: AX의 상위 8비트&lt;/li&gt;
&lt;li&gt;AL: AX의 하위 8비트&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1765168942674&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;flag.enc&quot;, &quot;rb&quot;) as f_ptr:
    enc_data = f_ptr.read()

plain = b''

for i in range(len(enc_data)):
    y = enc_data[i]       

    x = ((y &amp;lt;&amp;lt; 1) &amp;amp; 0xFF) | (y &amp;gt;&amp;gt; 7) #0xFF과 &amp;amp; 하는 것은 하위 8비트만 남기고 나머지 비트는 전부 버리기 위함임

    plain += bytes([x])

print(plain)&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;오른쪽으로 쉬프트 연산을 해서 암호화 하였으면 왼쪽으로 쉬프트 연산을,&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1981&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mXZXA/dJMcajgnZwk/7L8jYSLYuOKqHlVAaBEbJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mXZXA/dJMcajgnZwk/7L8jYSLYuOKqHlVAaBEbJk/img.png&quot; data-alt=&quot;복호화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mXZXA/dJMcajgnZwk/7L8jYSLYuOKqHlVAaBEbJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXZXA%2FdJMcajgnZwk%2F7L8jYSLYuOKqHlVAaBEbJk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1981&quot; height=&quot;159&quot; data-origin-width=&quot;1981&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과&lt;/figcaption&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;혹은, 순환형 구조이기 때문에 flag.enc를 7번 더 암호화하여 원래대로 돌려 놓는 식으로 복호화할 수도 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'8비트 회전의 주기 = 8'을 이용한 복호화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;position: relative; background-color: #ffffff; padding: 10px 25px 10px 65px; margin: 0.5em 0; border: 1px solid #787878; border-radius: 10px;&quot;&gt;
&lt;div style=&quot;position: absolute; top: -1px; left: 14px; width: 30px; height: 47px; background-color: #4a4a4a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;position: absolute; top: 17px; left: 14px; width: 0; height: 0; border: 15px solid; border-color: transparent transparent #ffffff transparent;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;레지스터 용도 정리&lt;/b&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;범용 레지스터: RAX/RBX/RCX/RDX/RSI/RDI/R8~R15&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리턴값 및 시스템콜 번호 레지스터: RAX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDI: destination index 레지스터 (1번째 인자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RSI: source index 레지스터 (2번째 인자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RBP: base pointer 레지스터 (현재 함수 스택 프레임 기준점)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RSP: stack pointer 레지스터 (스택의 최상단)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RIP: 프로그램 카운터 (현재 명령어 위치)&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;※ 현재는 64 bit 기준이기에 R~ 인 것이고, 32 bit 기준으로 하면 E~ 로 변경하면 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. toyransome6&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 바이너리 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flag.enc: 암호화된 flag 파일&lt;/li&gt;
&lt;li&gt;toyransome6: 암호화 바이너리 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be1we9/dJMcaaw1rmo/DsHLOeZzEPguU1r8btmar0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be1we9/dJMcaaw1rmo/DsHLOeZzEPguU1r8btmar0/img.png&quot; data-alt=&quot;Hint. 핵심 basic block&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be1we9/dJMcaaw1rmo/DsHLOeZzEPguU1r8btmar0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe1we9%2FdJMcaaw1rmo%2FDsHLOeZzEPguU1r8btmar0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;516&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hint. 핵심 basic block&lt;/figcaption&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;instruction 설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 인덱스를 eax로 가지고 옴 -&amp;gt; 해당 인덱스의 값을 edx에 담음&lt;/li&gt;
&lt;li&gt;&quot;eax - 1&quot;을 통해 이전 인덱스를 eax로 가지고 옴 -&amp;gt; 이전 인덱스의 값을 eax에 담음&lt;/li&gt;
&lt;li&gt;edx와 eax끼리 xor 연산을 함 -&amp;gt; 연산 결과를 edx에 저장&lt;/li&gt;
&lt;li&gt;eax에 다시 현재 인덱스를 가지고 옴 -&amp;gt; 해당 값으로 현재 인덱스의 값을 업데이트 (암호화)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 암호화 로직: enc[n] = flag[n] ^ enc[n-1]&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;※ dl: edx의 하위 1바이트 (dl = edx &amp;amp; 0xFF)&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;여기까지 해석하면 현재 인덱스가 0일 때 이전 인덱스가 -1이 되어 OOB(Out Of Bound)가 발생한다는 것을 알 수 있다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjFQgH/dJMcahiCztV/YeeavTX6LCIesZe8TZKork/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjFQgH/dJMcahiCztV/YeeavTX6LCIesZe8TZKork/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjFQgH/dJMcahiCztV/YeeavTX6LCIesZe8TZKork/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjFQgH%2FdJMcahiCztV%2FYeeavTX6LCIesZe8TZKork%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;756&quot; height=&quot;817&quot; data-origin-width=&quot;756&quot; data-origin-height=&quot;817&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;이렇게 앞 부분을 확인해 보면 인덱스가 0이 아닌 1부터 시작하는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 인덱스 0의 경우엔 따로 암호화가 되어 있음을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;enc[0] instruction 설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스를 0으로 초기화&lt;/li&gt;
&lt;li&gt;[rbp+var_3E8034]에서 4바이트만큼 eax로 가지고 옴 -&amp;gt; eax 중 하위 1 바이트(al)만큼 key로 가지고 옴&lt;/li&gt;
&lt;li&gt;0번째 인덱스의 값을 eax에 가지고 옴 -&amp;gt;&amp;nbsp; key와 xor 연산을 함&lt;/li&gt;
&lt;li&gt;xor 연산 결과를 eax에 저장 -&amp;gt; 해당 값으로 현재 인덱스의 값을 업데이트 (암호화)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; enc[0] 암호화 로직: enc[0] = flag[0] ^ [rbp+var_3E8034]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 그렇다면 [rbp+var_3E8034] 값은 어디서 왔을까?&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oj1g5/dJMcab3Mnsj/bnXRflKmTLAXo6GX8Rx3X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oj1g5/dJMcab3Mnsj/bnXRflKmTLAXo6GX8Rx3X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oj1g5/dJMcab3Mnsj/bnXRflKmTLAXo6GX8Rx3X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foj1g5%2FdJMcab3Mnsj%2FbnXRflKmTLAXo6GX8Rx3X0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;1079&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1079&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;[rbp+var_3E8034] 값은 edi에서 가져온 값으로, 이는 main 함수의 첫 번째 인자인 argc(인자 개수)를 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 첫 번째 인덱스의 flag를 암호화하는 key 값은 프로그램을 실행할 당시의 argc의 하위 1바이트가 된다.&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;실제로 제공된 flag.enc를 분석해보면 첫 바이트 복호화를 통해 이 값이 28(0x1c)임을 역으로 확인할 수 있으며, 이는 해당 flag.enc 파일을 만들 때 argc가 28이 되도록 여러 인자를 넣어 실행했음을 의미한다.&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;반대로 동일한 프로그램을 &quot;./toyransome6 flag2.enc 1 2 3&quot;처럼 실행하여 flag2.enc를 만들면 그 시점의 argc 값은 5이므로, 그 파일의 첫 번째 인덱스의 암호화 키는 0x05가 된다.&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;즉, 파일마다 xor 초기 키는 그 파일을 생성할 때의 argc에 의해 결정된다.&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;복호화의 경우엔, xor 연산의 특성상 &quot;buf[i] ^ buf [i-1] ^ buf [i-1] = buf [i]&quot; 이므로 이를 이용해 복호화 해주면 된다.&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;먼저, 0번째 인덱스의 값은 암호화 로직이 &quot;enc[0] = flag[0] ^ 0x1c&quot;이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 외의 경우엔 암호화 로직이 &quot;enc[n] = flag [n] ^ enc[n-1]&quot; 임을 이용해 복호화 로직을 짜면 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;flag[0] = enc[0] ^ 0x1c = flag[0] ^ 0x1c ^ 0x1c = flag[0]&lt;/li&gt;
&lt;li&gt;flag[1] = enc[1] ^ enc[0] = flag[1] ^ enc[0] ^ enc[0] = flag[1]&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;flag[n] = enc[n] ^ enc[n-1] = flag[n] ^ enc[n-1] ^ enc[n-1] = flag[n]&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1765202828088&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;with open(&quot;flag.enc&quot;, &quot;rb&quot;) as f:
    enc = f.read()

plain = b''

plain += bytes([enc[0] ^ 0x1c])

for i in range(1, len(enc)):
    plain += bytes([enc[i] ^ enc[i - 1]])

print(plain)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2766&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TE8tK/dJMcahiCBOp/Ijbu3QXKjbpkStlogNvDT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TE8tK/dJMcahiCBOp/Ijbu3QXKjbpkStlogNvDT0/img.png&quot; data-alt=&quot;복호화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TE8tK/dJMcahiCBOp/Ijbu3QXKjbpkStlogNvDT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTE8tK%2FdJMcahiCBOp%2FIjbu3QXKjbpkStlogNvDT0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2766&quot; height=&quot;157&quot; data-origin-width=&quot;2766&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과&lt;/figcaption&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;※ IV: Initialization Vector의 약자로, 첫 번째 데이터 블록을 암호화할 때 사용되는 임의의 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. toyransome7&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 바이너리 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 구성&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;program.bin.enc: 암호화된 flag를 출력하는 바이너리 파일&lt;/li&gt;
&lt;li&gt;toyransome7: 암호화 바이너리 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drEvLs/dJMcai2QfTm/yGlv5hwiKzqcH6kPQ7tI0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drEvLs/dJMcai2QfTm/yGlv5hwiKzqcH6kPQ7tI0k/img.png&quot; data-alt=&quot;Hint. 핵심 basic block&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drEvLs/dJMcai2QfTm/yGlv5hwiKzqcH6kPQ7tI0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrEvLs%2FdJMcai2QfTm%2FyGlv5hwiKzqcH6kPQ7tI0k%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;353&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hint. 핵심 basic block&lt;/figcaption&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;instruction 설명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mov: 인덱스 값을 eax에 저장&lt;/li&gt;
&lt;li&gt;imul: eax * eax 연산 결과를 eax에 저장 (Integer Multiply) -&amp;gt; eax 제곱&lt;/li&gt;
&lt;li&gt;add: eax + 31337 연산 결과를 eax에 저장&lt;/li&gt;
&lt;li&gt;xor: eax ^ cafebabe 연산 결과를 eax에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 rax*4를 해주는데, 이는 index*4이며, index가 0부터 1 2 이렇게 있을 때 0 4 8 이렇게 저장한다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 4바이트로 패딩한 다음에 값이 저장되어, index가 0일 땐 0에, 1일 땐 4에 저장한다. (4바이트마다 1바이트씩 저장됨)&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값을 연산하는 단계: 곱하기, 더하기, xor -&amp;gt; 새로운 값 생성&lt;/li&gt;
&lt;li&gt;연산된 값을 메모리에 저장하는 단계: 계산한 결과를 4바이트 단위로 저장&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 4바이트 값을 가져오는 단계&lt;/li&gt;
&lt;li&gt;값을 연산하는 단계: xor, 빼기, 루트 연산 -&amp;gt; 1바이트로 출력&lt;/li&gt;
&lt;/ul&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;pre id=&quot;code_1765209685144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import math

with open(&quot;program.bin.enc&quot;, &quot;rb&quot;) as f:
    enc_data = f.read()

plain = b''

for i in range(0, len(enc_data), 4):
    chunk = enc_data[i:i+4]
    if len(chunk) &amp;lt; 4:
        break

    val = int.from_bytes(chunk, &quot;little&quot;)

    val ^= 0xCAFEBABE
    val -= 0x31337
    orig = math.isqrt(val)

    plain += bytes([orig])

with open(&quot;program.bin&quot;, &quot;wb&quot;) as f:
    f.write(plain)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1963&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbCW0Q/dJMcadgaK0a/XWZQIDhMimn1vfJ5Tz0Fpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbCW0Q/dJMcadgaK0a/XWZQIDhMimn1vfJ5Tz0Fpk/img.png&quot; data-alt=&quot;복호화한 프로그램 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbCW0Q/dJMcadgaK0a/XWZQIDhMimn1vfJ5Tz0Fpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbCW0Q%2FdJMcadgaK0a%2FXWZQIDhMimn1vfJ5Tz0Fpk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1963&quot; height=&quot;374&quot; data-origin-width=&quot;1963&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화한 프로그램 실행 결과&lt;/figcaption&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;IDA 버전에 따라 다음과 같이 블록이 나뉘어 질 수도 있다. (로직은 동일)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u95HN/dJMcacIopZk/jfMrLPkrGDqsj3dWcl0lbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u95HN/dJMcacIopZk/jfMrLPkrGDqsj3dWcl0lbk/img.png&quot; data-alt=&quot;Hint 핵심 basic block: 1314, 1357&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u95HN/dJMcacIopZk/jfMrLPkrGDqsj3dWcl0lbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu95HN%2FdJMcacIopZk%2FjfMrLPkrGDqsj3dWcl0lbk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1422&quot; height=&quot;1202&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hint 핵심 basic block: 1314, 1357&lt;/figcaption&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;output[i] = table[input[i]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table은 loc_1314에서 만들어지고, 이후 loc_1357에서 해당 테이블이 포인터 형태로 참조되어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;crypted[i] = table[plain[i]]] 형태로 사용된다.&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;다만, table을 참조하는 방식이 입력 바이트를 그대로 치환 테이블에서 lookup 하는 단순 치환 방식 (substitution) 으로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적인 비트연산이나 혼합 과정 없이 정적 1:1 매핑으로만 구성되어 있다.&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;그렇기에 복호화 과정이 table을 만드는 로직을 역으로 한 것과 완전히 동치이기에 위와 같이 풀어도 되는 것이다.&lt;/p&gt;</description>
      <category>CS/소프트웨어보안</category>
      <category>descryption</category>
      <category>IDA</category>
      <category>ransomware</category>
      <category>레지스터</category>
      <category>어셈블리</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/117</guid>
      <comments>https://arsenic-dev.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 9 Dec 2025 01:16:42 +0900</pubDate>
    </item>
    <item>
      <title>6. Reversing</title>
      <link>https://arsenic-dev.tistory.com/116</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;경희대학교 장대희 교수님의 소프트웨어보안 수업을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Reverse Engineering (Reversing, 역공학)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reverse Engineering이란 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 통해 구조, 기능, 디자인 등을 알아내는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 완성품의 설계도 없이 구조와 동작 과정을 알아내는 모든 단계를 말한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g., 소스코드가 없는 바이너리 파일(컴파일 된 파일)에 대해 프로그램의 로직을 분석하고 이해함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 분야에서의 Reverse Engineering은 소스코드 없이, 컴파일 된 소프트웨어의 구조를 다양한 방법으로 분석하는 과정을 말하며, 메모리 덤프와 같은 바이너리 분석 결과를 바탕으로 동작 원리와 내부 구조를 파악한 후, 원래의 코드가 어떻게 작성되었는지 추론한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 덤프:프로그램이나 시스템의 메모리 상태를 그대로 파일로 떠놓은 것으로, GDB 같은 디버거로 덤프 파일을 열 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 리버싱을 통해 분석된 프로그램에서 소스코드를 추출하거나 이해할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bICEn6/dJMcajtSo0p/sUKDRsfPPzvkumhjIxLqf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bICEn6/dJMcajtSo0p/sUKDRsfPPzvkumhjIxLqf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bICEn6/dJMcajtSo0p/sUKDRsfPPzvkumhjIxLqf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbICEn6%2FdJMcajtSo0p%2FsUKDRsfPPzvkumhjIxLqf0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;414&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;414&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;※ 이진 코드를 복원하여 바이너리 로직을 파악하는 리버싱 툴 도구 중 대표적인 도구로 IDA가 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IDA 사용 방법: 바이너리 파일을 드래그하여 IDA 창에 올리기&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;실습&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 접근 방식&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;toyransome을 제외하고는 소스코드가 없음&lt;/li&gt;
&lt;li&gt;따라서 리버스 엔지니어링을 통해 바이너리를 분석 후 flag를 획득
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Flag의 형태는 'flag{/*임의의 문자열*/}'&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문제풀이 Tip: 바이너리의 이름이 힌트가 되는 경우가 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. runme&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VXNQ1/dJMcahCSdgj/l64Lvu2B0x9RmhkQ6Ou2dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VXNQ1/dJMcahCSdgj/l64Lvu2B0x9RmhkQ6Ou2dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VXNQ1/dJMcahCSdgj/l64Lvu2B0x9RmhkQ6Ou2dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVXNQ1%2FdJMcahCSdgj%2Fl64Lvu2B0x9RmhkQ6Ou2dK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;208&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;208&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;위 코드를 보고 sub_140001030 함수를 printf, 혹은 puts와 같은 함수로 추정이 가능하다. 이때 140001030은 디컴파일러가 함수가 존재하는 메모리 주소를 이름으로서 붙인 것이고, 실제 함수 이름은 아닌 경우가 대부분이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;해당 프로그램은 이름 그대로 자신을 실행만 하면 flag가 찍히는 로직을 가지고 있다.&lt;br /&gt;마지막에 fgetchar는 왜 있을까? 'runme2' 바이너리를 보면 이해할 수 있다.&lt;br /&gt;&lt;br /&gt;'runme.exe' 파일을 더블 클릭만 하면 윈도우 콘솔 창이 뜨면서 flag 메시지가 보이고, fgetchar 때문에 거기서 멈춘다.&lt;br /&gt;즉, 마우스로 클릭만 해도 손쉽게 flag를 얻을 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzIoo/dJMcahQpZhK/T1xNakxBE3qnu37qwy53BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzIoo/dJMcahQpZhK/T1xNakxBE3qnu37qwy53BK/img.png&quot; data-alt=&quot;'runme.exe' 파일을 실행한 모습, 아무 문자나 입력 후 엔터치면 프로그램 종료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzIoo/dJMcahQpZhK/T1xNakxBE3qnu37qwy53BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyzIoo%2FdJMcahQpZhK%2FT1xNakxBE3qnu37qwy53BK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;162&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'runme.exe' 파일을 실행한 모습, 아무 문자나 입력 후 엔터치면 프로그램 종료&lt;/figcaption&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;이때 디컴파일 된 코드란 원본 코드가 아닌 IDA가 추정하여 디컴파일한 코드이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디컴파일 하여 정확히 원본 소스 코드를 얻는 것은 수학적으로 불가능&amp;nbsp;&lt;/li&gt;
&lt;li&gt;똑같은 바이너리로 컴파 일 될 수 있는 원본 소스 코드의 경우의 수가 무한대이기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;그렇다면 왜 위에 함수는 printf가 아닌 sub_140001030으로 나오고, fgetchar는 함수 이름이 나올까?&lt;/span&gt;&lt;/blockquote&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;p data-ke-size=&quot;size16&quot;&gt;sub_140001030도 내부로 들어가보면 해당 함수의 printf, 혹은 write와 같은 심볼을 발견할 확률이 높다. (static)&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;b&gt;static vs danamic&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;danamic linking을 해서 API를 사용하는 바이너리의 경우에는 실행 시점에 실제 공유 라이브러리의 위치를 찾기 때문에 함수의 이름 정보가 바이너리에 존재해야 한다. 그래서 다이나믹 링킹으로 빌드된 바이너리들은 fgetchar()처럼 심볼 이름이 나타나고, 안 나타나더라도 몇 겹으로 랩핑되어 있는 것이지 뒤져보면 다 존재한다.&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;하지만 static 컴파일된 바이너리면 라이브러리에 심볼 이름 이런 게 있을 필요가 없고, 그냥 어셈블리 코드가 박혀있으면 되기 때문에 sub_140001030처럼 이름이 안 나타나는 경우가 대부분이다.&amp;nbsp; 디버깅용 정보로서만 존재하고 디버깅 정보를 지우면 찾을 수 없는 경우가 꽤 많다.&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;※ IDA에서 디컴파일은 원래 유료 Hex-Rays 플러그인이 맡지만, IDA Freeware는 예외적으로 Hex-Rays를 가지고는 있지만, x86(인텔) 바이너리에 한해서만 디컴파일을 제공하고, 그 외 아키텍처 디컴파일은 유료 버전에서만 지원된다. (현재 버전 기준)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. runme2&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpcC4i/dJMcacO6kAI/QEtpnLxACbjYenF3yvrTjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpcC4i/dJMcacO6kAI/QEtpnLxACbjYenF3yvrTjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpcC4i/dJMcacO6kAI/QEtpnLxACbjYenF3yvrTjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpcC4i%2FdJMcacO6kAI%2FQEtpnLxACbjYenF3yvrTjk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;176&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 163px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 163px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 163px;&quot;&gt;해당 프로그램은 'runme' 바이너리에 비해 fgetchar만 없을 뿐, 나머지는 전부 동일하다.&lt;br /&gt;&lt;br /&gt;'runme2.exe' 파일을 마우스로 클릭만 하면 콘솔 창이 순간적으로 뜨며 flag가 찍히지만, 바로 return 0을 하며 종료되기에 사람의 눈으론 flag 확인이 불가능하다. 즉, 마우스와 같은 GUI 인터페이스만 사용해서는 flag 확인이 불가능하고, 콘솔 창에서 실행을 하던가 하는 방법을 사용해야 한다.&lt;br /&gt;&lt;br /&gt;물론, 'runme'와 마찬가지로 IDA로 열면 해당 의도를 우회하고 flag 확인이 바로 가능하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9CoAl/dJMcagcULlH/CmJM9hD6C4hdZJ7WY1pM31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9CoAl/dJMcagcULlH/CmJM9hD6C4hdZJ7WY1pM31/img.png&quot; data-alt=&quot;'runme2.exe' 파일을 콘솔에서 실행한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9CoAl/dJMcagcULlH/CmJM9hD6C4hdZJ7WY1pM31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9CoAl%2FdJMcagcULlH%2FCmJM9hD6C4hdZJ7WY1pM31%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1314&quot; height=&quot;337&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'runme2.exe' 파일을 콘솔에서 실행한 모습&lt;/figcaption&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;※ 'runme', 'runme2'는 IDA 없이 flag를 획득하는 게 원래 문제의 의도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. number&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oYTBj/dJMcafLPq6F/9w9JXza1nr7Uxz9vIUMyl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oYTBj/dJMcafLPq6F/9w9JXza1nr7Uxz9vIUMyl0/img.png&quot; data-alt=&quot;숫자를 입력 받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oYTBj/dJMcafLPq6F/9w9JXza1nr7Uxz9vIUMyl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoYTBj%2FdJMcafLPq6F%2F9w9JXza1nr7Uxz9vIUMyl0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;131&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;숫자를 입력 받을 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x7h9E/dJMcagqqTpO/JpKhcJLRBKQNMPhqhKZbM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x7h9E/dJMcagqqTpO/JpKhcJLRBKQNMPhqhKZbM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x7h9E/dJMcagqqTpO/JpKhcJLRBKQNMPhqhKZbM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx7h9E%2FdJMcagqqTpO%2FJpKhcJLRBKQNMPhqhKZbM1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;351&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;351&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;위 코드를 보고 sub_1400010E0 함수는 printf로,&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;sub_140001070 함수는 scanf로 추정할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eDFX7D/dJMcabbBdwt/VYjkfzJqmas8K8xOAL65k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eDFX7D/dJMcabbBdwt/VYjkfzJqmas8K8xOAL65k1/img.png&quot; data-alt=&quot;'number.exe' 파일을 콘솔에서 실행한 후 입력으로 '947285644'를 준 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eDFX7D/dJMcabbBdwt/VYjkfzJqmas8K8xOAL65k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeDFX7D%2FdJMcabbBdwt%2FVYjkfzJqmas8K8xOAL65k1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;367&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'number.exe' 파일을 콘솔에서 실행한 후 입력으로 '947285644'를 준 모습&lt;/figcaption&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;※&amp;nbsp;argv 옆의 envp는 디컴파일이 잘못된 것으로, 필요없는, 즉 무의미한 로직이다. 이렇게 디컴파일된 코드를 볼 때는 백프로 신뢰하면 안 된다. 디컴파일러는 로직이 똑같냐, 즉 똑같은 인풋에 대해 똑같은 결과를 내냐만 중요할 뿐 과정은 중요하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. number2&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHVmCD/dJMcadf7Sfh/UF7kxjAXYiMMjj6m9soby0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHVmCD/dJMcadf7Sfh/UF7kxjAXYiMMjj6m9soby0/img.png&quot; data-alt=&quot;숫자를 입력 받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHVmCD/dJMcadf7Sfh/UF7kxjAXYiMMjj6m9soby0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHVmCD%2FdJMcadf7Sfh%2FUF7kxjAXYiMMjj6m9soby0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;145&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;숫자를 입력 받을 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nTNe0/dJMcaiuYBjF/LKpd6hVk2gZdhaH4REQKSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nTNe0/dJMcaiuYBjF/LKpd6hVk2gZdhaH4REQKSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nTNe0/dJMcaiuYBjF/LKpd6hVk2gZdhaH4REQKSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnTNe0%2FdJMcaiuYBjF%2FLKpd6hVk2gZdhaH4REQKSK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;462&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;462&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;이때, flags.txt 파일은 여러 개의 정답 후보인 플래그들이 있는 텍스트 파일이다. 만약 'flags.txt' 파일을 담은 Stream이 null이면 else로 분기되어 프로그램이 종료된다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fseek(Stream, 24672, 0): flags.txt 파일에서 처음부터 24,672바이트 떨어진 위치로 파일 포인터를 옮겨라&lt;/li&gt;
&lt;li&gt;fread(byte_140024BF0, 0x30ui64, 1ui64, Stream): 현재 파일 위치에서 0x3A0 바이트씩 1개 byte_140024BF0 버퍼에 읽어 와라
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;ui64: unsigned 64-bit integer&lt;/li&gt;
&lt;li&gt;i64: signed 64-bit integer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjzpl/dJMcaacGBwd/jlkNstDhurQZJHkVU6MKI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjzpl/dJMcaacGBwd/jlkNstDhurQZJHkVU6MKI1/img.png&quot; data-alt=&quot;'number2.exe' 파일을 콘솔에서 실행한 후, 입력으로 '1419725'를 준 모습 (5678900/4 = 1419725)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjzpl/dJMcaacGBwd/jlkNstDhurQZJHkVU6MKI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqjzpl%2FdJMcaacGBwd%2FjlkNstDhurQZJHkVU6MKI1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1272&quot; height=&quot;323&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'number2.exe' 파일을 콘솔에서 실행한 후, 입력으로 '1419725'를 준 모습 (5678900/4 = 1419725)&lt;/figcaption&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;※ %ld는 계산식은 못 읽고 정수만 읽을 수 있기 때문에 '5678900/4'처럼 계산식을 입력으로 넣을시, '/4'는 무시되고 '5678900'이 입력으로 들어간다. 때문에 직접 계산한 정답값을 입력으로 넣어줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. number_elf&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH1YCA/dJMcafE3WuA/1DNodRM4czAbrJfFfY8HW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH1YCA/dJMcafE3WuA/1DNodRM4czAbrJfFfY8HW1/img.png&quot; data-alt=&quot;숫자를 입력 받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH1YCA/dJMcafE3WuA/1DNodRM4czAbrJfFfY8HW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH1YCA%2FdJMcafE3WuA%2F1DNodRM4czAbrJfFfY8HW1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;953&quot; height=&quot;246&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;숫자를 입력 받을 수 있음&lt;/figcaption&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;※ 리눅스에서는 'file' 명령어를 통해 파일 정보 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmZqi7/dJMcabJrd5M/VjDrHk5xkaFkDZ48pMp4UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmZqi7/dJMcabJrd5M/VjDrHk5xkaFkDZ48pMp4UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmZqi7/dJMcabJrd5M/VjDrHk5xkaFkDZ48pMp4UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmZqi7%2FdJMcabJrd5M%2FVjDrHk5xkaFkDZ48pMp4UK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;423&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;423&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-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;윈도우는 함수 매핑 구조가 복잡해서 심볼이 잘 드러나지 않지만, 리눅스는 표준 C 라이브러리(libc) 함수를 직접 호출하는 방식이라 puts 같은 심볼이 그대로 노출되는 편이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCDGW/dJMcai9z37U/oynLNgKUsUqTkhGCJLbaX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCDGW/dJMcai9z37U/oynLNgKUsUqTkhGCJLbaX0/img.png&quot; data-alt=&quot;'number' 파일을 wsl에서 실행한 후, 입력으로 '92737103'을 준 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCDGW/dJMcai9z37U/oynLNgKUsUqTkhGCJLbaX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCDGW%2FdJMcai9z37U%2FoynLNgKUsUqTkhGCJLbaX0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1566&quot; height=&quot;435&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'number' 파일을 wsl에서 실행한 후, 입력으로 '92737103'을 준 모습&lt;/figcaption&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우: exe&lt;/li&gt;
&lt;li&gt;리눅스: elf&lt;/li&gt;
&lt;li&gt;일반적으로 윈도우가 리눅스보다 리버싱하기 더 복잡하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. plusplus&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/61Gau/dJMcahplRCX/L7NgxFo5mtXbnYrEwhPwgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/61Gau/dJMcahplRCX/L7NgxFo5mtXbnYrEwhPwgk/img.png&quot; data-alt=&quot;간단한 인코딩 방식의 암호화가 적용된 모습으로 flag가 출력된 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/61Gau/dJMcahplRCX/L7NgxFo5mtXbnYrEwhPwgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F61Gau%2FdJMcahplRCX%2FL7NgxFo5mtXbnYrEwhPwgk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;120&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;간단한 인코딩 방식의 암호화가 적용된 모습으로 flag가 출력된 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yka7Y/dJMcaacGetk/sLYniVJR6JdDzsYvij8bk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yka7Y/dJMcaacGetk/sLYniVJR6JdDzsYvij8bk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yka7Y/dJMcaacGetk/sLYniVJR6JdDzsYvij8bk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyka7Y%2FdJMcaacGetk%2FsLYniVJR6JdDzsYvij8bk0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;460&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;460&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;b&gt;1) 첫 번째 while문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strcpy를 통해 flag 값을 v7이라는 변수에 저장한다. 이때, v3이 v7의 인덱스 번호를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리버싱을 할 때는 코드를 보고 어떤 역할을 하는지 보면서 네이밍을 해야 수월하게 리버싱을 할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g., v7: copy_flag, v3: idx(인덱스)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 while문의 역할은 copy_flag의 인덱스를 이용해 flag의 길이를 구하는 것이다. (counting)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, v3은 결과적으로 idx가 아니라 flag_length를 저장한다.&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;string의 마지막 문자는 null 문자로, 아스키 코드로 0을 의미하기에, 이 null 문자가 올 때까지 반복하는 것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;while 문의 조건이 0이면 반복문 종료&lt;/li&gt;
&lt;/ul&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;b&gt;2) 두 번째 while문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 while문은 v3이 0이 아니면, 즉 flag_length가 0이 아니면 v5에 copy_flag 값을 담고 실행된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;v5: copy_flag2&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 함수의 최종 실행이 출력인데 sub_1400010B0 외에는 출력하는 함수로 유추할 수 있는 게 없기에 sub_1400010B0를 printf로 유추할 수 있다.&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;이때 printf로 유추되는 sub_1400010B0 함수를 통해 copy_flag2에 포인터 변수로 접근하여 +1을 함으로써 flag를 1씩 더해주는&amp;nbsp; 방식으로 암호화하여 출력을 하고, v4를 이용해 글자 수를 counting하여 flag_length만큼 반복하도록 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;amp;unk_140018C58을 더블 클릭하면 &quot;%c&quot; 포맷이 나옴&lt;/li&gt;
&lt;li&gt;&quot;%c&quot; 포맷을 통해 문자를 출력함을 유추할 수도 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdRA58/dJMcabJtm4m/k3qYAYXASiPPSsWqq0eyeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdRA58/dJMcabJtm4m/k3qYAYXASiPPSsWqq0eyeK/img.png&quot; data-alt=&quot;&amp;amp;amp;unk_140018C58을 더블 클릭한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdRA58/dJMcabJtm4m/k3qYAYXASiPPSsWqq0eyeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdRA58%2FdJMcabJtm4m%2Fk3qYAYXASiPPSsWqq0eyeK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2878&quot; height=&quot;1709&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1709&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;amp;unk_140018C58을 더블 클릭한 모습&lt;/figcaption&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;※ IDA에서 디컴파일 하는 단축키: F5&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;즉, flag를 얻기 위해서는 출력되는 string에서 1씩 빼주면 됨을 유추할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1765260883114&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;encoded = &quot;gmbh|sfwfstjohqmvtqmvt~&quot;

decoded = &quot;&quot;

for ch in encoded:
    decoded += chr(ord(ch) - 1)  

print(decoded)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SW0rZ/dJMcafd2WPZ/hkvlZoC74YR2akFQQ9hH70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SW0rZ/dJMcafd2WPZ/hkvlZoC74YR2akFQQ9hH70/img.png&quot; data-alt=&quot;복호화 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SW0rZ/dJMcafd2WPZ/hkvlZoC74YR2akFQQ9hH70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSW0rZ%2FdJMcafd2WPZ%2FhkvlZoC74YR2akFQQ9hH70%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;127&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;복호화 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. string_easy&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcoDzf/dJMcafkLbl3/9iInqJZ8zvaB73hf0T77b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcoDzf/dJMcafkLbl3/9iInqJZ8zvaB73hf0T77b1/img.png&quot; data-alt=&quot;문자열을 입력 받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcoDzf/dJMcafkLbl3/9iInqJZ8zvaB73hf0T77b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcoDzf%2FdJMcafkLbl3%2F9iInqJZ8zvaB73hf0T77b1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;120&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문자열을 입력 받을 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5AHL/dJMcabvTwJP/B9ZXka25K3H4lsgOJv2fcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5AHL/dJMcabvTwJP/B9ZXka25K3H4lsgOJv2fcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5AHL/dJMcabvTwJP/B9ZXka25K3H4lsgOJv2fcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5AHL%2FdJMcabvTwJP%2FB9ZXka25K3H4lsgOJv2fcK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;451&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;451&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;strcmp는 입력받은 두 문자가 다르면 정수 값을 리턴하고 같으면 0을 리턴한다.&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;여기서는 strcmp를 이용해 input string이 &quot;i8NlM20&quot;과 같으면 flag가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1naqE/dJMcaiaIWoc/tKzxrmAh2K9BYddBzfRlmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1naqE/dJMcaiaIWoc/tKzxrmAh2K9BYddBzfRlmk/img.png&quot; data-alt=&quot;'string_easy.exe' 파일을 실행한 후, 입력으로 'i8fNlM20'을 준 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1naqE/dJMcaiaIWoc/tKzxrmAh2K9BYddBzfRlmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1naqE%2FdJMcaiaIWoc%2FtKzxrmAh2K9BYddBzfRlmk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1349&quot; height=&quot;339&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'string_easy.exe' 파일을 실행한 후, 입력으로 'i8fNlM20'을 준 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;8. string&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVyNmK/dJMcadAqpVy/Rw067THj7ixHQw7lwEru40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVyNmK/dJMcadAqpVy/Rw067THj7ixHQw7lwEru40/img.png&quot; data-alt=&quot;문자열을 입력받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVyNmK/dJMcadAqpVy/Rw067THj7ixHQw7lwEru40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVyNmK%2FdJMcadAqpVy%2FRw067THj7ixHQw7lwEru40%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;931&quot; height=&quot;131&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문자열을 입력받을 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ylDis/dJMcafkLbna/b5QIegGpd4zD2W64kQt251/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ylDis/dJMcafkLbna/b5QIegGpd4zD2W64kQt251/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ylDis/dJMcafkLbna/b5QIegGpd4zD2W64kQt251/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FylDis%2FdJMcafkLbna%2Fb5QIegGpd4zD2W64kQt251%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;493&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;493&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;if문을 이용해 input string이 &quot;Akaqe27J&quot;이면 flag가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DBlp/dJMcadNXWNw/SdcOqNZQKnYQUI6vfKe2rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DBlp/dJMcadNXWNw/SdcOqNZQKnYQUI6vfKe2rk/img.png&quot; data-alt=&quot;'string.exe' 파일을 실행한 후, 입력으로 'Zkaqe27J'를 준 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DBlp/dJMcadNXWNw/SdcOqNZQKnYQUI6vfKe2rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DBlp%2FdJMcadNXWNw%2FSdcOqNZQKnYQUI6vfKe2rk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1251&quot; height=&quot;332&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'string.exe' 파일을 실행한 후, 입력으로 'Zkaqe27J'를 준 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;9. xor&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzrEi/dJMcacauSLP/8KIg3F1rPHqlJkAyQ8D3gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzrEi/dJMcacauSLP/8KIg3F1rPHqlJkAyQ8D3gk/img.png&quot; data-alt=&quot;숫자를 입력 받을 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzrEi/dJMcacauSLP/8KIg3F1rPHqlJkAyQ8D3gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzrEi%2FdJMcacauSLP%2F8KIg3F1rPHqlJkAyQ8D3gk%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;915&quot; height=&quot;131&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;숫자를 입력 받을 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk6Ax/dJMcahJELWg/bKBEw1vcCAnxnvzgdWKbK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk6Ax%2FdJMcahJELWg%2FbKBEw1vcCAnxnvzgdWKbK1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;38&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qS5kV/dJMb99SnZ77/l7U0S59fRxxTk7fECgymT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qS5kV/dJMb99SnZ77/l7U0S59fRxxTk7fECgymT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qS5kV/dJMb99SnZ77/l7U0S59fRxxTk7fECgymT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqS5kV%2FdJMb99SnZ77%2Fl7U0S59fRxxTk7fECgymT0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;350&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;350&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;해당 문제는 원래는 xor 연산이 포함되었으나, 컴파일러가 최적화하는 과정에서 xor 로직이 날라가 10진수 &amp;lt;-&amp;gt;16진수 변환 관련 문제로 전환되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IRSkR/dJMcafrxdx9/4Nffa9M3Wnh375Qzr4cmk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IRSkR/dJMcafrxdx9/4Nffa9M3Wnh375Qzr4cmk0/img.png&quot; data-alt=&quot;'xor.exe' 파일을 실행한 후, 16진수 'DEAD8EEF'를 10진수로 변환한 값인 '3735928559'를 입력으로 준 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IRSkR/dJMcafrxdx9/4Nffa9M3Wnh375Qzr4cmk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIRSkR%2FdJMcafrxdx9%2F4Nffa9M3Wnh375Qzr4cmk0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;325&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'xor.exe' 파일을 실행한 후, 16진수 'DEAD8EEF'를 10진수로 변환한 값인 '3735928559'를 입력으로 준 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;10. toyransome&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 설명: 주어진 소스코드 파일을 분석하여 암호화된 파일을 복호화하는 문제&lt;/li&gt;
&lt;li&gt;파일 구성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;toyransome_flag.enc: 암호화된 flag 파일&lt;/li&gt;
&lt;li&gt;toyransome.c: flag를 암호화하는 바이너리 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRJITG/dJMcabbANFY/bQpeKkHbx293g1gkNlUOa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRJITG/dJMcabbANFY/bQpeKkHbx293g1gkNlUOa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRJITG/dJMcabbANFY/bQpeKkHbx293g1gkNlUOa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRJITG%2FdJMcabbANFY%2FbQpeKkHbx293g1gkNlUOa0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;498&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;498&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;11. flag_generator&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yho7r/dJMcajtSqcy/rgXQJqaGJmJRGX1dJNP8P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yho7r/dJMcajtSqcy/rgXQJqaGJmJRGX1dJNP8P0/img.png&quot; data-alt=&quot;flag가 어느 메모리에 존재하는지 위치를 알려줌&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yho7r/dJMcajtSqcy/rgXQJqaGJmJRGX1dJNP8P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyho7r%2FdJMcajtSqcy%2FrgXQJqaGJmJRGX1dJNP8P0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;381&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flag가 어느 메모리에 존재하는지 위치를 알려줌&lt;/figcaption&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;flag가 존재하는 위치를 실행 시점에 디버깅하면 flag를 쉽게 확인 가능하다. (동적 분석)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브레이크 포인트를 잘 걸고 (여기에선 return문에 브레이크 포인트) 실행을 시켜주면 flag가 스택에 남아있는 거 확인 가능&lt;/li&gt;
&lt;/ul&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;※ IDA는 정적 분석 도구지만 동적 분석도 가능하여 브레이크 포인트를 걸고 실행시킬 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Step into: 함수가 실행되는 그 안으로 들어간다는 의미&lt;/li&gt;
&lt;li&gt;Step over: 그걸 넘어서 가겠다는 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동적 디버깅 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6yQK4/dJMcaiPhgbB/K4wHXlgXVKexxgpizlC2W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6yQK4/dJMcaiPhgbB/K4wHXlgXVKexxgpizlC2W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6yQK4/dJMcaiPhgbB/K4wHXlgXVKexxgpizlC2W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6yQK4%2FdJMcaiPhgbB%2FK4wHXlgXVKexxgpizlC2W0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1452&quot; height=&quot;747&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QgwRl/dJMcaiIvM4e/KJSmIOxdlKkqB5Dekdo7p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QgwRl/dJMcaiIvM4e/KJSmIOxdlKkqB5Dekdo7p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QgwRl/dJMcaiIvM4e/KJSmIOxdlKkqB5Dekdo7p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQgwRl%2FdJMcaiIvM4e%2FKJSmIOxdlKkqB5Dekdo7p0%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1429&quot; height=&quot;847&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnsVQ9/dJMcabJrefm/XxfzCTZ4d9McQHC9Whfej1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnsVQ9/dJMcabJrefm/XxfzCTZ4d9McQHC9Whfej1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnsVQ9/dJMcabJrefm/XxfzCTZ4d9McQHC9Whfej1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnsVQ9%2FdJMcabJrefm%2FXxfzCTZ4d9McQHC9Whfej1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1435&quot; height=&quot;775&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;775&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IGQ58/dJMcagYgOUO/KHkPwtKLR8o7375g0H9oeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IGQ58/dJMcagYgOUO/KHkPwtKLR8o7375g0H9oeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IGQ58/dJMcagYgOUO/KHkPwtKLR8o7375g0H9oeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIGQ58%2FdJMcagYgOUO%2FKHkPwtKLR8o7375g0H9oeK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;782&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;782&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;※ 참고자료&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arsenic-dev.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://arsenic-dev.tistory.com/106&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/소프트웨어보안</category>
      <category>flag</category>
      <category>IDA</category>
      <category>reversing</category>
      <category>동적분석</category>
      <category>정적분석</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/116</guid>
      <comments>https://arsenic-dev.tistory.com/116#entry116comment</comments>
      <pubDate>Sat, 6 Dec 2025 14:51:13 +0900</pubDate>
    </item>
    <item>
      <title>ForeignKey와 OneToOneField</title>
      <link>https://arsenic-dev.tistory.com/115</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. ForeignKey (1:N 관계)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ForeignKey는 여러 개가 하나를 참조하는 Many-to-One 관계이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g., 여러 개의 Post가 하나의 User 참조&lt;/li&gt;
&lt;li&gt;e.g., 여러 개의 Order가 하나의 Customer 참조&lt;/li&gt;
&lt;/ul&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;b&gt;Example&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1763541995966&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,     # 유저 삭제 시 그 유저 글도 같이 삭제
        related_name='posts'          # user.posts 로 역참조 가능
    )&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;Post : User = N : 1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 User는 여러 개의 Post 가질 수 있음 -&amp;gt; user.posts.all()&lt;/li&gt;
&lt;li&gt;하나의 Post는 반드시 하나의 author(User)만 가짐 -&amp;gt; post.author&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. OneToOneField (1:1 관계)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OneToOneField는 딱 하나와만 연결되는 1:1 관계이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e.g., User 1명당 Profile 1개&lt;/li&gt;
&lt;li&gt;e.g., Student 1명당 StudentCard 1개&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1763542271683&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='profile'
    )
    bio = models.TextField(blank=True)
    profile_image = models.ImageField(upload_to='profiles/', blank=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;User : Profile = 1 : 1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 유저는 딱 하나의 프로필만 가질 수 있음 -&amp;gt; user.profile&lt;/li&gt;
&lt;li&gt;한 프로필도 딱 한 유저에만 연결됨 -&amp;gt; profile.user&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OneToOneField의 경우, 내부적으로는 Unique 제약이 있는 ForeignKey라고 볼 수 있다.&lt;/p&gt;</description>
      <category>Web/Django</category>
      <category>ForeignKey</category>
      <category>OneToOneField</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/115</guid>
      <comments>https://arsenic-dev.tistory.com/115#entry115comment</comments>
      <pubDate>Wed, 19 Nov 2025 17:55:49 +0900</pubDate>
    </item>
    <item>
      <title>Git 필수 명령어</title>
      <link>https://arsenic-dev.tistory.com/114</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. GitHub 레포지토리에서 코드 받아오기 (clone)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누가 만들어둔 GitHub 프로젝트를 내 PC로 가져와서 편집하려는 경우 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762346051737&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone &amp;lt;레포지토리_URL&amp;gt;&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;레포지토리가 내 PC에 복제되고, 이 안에서 코드 수정 -&amp;gt; commit -&amp;gt; push 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 내 로컬 프로젝트를 새 GitHub 레포지토리와 연결하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 새 프로젝트를 로컬에서 만들었고, 그걸 GitHub에 올리고 싶을 경우 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762346275595&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd &amp;lt;프로젝트_폴더&amp;gt;
git init                     # 깃 시작
git add .                    # 전체 파일 스테이징
git commit -m &quot;first commit&quot; # 첫 커밋
git branch -M main           # main 브랜치 세팅(기본 master일 수도 있음)
git remote add origin &amp;lt;레포_URL&amp;gt;   # GitHub와 연결
git push -u origin main      # GitHub에 업로드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 연결되어 있는 상태에서 Push / Pull&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Push (내 코드 -&amp;gt; GitHub 올리기)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762346367557&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add .
git commit -m &quot;commit message&quot;
git push&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;&lt;b&gt;Pull (GitHub -&amp;gt; 내 코드 최신화)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762346397591&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Branch 사용법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;새 브랜치 생성 + 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762346460218&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch &amp;lt;브랜치명&amp;gt;
git checkout &amp;lt;브랜치명&amp;gt;&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;&lt;b&gt;브랜치 목록 보기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762346477858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch&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;&lt;b&gt;브랜치 삭제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1762346498095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch -d &amp;lt;브랜치명&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. 현재 git 상태 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1762346713330&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DevOps/Git</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/114</guid>
      <comments>https://arsenic-dev.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 5 Nov 2025 21:45:31 +0900</pubDate>
    </item>
    <item>
      <title>Django로 웹 개발하기: todo_list</title>
      <link>https://arsenic-dev.tistory.com/113</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #666666; text-align: start;&quot;&gt;권태형 저자님의 '백엔드를 위한 DJANGO REST FRAMEWORK with 파이썬'을 기반으로 정리한 글입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;border-left: 10px solid #444; border-bottom: 2px solid #444; border-top: 10px solid #fff; background: #fff; color: #000; font-weight: bold; margin: 0.5em 0em; padding: 0.2em 1em 0.4em 0.5em; border-radius: 0px 0px 0px 0px;&quot; data-ke-size=&quot;size23&quot;&gt;Chapter 3: Django로 Todo 목록 웹 서비스 만들기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Todo 목록 웹 서비스 시작하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로젝트 생성하기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2SayB/dJMcajgcx5y/xVE6ww3pZfuS34q5d35CTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2SayB/dJMcajgcx5y/xVE6ww3pZfuS34q5d35CTK/img.png&quot; data-alt=&quot;가상 환경 세팅 -&amp;amp;gt; 장고 설치 -&amp;amp;gt; 장고 프로젝트 생성 -&amp;amp;gt; todo 앱 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2SayB/dJMcajgcx5y/xVE6ww3pZfuS34q5d35CTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2SayB%2FdJMcajgcx5y%2FxVE6ww3pZfuS34q5d35CTK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;2878&quot; height=&quot;1716&quot; data-origin-width=&quot;2878&quot; data-origin-height=&quot;1716&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;가상 환경 세팅 -&amp;gt; 장고 설치 -&amp;gt; 장고 프로젝트 생성 -&amp;gt; todo 앱 생성&lt;/figcaption&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;b&gt;Todo 프로젝트 설정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings.py&lt;/p&gt;
&lt;pre id=&quot;code_1761670378372&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'todo',
]

TIME_ZONE = 'Asia/Seoul'&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;그리고 이후 개발에 필요한 파일들을 미리 만들어놓는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;todo 앱 폴더 안에 templates 폴더를 만들고 그 안에 다시 todo 폴더 생성&lt;/li&gt;
&lt;li&gt;todo 앱 폴더 안에 forms.py, models.py, urls.py 생성&lt;/li&gt;
&lt;/ul&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA5zvv/dJMcac9dxdK/yGpbsjqt7E4Ii01DhoPkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA5zvv/dJMcac9dxdK/yGpbsjqt7E4Ii01DhoPkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA5zvv/dJMcac9dxdK/yGpbsjqt7E4Ii01DhoPkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA5zvv%2FdJMcac9dxdK%2FyGpbsjqt7E4Ii01DhoPkKK%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1223&quot; height=&quot;880&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;880&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;Django가 내부 데이터베이스 테이블을 만들지 못한 상태에서 createsuperuser 명령을 실행하면 오류가 발생한다. 때문에 해당 오류 방지를 위해 migration을 적용해 Django가 필요한 모든 DB 테이블을 자동으로 생성할 수 있도록 해야 한다.&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;b&gt;Todo 모델 생성하기&lt;/b&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;pre id=&quot;code_1761671522077&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.db import models

class Todo(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    created = models.DateTimeField(auto_now_add=True)
    completed = models.BooleanField(default=False)
    important = models.BooleanField(default=False)

    def __str__(self):
        return self.title&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;이제 아래 코드를 통해 모델에 대한 마이그레이션을 진행하면 모델 생성이 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1761671729720&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py makemigrations
python manage.py migrate&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;그리고나서 관리자 페이지에서 모델을 확인할 수 있도록, todo/admin.py에서 Todo 모델을 등록한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761671870222&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib import admin
from .models import Todo

admin.site.register(Todo)&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;관리자 페이지에 접속하려면 url이 설정되어야 하기 때문에, mytodo/urls.py에서 path가 아래처럼 잘 설정되어 있는지 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761672036502&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Todo 전체 조회 기능 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Todo 전체 조회 기능 컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 페이지인 Todo 전체 조회 기능에서는 완료되지 않은, 즉 진행 중인 Todo만 보여주고 완료된 Todo는 다른 페이지에서 보여주도록 한다.&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;b&gt;Bootstrap으로 좀 더 멋진 템플릿 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bootstrap은 가장 유명하고 오래된 CSS 프레임워크이다. 미리 스타일이 정의되어 있으며, 사용법이 간단하고 정갈한 결과물이 만들어지기 때문에 지금처럼 간단하게 꾸미고 싶은 경우 유용하게 활용할 수 있다.&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;b&gt;Template&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo_list.html&lt;/p&gt;
&lt;pre id=&quot;code_1761703340478&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;TODO 목록 앱&amp;lt;/title&amp;gt;
        &amp;lt;Link
            rel=&quot;stylesheet&quot;
            href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
        /&amp;gt;
        &amp;lt;Link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css&quot; /&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;h1&amp;gt;TODO 목록 앱&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;
                &amp;lt;a href=&quot;&quot;&amp;gt;&amp;lt;i class=&quot;bi-plus&quot;&amp;gt;&amp;lt;/i&amp;gt;Add Todo&amp;lt;/a&amp;gt;
                &amp;lt;a href=&quot;&quot; class=&quot;btn btn-primary&quot; style=&quot;float:right&quot;&amp;gt;완료한 TODO목록&amp;lt;/a&amp;gt;
            &amp;lt;/p&amp;gt;
            &amp;lt;ul class=&quot;list-group&quot;&amp;gt;
                {% for todo in todos %}
                &amp;lt;li class=&quot;list-group-item&quot;&amp;gt;
                    &amp;lt;a href=&quot;&quot;&amp;gt;{{todo.title}}&amp;lt;/a&amp;gt;
                    {% if todo.important %}
                    &amp;lt;span class=&quot;badge badge-danger&quot;&amp;gt;!&amp;lt;/span&amp;gt;
                    {% endif %}
                    &amp;lt;div style=&quot;float:right&quot;&amp;gt;
                        &amp;lt;a href=&quot;&quot; class=&quot;btn btn-danger&quot;&amp;gt;완료&amp;lt;/a&amp;gt;
                        &amp;lt;a href=&quot;&quot; class=&quot;btn btn-outline-primary&quot;&amp;gt;수정하기&amp;lt;/a&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/li&amp;gt;
                {% endfor %}
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;position: relative; background-color: #ffffff; padding: 10px 25px 10px 65px; margin: 0.5em 0; border: 1px solid #787878; border-radius: 10px;&quot;&gt;
&lt;div style=&quot;position: absolute; top: -1px; left: 14px; width: 30px; height: 47px; background-color: #4a4a4a;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;position: absolute; top: 17px; left: 14px; width: 0; height: 0; border: 15px solid; border-color: transparent transparent #ffffff transparent;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Bootstrap 사용 법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. &amp;lt;head&amp;gt; 안에 &amp;lt;link&amp;gt; 태그가 있고 여기에서 Bootstrap을 불러온다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bootstrap을 사용하기 위한 방법은 두 가지, 첫 번째 방법은 Bootstrap 홈페이지에서 css 파일들을 받아와 프로젝트 폴더에 집어넣는 방식이고, 두 번째 방식은 웹 링크 형태로 제공되는 css 파일을 가져다 쓰도록 참조시키는 방식이다.&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;성능 면에서는 첫 번째 방법이 당연히 더 좋겠지만 간단히 적용할 땐 웹 링크 방식이 편리하다. 그리고 이런 방식을 cdn(content delivery network) 방식이라고 한다.&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;b&gt;2. 각 태그마다 class를 작성한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bootstrap은 결국 미리 작성된 CSS이므로, CSS의 기본 작성 단위인 class를 따르고 있다. class를 쓰면 여러 태그를 한꺼번에 스타일링 가능한데, 이러한 class를 통해 Bootstrap에서 작성한 스타일을 각 태그마다 적용하고 있으며 이 class 이름은 Bootstrap이 미리 정의해놓은 값이다.&lt;/p&gt;
&lt;/div&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;lt;a&amp;gt;&amp;lt;/a&amp;gt; vs &amp;lt;link /&amp;gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;a&amp;gt;: 사용자가 클릭하는 링크&lt;/li&gt;
&lt;li&gt;&amp;lt;link&amp;gt;: 브라우저가 참고하는 외부 리소스 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;link&amp;gt;의 rel 속성은 현재 문서와 외부 리소스 간의 관계(relationship)를 나타내는 속성이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-pm-slice=&quot;1 1 []&quot;&gt;stylesheet: 외부 css 파일을 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;list 태그 예시&lt;/p&gt;
&lt;pre id=&quot;code_1761703454464&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  &amp;lt;li&amp;gt;사과&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;바나나&amp;lt;/li&amp;gt;
  &amp;lt;li&amp;gt;딸기&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size16&quot;&gt;기타 태그 및 css 속성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-pm-slice=&quot;0 0 []&quot;&gt;&amp;lt;i&amp;gt;&amp;lt;/i&amp;gt;: icon 삽입시 사용하는 태그&lt;/li&gt;
&lt;li data-pm-slice=&quot;0 0 []&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;: inline으로 특정 부분만 스타일이나 클래스를 적용할 때 쓰는 태그&lt;/span&gt;&lt;/li&gt;
&lt;li data-pm-slice=&quot;0 0 []&quot;&gt;style=&quot;float: right&quot;: 요소를 오른쪽으로 띄워 배치하고, 다른 내용이 왼쪽으로 감싸지게 하는 CSS 속성&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-pm-slice=&quot;0 0 []&quot; data-ke-size=&quot;size16&quot;&gt;※ HTML Tag auto close 적용 안 될시, vscode 하단에 언어가 HTML로 잘 설정되어 있는지 확인하고 안 되어 있으면 HTML로 설정해야 한다.&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;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료되지 않은 Todo만 전달해야 하기 때문에 completed=False 옵션으로 필터링한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761704542465&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import render, redirect
from .models import Todo

def todo_list(request):
    todos = Todo.objects.filter(completed=False)
    return render(request, 'todo/todo_list.html', {'todos': todos})&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;&lt;b&gt;URL&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 페이지에서 Todo 목록을 보여줄 수 있도록 todo/urls.py를 아래와 같이 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761704665815&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.urls import path
from . import views

urlpatterns = [
    path('', views.todo_list, name='todo_list'),
]&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;또한, todo 앱 url을 프로젝트 url에 연결해야 하기에, mytodo/urls.py에 아래와 같이 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761704764010&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('todo/', include('todo.urls')),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Todo 상세 조회 기능 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Todo 상세 조회 기능 컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Todo를 선택했을 때 조회할 수 있는 기능으로, Todo 제목과 설명을 나타내도록 구현한다.&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;b&gt;Template&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo_detail.html&lt;/p&gt;
&lt;pre id=&quot;code_1761705279130&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;TODO 목록 앱&amp;lt;/title&amp;gt;
        &amp;lt;Link
            rel=&quot;stylesheet&quot;
            href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
        /&amp;gt;
        &amp;lt;Link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css&quot; /&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;h1&amp;gt;TODO 상세보기&amp;lt;/h1&amp;gt;
            &amp;lt;div class=&quot;container&quot;&amp;gt;
                &amp;lt;div class=&quot;row&quot;&amp;gt;
                    &amp;lt;div class=&quot;col-md-12&quot;&amp;gt;
                        &amp;lt;div class=&quot;card&quot;&amp;gt;
                            &amp;lt;div class=&quot;card-body&quot;&amp;gt;
                                &amp;lt;h5 class=&quot;card-title&quot;&amp;gt;{{todo.title}}&amp;lt;/h5&amp;gt;
                                &amp;lt;p class=&quot;card-text&quot;&amp;gt;{{todo.description}}&amp;lt;/p&amp;gt;
                                &amp;lt;a href=&quot;{% url 'todo_list' %}&quot; class=&quot;btn btn-primary&quot;&amp;gt;목록으로&amp;lt;/a&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;  
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;&lt;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761705402919&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def todo_detail(request, pk):
    todo = Todo.objects.get(id=pk)
    return render(request, 'todo/todo_detail.html', {'todo': todo})&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;선택된 Todo의 pk인 id를 기반으로 Todo 객체를 찾아 todo_detail.html로 전달할 수 있도록 위와 같이 작성하고, todo_list.html의 버튼에 링크를 넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1761705514908&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'todo_detail' pk=todo.pk %}&quot;&amp;gt;{{todo.title}}&amp;lt;/a&amp;gt;&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;&lt;b&gt;URL&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url은 todo/urls.py에서 /pk/로 설정하여 해당 Todo를 연결할 수 있도록 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761705618464&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('', views.todo_list, name='todo_list'),
    path('&amp;lt;int:pk&amp;gt;/', views.todo_detail, name='todo_detail'),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Todo 생성 기능 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Todo 생성 기능 컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo/forms.py에 제목, 설명, 중요도를 입력할 수 있도록 입력 폼을 만들어 주어야 한다.&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;b&gt;Template&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo/forms.py&lt;/p&gt;
&lt;pre id=&quot;code_1761705814459&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django import forms
from .models import Todo

class TodoForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields = ('title', 'description', 'important')&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;이렇게 작성한 폼을 활용하여 템플릿을 작성한다.&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;todo_post.html&lt;/p&gt;
&lt;pre id=&quot;code_1761706066637&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;TODO 목록 앱&amp;lt;/title&amp;gt;
        &amp;lt;Link
            rel=&quot;stylesheet&quot;
            href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
        /&amp;gt;
        &amp;lt;Link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css&quot; /&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;h1&amp;gt;TODO 추가하기&amp;lt;/h1&amp;gt;
            &amp;lt;div class=&quot;container&quot;&amp;gt;
                &amp;lt;div class=&quot;row&quot;&amp;gt;
                    &amp;lt;div class=&quot;col-md-12&quot;&amp;gt;
                        &amp;lt;div class=&quot;card&quot;&amp;gt;
                            &amp;lt;div class=&quot;card-body&quot;&amp;gt;
                                &amp;lt;form method=&quot;POST&quot;&amp;gt;
                                    {% csrf_token %} {{form.as_p}}
                                    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;등록&amp;lt;/button&amp;gt;
                                &amp;lt;/form&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;  
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;&lt;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Todo를 생성하기 위한 뷰는 POST 요청을 처리할 수 있어야 한다. POST 요청이 들어왔을 때는 폼을 검증하고 데이터를 저장할 수 있도록 하며, GET 요청이 들어왔을 때는 폼을 포함한 템플릿 페이지를 보여주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1761706283944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from django.shortcuts import render, redirect
from .models import Todo
from .forms import TodoForm

def todo_list(request):
    todos = Todo.objects.filter(completed=False)
    return render(request, 'todo/todo_list.html', {'todos': todos})

def todo_detail(request, pk):
    todo = Todo.objects.get(id=pk)
    return render(request, 'todo/todo_detail.html', {'todo': todo})

def todo_post(request):
    if request.method == &quot;POST&quot;:
        form = TodoForm(request.POST)
        if form.is_valid():
            todo = form.save(commit=False)
            todo.save()
            return redirect('todo_list')
    else:
        form = TodoForm()
    return render(request, 'todo/todo_post.html', {'form': form})&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;그 후, todo_list.html의 버튼에 링크를 넣어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1761706359693&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'todo_post' %}&quot;&amp;gt;&amp;lt;i class=&quot;bi-plus&quot;&amp;gt;&amp;lt;/i&amp;gt;Add Todo&amp;lt;/a&amp;gt;&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;&lt;b&gt;URL&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761706465132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('', views.todo_list, name='todo_list'),
    path('&amp;lt;int:pk&amp;gt;/', views.todo_detail, name='todo_detail'),
    path('post/', views.todo_post, name='todo_post'),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Todo 수정 기능 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Todo 수정 기능 컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 기능을 만들 때는 생성 기능과 동일하게 작성하되, 기존 Todo 데이터를 불러와 함게 템플릿으로 보내는 것만 구현하면 된다.&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;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761706693580&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def todo_post(request):
    if request.method == &quot;POST&quot;:
        form = TodoForm(request.POST)
        if form.is_valid():
            todo = form.save(commit=False)
            todo.save()
            return redirect('todo_list')
    else:
        form = TodoForm()
    return render(request, 'todo/todo_post.html', {'form': form})

def todo_edit(request, pk):
    todo = Todo.objects.get(id=pk)
    if request.method == &quot;POST&quot;:
        form = TodoForm(request.POST, instance=todo)
        if form.is_valid():
            todo = form.save(commit=False)
            todo.save()
            return redirect('todo_list')
    else:
        form = TodoForm(instance=todo)
    return render(request, 'todo/todo_post.html', {'form': form})&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;그리고 todo_list.html의 버튼에 링크를 다음과 같이 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761706834849&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'todo_post' %}&quot;&amp;gt;&amp;lt;i class=&quot;bi-plus&quot;&amp;gt;&amp;lt;/i&amp;gt;Add Todo&amp;lt;/a&amp;gt;

&amp;lt;a href=&quot;{% url 'todo_edit' pk=todo.pk %}&quot; class=&quot;btn btn-outline-primary&quot;&amp;gt;수정하기&amp;lt;/a&amp;gt;&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;&lt;b&gt;URL&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1761706903914&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('', views.todo_list, name='todo_list'),
    path('&amp;lt;int:pk&amp;gt;/', views.todo_detail, name='todo_detail'),
    path('post/', views.todo_post, name='todo_post'),
    path('&amp;lt;int:pk&amp;gt;/edit/', views.todo_edit, name='todo_edit'),
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Todo 완료 기능 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Todo 완료 기능 컨셉&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Todo 완료 기능은 완료 버튼을 눌렀을 때 Todo의 completed을 True로 설정해 주는 기능이다. 또한 완료 Todo 조회 기능은 완료된 Todo만 필터링하여 볼 수 있도록 하는 기능이다.&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;b&gt;Template&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;done_list.html&lt;/p&gt;
&lt;pre id=&quot;code_1761707179633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;title&amp;gt;TODO 목록 앱&amp;lt;/title&amp;gt;
        &amp;lt;Link
            rel=&quot;stylesheet&quot;
            href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css&quot;
        /&amp;gt;
        &amp;lt;Link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.1/font/boot-strap-icons.css&quot; /&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;h1&amp;gt;DONE 목록&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;
                &amp;lt;a href=&quot;{% url 'todo_list' %}&quot; class=&quot;btn btn-outline-primary&quot;&amp;gt;홈으로&amp;lt;/a&amp;gt;
            &amp;lt;/p&amp;gt;
            &amp;lt;ul class=&quot;list-group&quot;&amp;gt;
                {% for done in dones %}
                &amp;lt;li class=&quot;list-group-item&quot;&amp;gt;
                    &amp;lt;a href=&quot;{% url 'todo_detail' pk=done.pk %}&quot;&amp;gt;{{done.title}}&amp;lt;/a&amp;gt;
                    {% if done.important %}
                    &amp;lt;span class=&quot;badge badge-danger&quot;&amp;gt;!&amp;lt;/span&amp;gt;
                    {% endif %}
                &amp;lt;/li&amp;gt;
                {% endfor %}
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&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;그리고나서 todo_list.html의 버튼에 링크를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761707299828&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'done_list' %}&quot; class=&quot;btn btn-primary&quot; style=&quot;float:right&quot;&amp;gt;완료한 TODO 목록&amp;lt;/a&amp;gt;&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;&lt;b&gt;View&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Todo 완료 기능에서 필요한 뷰는 두 가지로, 완료된 목록을 보여주는 기능과 Todo를 완료로 바꿔주는 기능이 있다.&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;완료된 목록을 보여주는 것은 앞서 todo_list() 뷰와 동일하게 작성되며 completed=True로 필터링 하는 것만 다르다. 그리고 Todo를 완료로 바꾸기 위해서는 Todo 객체를 가져와 completed을 True로 설정한 다음 저장하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1761707874921&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def done_list(request):
    dones = Todo.objects.filter(completed=True)
    return render(request, 'todo/done_list.html', {'dones': dones})

def todo_done(request, pk):
    todo = Todo.objects.get(id=pk)
    todo.completed = True
    todo.save()
    return redirect('todo_list')&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;마찬가지로, todo_list.html 내 버튼에 링크를 추가해 준다.&lt;/p&gt;
&lt;pre id=&quot;code_1761708176799&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a href=&quot;{% url 'todo_done' pk=todo.pk %}&quot; class=&quot;btn btn-danger&quot;&amp;gt;완료&amp;lt;/a&amp;gt;&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;&lt;b&gt;URL&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 url을 연결한다.&lt;/p&gt;
&lt;pre id=&quot;code_1761708440423&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;urlpatterns = [
    path('', views.todo_list, name='todo_list'),
    path('&amp;lt;int:pk&amp;gt;/', views.todo_detail, name='todo_detail'),
    path('post/', views.todo_post, name='todo_post'),
    path('&amp;lt;int:pk&amp;gt;/edit/', views.todo_edit, name='todo_edit'),
    path('done/', views.done_list, name='done_list'),
    path('done/&amp;lt;int:pk&amp;gt;/', views.todo_done, name='todo_done'),
]&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;※ Django에서 pk와 id는 기본 키를 가리키며, 기본 키가 나중에 id가 아닌 다른 필드로 바뀌어도 pk는 항상 작동하므로, URL이나 템플릿에서는 pk로 통일하는 것이 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO4kMC/dJMcafESbM4/i0lVb9ZfKQETCnh1OBWpa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO4kMC/dJMcafESbM4/i0lVb9ZfKQETCnh1OBWpa1/img.png&quot; data-alt=&quot;결과: 모든 기능 정상 작동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO4kMC/dJMcafESbM4/i0lVb9ZfKQETCnh1OBWpa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO4kMC%2FdJMcafESbM4%2Fi0lVb9ZfKQETCnh1OBWpa1%2Fimg.png&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; loading=&quot;lazy&quot; width=&quot;1355&quot; height=&quot;393&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과: 모든 기능 정상 작동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Web/Django</category>
      <category>Form</category>
      <category>template</category>
      <category>url</category>
      <category>view</category>
      <author>arsenic-dev</author>
      <guid isPermaLink="true">https://arsenic-dev.tistory.com/113</guid>
      <comments>https://arsenic-dev.tistory.com/113#entry113comment</comments>
      <pubDate>Wed, 29 Oct 2025 12:44:16 +0900</pubDate>
    </item>
  </channel>
</rss>