<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>leginwos</title>
    <link>https://leginwos.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 24 May 2026 00:46:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>leginwos</managingEditor>
    <image>
      <title>leginwos</title>
      <url>https://tistory1.daumcdn.net/tistory/6449357/attach/52cf41eab8064ee889311f8ecddad7f4</url>
      <link>https://leginwos.tistory.com</link>
    </image>
    <item>
      <title>근황</title>
      <link>https://leginwos.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2024.04.15 ~ 2025.12.14&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실한 날짜는 &amp;macr;\_(ツ)_/&amp;macr;&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;</description>
      <category>roknavy</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/71</guid>
      <comments>https://leginwos.tistory.com/71#entry71comment</comments>
      <pubDate>Sat, 22 Jun 2024 15:51:22 +0900</pubDate>
    </item>
    <item>
      <title>5. Fuzzing 101 - Exercise 5</title>
      <link>https://leginwos.tistory.com/70</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 환경설정 및 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대상(LibXML2)&amp;nbsp;다운로드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 디렉토리 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712215358907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME
mkdir Fuzzing_libxml2 &amp;amp;&amp;amp; cd Fuzzing_libxml2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 다운로드 및 압축해제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712215366418&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget http://xmlsoft.org/download/libxml2-2.9.4.tar.gz
tar xvf libxml2-2.9.4.tar.gz &amp;amp;&amp;amp; cd libxml2-2.9.4/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LibXML2&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;설치 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;Libxml2&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;설치 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712215407446&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install python-dev
CC=afl-clang-lto CXX=afl-clang-lto++ CFLAGS=&quot;-fsanitize=address&quot; CXXFLAGS=&quot;-fsanitize=address&quot; LDFLAGS=&quot;-fsanitize=address&quot; ./configure --prefix=&quot;$HOME/Fuzzing_libxml2/libxml2-2.9.4/install&quot; --disable-shared --without-debug --without-ftp --without-http --without-legacy --without-python LIBS='-ldl'
make -j$(nproc)
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CC=afl-clang-lto: C 컴파일러를 afl-clang-lto로 설정한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CXX=afl-clang-lto++: C++ 컴파일러를 afl-clang-lto++로 설정한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CFLAGS=&quot;-fsanitize=address&quot;: C 컴파일러게 ASAN을 활성화하도록 지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CXXFLAGS=&quot;-fsanitize=address&quot;: C++ 컴파일러에게 ASAN을 활성화하도록 지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;=&amp;gt; C, C++ 코드를 컴파일 할 때, ASAN에 필요한 코드를 삽입한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LDFLAGS=&quot;-fsanitize=address&quot;: 링커에게 링크 과정에서 ASAN 라이브러리를 링크하도록 지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;=&amp;gt; 프로그램을 실행할 때, ASAN 라이브러리를 링크해 ASAN과 함께 실행하도록 한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--prefix:&amp;nbsp;프로그램을&amp;nbsp;설치할&amp;nbsp;디렉토리를&amp;nbsp;지정한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--disable-shared:&amp;nbsp;공유&amp;nbsp;라이브러리&amp;nbsp;생성을&amp;nbsp;비활성화한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--without-debug:&amp;nbsp;디버그&amp;nbsp;정보&amp;nbsp;기능을&amp;nbsp;빌드에서&amp;nbsp;제외한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--without-ftp:&amp;nbsp;FTP(File&amp;nbsp;Transfer&amp;nbsp;Protocol)기능을&amp;nbsp;빌드에서&amp;nbsp;제외한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--without-http:&amp;nbsp;HTTP기능을&amp;nbsp;빌드에서&amp;nbsp;제외한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--without-legacy:&amp;nbsp;레거시(과거에&amp;nbsp;사용되던&amp;nbsp;기술,&amp;nbsp;소프트웨어,&amp;nbsp;시스템)기능을&amp;nbsp;빌드에서&amp;nbsp;제외한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--without-python:&amp;nbsp;Python&amp;nbsp;관련&amp;nbsp;기능을&amp;nbsp;빌드에서&amp;nbsp;제외한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LIBS='-ldl':&amp;nbsp;-ldl라이브러리를&amp;nbsp;링크한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;+)&amp;nbsp;'-ldl'&amp;nbsp;라이브러리는&amp;nbsp;프로그램이&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;make -j$(nproc): 현재 시스템의 프로세서 코어의 개수에 맞추어 병렬로 빌드를 실행하도록 한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Fuzzing101에서&amp;nbsp;제공하는&amp;nbsp;Seed&amp;nbsp;corpus&amp;nbsp;사용 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# Fuzzing101에서 제공한 SampleInput.xml 가져오기&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712215713056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir afl_in &amp;amp;&amp;amp; cd afl_in
wget https://raw.githubusercontent.com/antonio-morales/Fuzzing101/main/Exercise%205/SampleInput.xml
cd ..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dictionary&amp;nbsp;다운로드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# Dictionary(xml.dict) 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712215723091&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir dictionaries &amp;amp;&amp;amp; cd dictionaries
wget https://raw.githubusercontent.com/AFLplusplus/AFLplusplus/stable/dictionaries/xml.dict
cd ..&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;Dictionary는&amp;nbsp;text-based&amp;nbsp;file&amp;nbsp;format(ex)&amp;nbsp;XML)을&amp;nbsp;Fuzzing할&amp;nbsp;때&amp;nbsp;사용되며,&amp;nbsp;Fuzzer가&amp;nbsp;대상의&amp;nbsp;메모리&amp;nbsp;파일을&amp;nbsp;변형할&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;단어나&amp;nbsp;값들의&amp;nbsp;집합을&amp;nbsp;의미한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;Dictionary는&amp;nbsp;주로&amp;nbsp;Override,&amp;nbsp;Insert&amp;nbsp;작업에&amp;nbsp;사용된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;Override:&amp;nbsp;특정&amp;nbsp;위치를&amp;nbsp;Dictionary&amp;nbsp;길이만큼&amp;nbsp;다른&amp;nbsp;값으로&amp;nbsp;대체함으로써&amp;nbsp;파일의&amp;nbsp;구조와&amp;nbsp;문법을&amp;nbsp;변형한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;Insert:&amp;nbsp;Dictionary&amp;nbsp;항목을&amp;nbsp;현재&amp;nbsp;파일&amp;nbsp;위치에&amp;nbsp;삽입함으로써&amp;nbsp;파일의&amp;nbsp;구조와&amp;nbsp;크기를&amp;nbsp;변형한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Fuzzing 단계&lt;/span&gt;&lt;/h3&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;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tr5EY/btsGmNseg6B/yCX870pEZvOsEmiHrXxlR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tr5EY/btsGmNseg6B/yCX870pEZvOsEmiHrXxlR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tr5EY/btsGmNseg6B/yCX870pEZvOsEmiHrXxlR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTr5EY%2FbtsGmNseg6B%2FyCX870pEZvOsEmiHrXxlR0%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;646&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712215916314&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 마스터 인스턴스 예시
./afl-fuzz -i afl_in -o afl_out -M Master -- ./program @@

# 노예 인스턴스 예시
./afl-fuzz -i afl_in -o afl_out -S Slave1 -- ./program @@
./afl-fuzz -i afl_in -o afl_out -S Slave2 -- ./program @@
...
./afl-fuzz -i afl_in -o afl_out -S SlaveN -- ./program @@&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 시스템에 여러 개의 CPU 코어가 있으면, 여러 개의 인스턴스를 사용해 병렬적으로 Fuzzing을 효율적이게 수행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 이러한 공유 인스턴스 방식은 마스터 인스턴스와 노예 인스턴스가 있는데, 각각의 인스턴스는 옵션을 통해 구분할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- &amp;lsquo;-M&amp;rsquo;로 마스터 인스턴스를 설정하고 &amp;lsquo;-S&amp;rsquo;로 노예 인스턴스를 설정할 수 있는데, 마스터 인스턴스는 모든 노예 인스턴스를 제어하고 작업을 관리하며, 노예 인스턴스는 독립적으로 각각 마스터 인스턴스로부터 받은 테스트케이스를 변형하고 Fuzzing을 수행한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- Fuzzing으로 해당 crash를 찾지 못해 crash를 다운받아 진행했습니다. 이점 참고해주시면 감사하겠습니다 :)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 결과 분석&lt;/span&gt;&lt;/h3&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;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llW56/btsGlTmnVMU/Z4Y4omsDkKr7kKFU6YCgKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llW56/btsGlTmnVMU/Z4Y4omsDkKr7kKFU6YCgKk/img.png&quot; data-alt=&quot;ASAN crash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llW56/btsGlTmnVMU/Z4Y4omsDkKr7kKFU6YCgKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllW56%2FbtsGlTmnVMU%2FZ4Y4omsDkKr7kKFU6YCgKk%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;317&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASAN crash&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; xmlValidateElementContent() :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712216200488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// valid.c - xmlValidateElementContent()
#endif /* LIBXML_REGEXP_ENABLED */
    if ((warn) &amp;amp;&amp;amp; ((ret != 1) &amp;amp;&amp;amp; (ret != -3))) {
	if (ctxt != NULL) {
	    char expr[5000];
	    char list[5000];

	    expr[0] = 0;
	    xmlSnprintfElementContent(&amp;amp;expr[0], 5000, cont, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- xmlValidateElementContent() 함수에서 호출한 xmlSnprintfElementContent() 함수에서 stack buffer overflow가 발생했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712216293991&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// DTD 구조
&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;!DOCTYPE a [
&amp;lt;!ELEMENT a (ppppppp:llllllll)&amp;gt;
]&amp;gt;
&amp;lt;a/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 위와 같은 XML 문서의 구조를 정의하는 구조를 DTD(Document Type Definition)구조라고 하는데, 이러한 DTD 구조를 통해 새로운 문서 형식을 만들 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기서 ppppppp는 prefix를, lllllll은 name을 의미한다고 한다.&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;741&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjqxyX/btsGlwLJgUr/ZFS4Be0eIZoTmDtBF9RAA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjqxyX/btsGlwLJgUr/ZFS4Be0eIZoTmDtBF9RAA0/img.png&quot; data-alt=&quot;content 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjqxyX/btsGlwLJgUr/ZFS4Be0eIZoTmDtBF9RAA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjqxyX%2FbtsGlwLJgUr%2FZFS4Be0eIZoTmDtBF9RAA0%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;741&quot; height=&quot;318&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;content 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712216353539&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// valid.c - xmlSnprintfElementContent()
void
xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob) {
    int len;

    if (content == NULL) return;
    len = strlen(buf);
    if (size - len &amp;lt; 50) {
	if ((size - len &amp;gt; 4) &amp;amp;&amp;amp; (buf[len - 1] != '.'))
	    strcat(buf, &quot; ...&quot;);
	return;
    }
    if (englob) strcat(buf, &quot;(&quot;);
    switch (content-&amp;gt;type) {
        case XML_ELEMENT_CONTENT_PCDATA:
            strcat(buf, &quot;#PCDATA&quot;);
	    break;	
	case XML_ELEMENT_CONTENT_ELEMENT:
	    if (content-&amp;gt;prefix != NULL) {
		if (size - len &amp;lt; xmlStrlen(content-&amp;gt;prefix) + 10) {
		    strcat(buf, &quot; ...&quot;);
		    return;
		}
		strcat(buf, (char *) content-&amp;gt;prefix);
		strcat(buf, &quot;:&quot;);
	    }
	    if (size - len &amp;lt; xmlStrlen(content-&amp;gt;name) + 10) {
		strcat(buf, &quot; ...&quot;);
		return;
	    }
	    if (content-&amp;gt;name != NULL)
		strcat(buf, (char *) content-&amp;gt;name);
	    break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- content를 gdb로 확인해 보면, XML_ELEMENT_CONTENT_ELEMENT을 충족하므로 위 코드의 switch (content-&amp;gt;type) case 조건에 맞게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 위 코드에서는 앞에서 보았던 prefix와 name을 strcat()을 통해 buf에 붙여주는데, 여기서 문제가 발생한다.&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;960&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDnbKi/btsGlRhPumS/Gn3h2Neg9QxMcRxIStzMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDnbKi/btsGlRhPumS/Gn3h2Neg9QxMcRxIStzMhk/img.png&quot; data-alt=&quot;profix, name 길이 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDnbKi/btsGlRhPumS/Gn3h2Neg9QxMcRxIStzMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDnbKi%2FbtsGlRhPumS%2FGn3h2Neg9QxMcRxIStzMhk%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;960&quot; height=&quot;514&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;profix, name 길이 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712216404916&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// valid.c - xmlValidateElementContent()
#endif /* LIBXML_REGEXP_ENABLED */
    if ((warn) &amp;amp;&amp;amp; ((ret != 1) &amp;amp;&amp;amp; (ret != -3))) {
	if (ctxt != NULL) {
	    char expr[5000];
	    char list[5000];

	    expr[0] = 0;
	    xmlSnprintfElementContent(&amp;amp;expr[0], 5000, cont, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- python으로 길이를 확인해 보면 6001로, 앞서 xmlSnprintfElementContent()에서 expr, list의 크기가 5000이기 때문에 문제가 발생할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 그리고 이러한 취약점의 원인으로는 prefix, name을 xmlSnprintfElementContent()에서 크기를 검증하는 과정에 있다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CVE-2017-9047&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712216523705&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// valid.c - xmlSnprintfElementContent()
void
xmlSnprintfElementContent(char *buf, int size, xmlElementContentPtr content, int englob) {
    int len;

    if (content == NULL) return;
    len = strlen(buf);
    if (size - len &amp;lt; 50) {
	if ((size - len &amp;gt; 4) &amp;amp;&amp;amp; (buf[len - 1] != '.'))
	    strcat(buf, &quot; ...&quot;);
	return;
    }
    if (englob) strcat(buf, &quot;(&quot;);
    switch (content-&amp;gt;type) {
        case XML_ELEMENT_CONTENT_PCDATA:
            strcat(buf, &quot;#PCDATA&quot;);
	    break;	
	case XML_ELEMENT_CONTENT_ELEMENT:
	    if (content-&amp;gt;prefix != NULL) {
		if (size - len &amp;lt; xmlStrlen(content-&amp;gt;prefix) + 10) {
		    strcat(buf, &quot; ...&quot;);
		    return;
		}
		strcat(buf, (char *) content-&amp;gt;prefix);
		strcat(buf, &quot;:&quot;);
	    }
	    if (size - len &amp;lt; xmlStrlen(content-&amp;gt;name) + 10) {
		strcat(buf, &quot; ...&quot;);
		return;
	    }
	    if (content-&amp;gt;name != NULL)
		strcat(buf, (char *) content-&amp;gt;name);
	    break;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1712216553882&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * xmlStrlen:
 * @str:  the xmlChar * array
 *
 * length of a xmlChar's string
 *
 * Returns the number of xmlChar contained in the ARRAY.
 */

int
xmlStrlen(const xmlChar *str) {
    int len = 0;

    if (str == NULL) return(0);
    while (*str != 0) { /* non input consuming */
        str++;
        len++;
    }
    return(len);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 코드를 보면, xmlStrlen()은 단순히 문자열의 길이를 반환하는 함수임을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기서 size(5000)를 단순히 prefix와 name을 각각 분리해서 비교하고, 업데이트가 안된 len을 strlen(buf) 대신 비교함으로써 prefix와 name의 크기 조건문을 통과시키면 stack buffer overflow가 발생하게 된다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CVE-2017-9048&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712216607358&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// xmlSnprintfElementContent() 이어서
    if (englob)
        strcat(buf, &quot;)&quot;);
    switch (content-&amp;gt;ocur) {
        case XML_ELEMENT_CONTENT_ONCE:
	    break;
        case XML_ELEMENT_CONTENT_OPT:
	    strcat(buf, &quot;?&quot;);
	    break;
        case XML_ELEMENT_CONTENT_MULT:
	    strcat(buf, &quot;*&quot;);
	    break;
        case XML_ELEMENT_CONTENT_PLUS:
	    strcat(buf, &quot;+&quot;);
	    break;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 다음 코드는 CVE-2017-9047 이후에 바로 이어지는 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기서 buf에 최대 길이가 2인 문자가 들어갈 수 있기 때문에, 해당 코드에 도달하기 전에 미리 buf의 크기를 확인해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 만약 그렇지 않으면, 마찬가지로 overflow가 발생하게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 취약점 패치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CVE-2017-9047&lt;/span&gt;&lt;/p&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;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkSNCn/btsGkTAreEd/VRK3bFvkjKqHh32CzFkOK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkSNCn/btsGkTAreEd/VRK3bFvkjKqHh32CzFkOK0/img.png&quot; data-alt=&quot;CVE-2017-9047 패치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkSNCn/btsGkTAreEd/VRK3bFvkjKqHh32CzFkOK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkSNCn%2FbtsGkTAreEd%2FVRK3bFvkjKqHh32CzFkOK0%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;422&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CVE-2017-9047 패치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- prefix, name을 각자 비교하지 않고, 길이를 더해 한꺼번에 비교하도록 패치되었다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CVE-2017-9048&lt;/span&gt;&lt;/p&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;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwuEO2/btsGlzaDoiY/o4bcN1mgqchLXcsJbWWeu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwuEO2/btsGlzaDoiY/o4bcN1mgqchLXcsJbWWeu1/img.png&quot; data-alt=&quot;CVE-2017-9048 패치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwuEO2/btsGlzaDoiY/o4bcN1mgqchLXcsJbWWeu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwuEO2%2FbtsGlzaDoiY%2Fo4bcN1mgqchLXcsJbWWeu1%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;318&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CVE-2017-9048 패치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- overflow가 발생하는 로직 전에 buf의 크기가 3이상으로 충분한지 확인하도록 패치되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Fuzzing101</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/70</guid>
      <comments>https://leginwos.tistory.com/70#entry70comment</comments>
      <pubDate>Thu, 4 Apr 2024 16:46:57 +0900</pubDate>
    </item>
    <item>
      <title>4. Fuzzing 101 - Exercise 4</title>
      <link>https://leginwos.tistory.com/69</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 환경설정 및 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대상(LibTIFF)&amp;nbsp;다운로드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 디렉토리 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213143994&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME
mkdir fuzzing_tiff &amp;amp;&amp;amp; cd fuzzing_tiff/&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 다운로드 및 압축해제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213151643&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://download.osgeo.org/libtiff/tiff-4.0.6.tar.gz
tar -xzvf tiff-4.0.6.tar.gz&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여러가지 빌드 방법 (default, code coverage, ASAN) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 빌드 수정 시 사용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213201399&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm -r $HOME/fuzzing_tiff/install
cd $HOME/fuzzing_tiff/tiff-4.0.6/
make clean&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# LibTIFF 빌드 (default)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213208692&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd tiff-4.0.6/
./configure --prefix=&quot;$HOME/fuzzing_tiff/install/&quot; --disable-shared
make
make install&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;software matric 중 하나인 code coverage설정 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;lcov&amp;nbsp;설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213267907&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install lcov&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# libtiff 빌드 (--coverage flag 사용)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213287944&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CFLAGS=&quot;--coverage&quot; LDFLAGS=&quot;--coverage&quot; ./configure --prefix=&quot;$HOME/fuzzing_tiff/install/&quot; --disable-shared
make
make install&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# libtiff 빌드 (ASAN 사용)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213304402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export LLVM_CONFIG=&quot;llvm-config-11&quot;
CC=afl-clang-lto ./configure --prefix=&quot;$HOME/fuzzing_tiff/install/&quot; --disable-shared
AFL_USE_ASAN=1 make -j4
AFL_USE_ASAN=1 make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--prefix:&amp;nbsp;빌드&amp;nbsp;된&amp;nbsp;프로그램,&amp;nbsp;라이브러리가&amp;nbsp;설치될&amp;nbsp;경로를&amp;nbsp;설정한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--disable-shared:&amp;nbsp;공유&amp;nbsp;라이브러리를&amp;nbsp;사용하지&amp;nbsp;않는다.&amp;nbsp;(정적&amp;nbsp;라이브러리만&amp;nbsp;생성) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CFLAGS:&amp;nbsp;컴파일러에게&amp;nbsp;code&amp;nbsp;coverage를&amp;nbsp;수집하도록&amp;nbsp;flag를&amp;nbsp;전달한다 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LDFLAGS:&amp;nbsp;링커에게&amp;nbsp;code&amp;nbsp;coverage를&amp;nbsp;수집하도록&amp;nbsp;flag를&amp;nbsp;전달한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--coverage:&amp;nbsp;gcc,&amp;nbsp;clang이&amp;nbsp;code&amp;nbsp;coverage를&amp;nbsp;수집하도록&amp;nbsp;지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CC=afl-clang-lto:&amp;nbsp;컴파일러를&amp;nbsp;afl-clang-lto로&amp;nbsp;설정한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;AFL_USE_ASAN=1: AFL에서 ASAN을 사용하도록 지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-j4:&amp;nbsp;4개의&amp;nbsp;작업을&amp;nbsp;병렬로&amp;nbsp;빌드하도록&amp;nbsp;make에&amp;nbsp;지시한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;+) Code coverage 데이터 수집 예시&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213333141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 cd $HOME/fuzzing_tiff/tiff-4.0.6/
2 lcov --zerocounters --directory ./
3 lcov --capture --initial --directory ./ --output-file app.info
4 $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w $HOME/fuzzing_tiff/tiff-5: 4.0.6/test/images/palette-1c-1b.tiff
5 lcov --no-checksum --directory ./ --capture --output-file app2.info&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드&amp;nbsp;설명: &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 2: 현재 디렉토리 coverage counter 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 3: 초기 coverage 정보를 app.info에 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;4:&amp;nbsp;분석하려는&amp;nbsp;프로그램&amp;nbsp;이미지&amp;nbsp;실행 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;D:&amp;nbsp;디렉토리&amp;nbsp;정보 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;j:&amp;nbsp;JPEG&amp;nbsp;태그&amp;nbsp;정보&amp;nbsp;-&amp;nbsp;JPEG&amp;nbsp;이미지&amp;nbsp;설정,&amp;nbsp;품질,&amp;nbsp;색상&amp;nbsp;등 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;c: 컬러맵(이미지 색상정보를 저장하는 방식 중 하나) 정보&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;r: 래스터 데이터(이미지를 구성하는 데이터) 정보&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;s: 파일 및 스트립(strip) 정보&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;w:&amp;nbsp;파일&amp;nbsp;경로 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;5:&amp;nbsp;현재&amp;nbsp;coverage&amp;nbsp;상태를&amp;nbsp;app2.info에&amp;nbsp;저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Fuzzing 단계&lt;/span&gt;&lt;/h3&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;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MIQD4/btsGl3I0IAu/j0ZOwFwaIk3GDRewBKsibK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MIQD4/btsGl3I0IAu/j0ZOwFwaIk3GDRewBKsibK/img.png&quot; data-alt=&quot;tiff fuzzing 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MIQD4/btsGl3I0IAu/j0ZOwFwaIk3GDRewBKsibK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMIQD4%2FbtsGl3I0IAu%2Fj0ZOwFwaIk3GDRewBKsibK%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;635&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tiff fuzzing 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;afl-fuzz -m none -i $HOME/fuzzing_tiff/tiff-4.0.6/test/images/ -o $HOME/fuzzing_tiff/out/ -s 123 -- $HOME/fuzzing_tiff/install/bin/tiffinfo -D -j -c -r -s -w @@&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 결과 분석&lt;/span&gt;&lt;/h3&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;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SW2og/btsGmLOCY2E/tYkFw29qakYqDap6Y4oPzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SW2og/btsGmLOCY2E/tYkFw29qakYqDap6Y4oPzK/img.png&quot; data-alt=&quot;ASAN crash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SW2og/btsGmLOCY2E/tYkFw29qakYqDap6Y4oPzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSW2og%2FbtsGmLOCY2E%2FtYkFw29qakYqDap6Y4oPzK%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;361&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASAN crash&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;main :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213629476&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// tiffinfo.c - main()
		tif = TIFFOpen(argv[optind], chopstrips ? &quot;rC&quot; : &quot;rc&quot;);
		if (tif != NULL) {
			if (dirnum != -1) {
				if (TIFFSetDirectory(tif, (tdir_t) dirnum))
					tiffinfo(tif, order, flags, 1);
			} else if (diroff != 0) {
				if (TIFFSetSubDirectory(tif, diroff))
					tiffinfo(tif, order, flags, 1);
			} else {
do {
	toff_t offset=0;

	tiffinfo(tif, order, flags, 1);
	if (TIFFGetField(tif, TIFFTAG_EXIFIFD,
			 &amp;amp;offset)) {
		if (TIFFReadEXIFDirectory(tif, offset)) {
				tiffinfo(tif, order, flags, 0);
				}
			}
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- main()에서 인자로 TIFF 태그와 이 태그를 가져오는 IFD offset을 가지는데, 이 TIFFGetField() 함수는 TIFF 특정 태그의 ID를 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- TIFFTAG_EXIFIFD() 함수는 EXIF 정보가 있는 디렉토리를 가리키고, 해당 TIFF 태그의 파일이 포함하는 데이터들의 정보를 저장한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TIFFPrintDirectory :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213721467&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// tiffinfo.c - TIFFPrintDirectory()
static void
tiffinfo(TIFF* tif, uint16 order, long flags, int is_image)
{
	TIFFPrintDirectory(tif, stdout, flags);
	if (!readdata || !is_image)
		return;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;TIFFPrintField :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213866910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// tif_print.c - _TIFFPrintField()
if (!_TIFFPrettyPrintField(tif, fip, fd, tag, value_count, raw_data))
	_TIFFPrintField(fd, fip, value_count, raw_data);

if(mem_alloc)
	_TIFFfree(raw_data);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- TIFFPrintDirectory() 함수는 이름에서 유추할 수 있듯이 가져온 offset에 해당하는 디렉토리를 읽고 추가적인 정보를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- TIFFPrintField() 함수는 TIFFField 구조체에 대한 포인터와 값의 수, 데이터 포인터를 인자로 가지는데, fip를 통해 필드의 형식을 파악하고, raw_data를 해당 형식에 따라서 fd에 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712213888206&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// tif_print.c
else if(fip-&amp;gt;field_type == TIFF_ASCII) {
	fprintf(fd, &quot;%s&quot;, (char *) raw_data);
	break;
}

// tiff.h
typedef enum {
	TIFF_NOTYPE = 0,      /* placeholder */
	TIFF_BYTE = 1,        /* 8-bit unsigned integer */
	TIFF_ASCII = 2,       /* 8-bit bytes w/ last byte null */
	TIFF_SHORT = 3,       /* 16-bit unsigned integer */
	TIFF_LONG = 4,        /* 32-bit unsigned integer */&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기 TIFFPrintField() 함수에서 문제가 발생하는데, 해당 코드는 NULL byte가 나올 때까지 문자열을 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 마지막 byte가 NULL일 때까지 출력하기 때문에, 만약 데이터의 마지막 byte가 NULL이 아니게 되면, 의도하지 않은 부분을 출력할 수 있어 문제가 발생한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 취약점 패치&lt;/span&gt;&lt;/h3&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;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6dQNa/btsGmM06wyI/xxRzmIVsd9ufJgNiPk8NO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6dQNa/btsGmM06wyI/xxRzmIVsd9ufJgNiPk8NO0/img.png&quot; data-alt=&quot;취약점 패치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6dQNa/btsGmM06wyI/xxRzmIVsd9ufJgNiPk8NO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6dQNa%2FbtsGmM06wyI%2FxxRzmIVsd9ufJgNiPk8NO0%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;556&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;556&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- TIFF 파일을 읽을 때 ASCII이고 ASCII 타입의 필드 값을 다룰 때, 만약 마지막 byte가 NULL(&amp;lsquo;\0&amp;rsquo;)로 끝나지 않으면 경고 메시지와 함께 강제로 마지막 byte에 NULL(&amp;lsquo;\0&amp;rsquo;)을 삽입하도록 패치되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Fuzzing101</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/69</guid>
      <comments>https://leginwos.tistory.com/69#entry69comment</comments>
      <pubDate>Thu, 4 Apr 2024 16:00:25 +0900</pubDate>
    </item>
    <item>
      <title>3. Fuzzing 101 - Exercise 3</title>
      <link>https://leginwos.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 환경설정 및 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대상(tcpdump)&amp;nbsp;다운로드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 디렉토리 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210867946&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME
mkdir fuzzing_tcpdump &amp;amp;&amp;amp; cd fuzzing_tcpdump/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 다운도르 및 압축해제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210883397&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://github.com/the-tcpdump-group/tcpdump/archive/refs/tags/tcpdump-4.9.1.tar.gz
tar -xzvf tcpdump-4.9.1.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;tcpdump를&amp;nbsp;사용하기&amp;nbsp;위한&amp;nbsp;libpcap&amp;nbsp;라이브러리&amp;nbsp;다운로드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# 다운로드 및 압축해제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210893487&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://github.com/the-tcpdump-group/libpcap/archive/refs/tags/libpcap-1.8.0.tar.gz
tar -xzvf libpcap-1.8.0.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;# tcpdump가 로컬 경로를 원활하게 찾기 위해 libpcap 이름 변경&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210921177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mv libpcap-libpcap-1.8.0/ libpcap-1.8.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;libpcap,&amp;nbsp;tcpdump&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;설치&amp;nbsp;(+ASAN) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;tcpdump는&amp;nbsp;libpcap을&amp;nbsp;사용해&amp;nbsp;네트워크&amp;nbsp;패킷을&amp;nbsp;분석하므로&amp;nbsp;libpcap이&amp;nbsp;먼저&amp;nbsp;빌드된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;libpacp&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;설치&amp;nbsp;(+ASAN)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210967457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_tcpdump/libpcap-1.8.0/
export LLVM_CONFIG=&quot;llvm-config-11&quot;
CC=afl-clang-lto ./configure --enable-shared=no --prefix=&quot;$HOME/fuzzing_tcpdump/install/&quot;
AFL_USE_ASAN=1 make&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;#&amp;nbsp;tcpdump&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;설치&amp;nbsp;(+ASAN)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712210995114&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.1/
AFL_USE_ASAN=1 CC=afl-clang-lto ./configure --prefix=&quot;$HOME/fuzzing_tcpdump/install/&quot;
AFL_USE_ASAN=1 make
AFL_USE_ASAN=1 make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;Address&amp;nbsp;Sanitizer(ASAN)은&amp;nbsp;메모리&amp;nbsp;오류를&amp;nbsp;감지하는&amp;nbsp;오픈소스&amp;nbsp;도구로써,&amp;nbsp;version&amp;nbsp;3.1부터&amp;nbsp;LLVM&amp;nbsp;컴파일러에&amp;nbsp;통합되어&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;AFL_USE_ASAN=1을&amp;nbsp;앞에&amp;nbsp;붙임으로써&amp;nbsp;ASAN을&amp;nbsp;사용해&amp;nbsp;AFL++을&amp;nbsp;빌드할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Fuzzing 단계&lt;/span&gt;&lt;/h3&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;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4AK3G/btsGnvLwAQC/czRqUsu6iR7k0v3XJOmr3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4AK3G/btsGnvLwAQC/czRqUsu6iR7k0v3XJOmr3k/img.png&quot; data-alt=&quot;tcpdump fuzzing 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4AK3G/btsGnvLwAQC/czRqUsu6iR7k0v3XJOmr3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4AK3G%2FbtsGnvLwAQC%2FczRqUsu6iR7k0v3XJOmr3k%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;642&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tcpdump fuzzing 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;leginwos@leginwos:~/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2$ afl-fuzz -m none -i $HOME/fuzzing_tcpdump/tcpdump-tcpdump-4.9.2/tests/ -o $HOME/fuzzing_tcpdump/out/ -s 123 -- $HOME/fuzzing_tcpdump/install/sbin/tcpdump -vvvvXX -ee -nn -r @@&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 결과 분석&lt;/span&gt;&lt;/h3&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;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biu0RD/btsGnuMCUl9/cR4pd9aA4doYNl6IsNPjP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biu0RD/btsGnuMCUl9/cR4pd9aA4doYNl6IsNPjP1/img.png&quot; data-alt=&quot;ASAN을 사용한 crash&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biu0RD/btsGnuMCUl9/cR4pd9aA4doYNl6IsNPjP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiu0RD%2FbtsGnuMCUl9%2FcR4pd9aA4doYNl6IsNPjP1%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;374&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ASAN을 사용한 crash&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;bootp_print에서&amp;nbsp;호출하는&amp;nbsp;EXTRACT_32BITS에서&amp;nbsp;heap&amp;nbsp;buffer&amp;nbsp;overflow가&amp;nbsp;발생했다.&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;454&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DpPSb/btsGnA65pVs/cz2LWFzazDqfUoMYkQinF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DpPSb/btsGnA65pVs/cz2LWFzazDqfUoMYkQinF1/img.png&quot; data-alt=&quot;bootp 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DpPSb/btsGnA65pVs/cz2LWFzazDqfUoMYkQinF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpPSb%2FbtsGnA65pVs%2Fcz2LWFzazDqfUoMYkQinF1%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;454&quot; height=&quot;520&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bootp 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712211217784&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# bootp_print.c
ND_PRINT((ndo, &quot;, Flags [%s]&quot;,
	bittok2str(bootp_flag_values, &quot;none&quot;, EXTRACT_16BITS(&amp;amp;bp-&amp;gt;bp_flags))));

# bootp_flag_values
static const struct tok bootp_flag_values[] = {
	{ 0x8000,	&quot;Broadcast&quot; },
	{ 0, NULL}
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ASAN으로 확인한 bootp_print.c를 자세히 보면, bootp_flag_values함수와 EXTRACT_16BITS 함수가 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기서 EXTRACT_16BITS 함수는 이름 그대로 16비트만큼 추출하는 함수로 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ND_PRINT는 출력하는 함수이고, bittok2str은 bit tocken을 문자로 바꾸는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- bootp_flag_values 함수는 flag값이 0x8000이면 Broadcast를, 0이면 아무것도 출력하지 않는다.&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;607&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbpwP7/btsGkVLEGon/YThO6TuFm5SpaCExOXgz3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbpwP7/btsGkVLEGon/YThO6TuFm5SpaCExOXgz3k/img.png&quot; data-alt=&quot;ndo 구조체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbpwP7/btsGkVLEGon/YThO6TuFm5SpaCExOXgz3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbpwP7%2FbtsGkVLEGon%2FYThO6TuFm5SpaCExOXgz3k%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;607&quot; height=&quot;796&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ndo 구조체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ndo 구조체는 tcpdump의 packet에 있는 여러가지 값들을 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 여기서 ndo_snapend는 이름 그대로 ndo 구조체의 snapshot의 끝주소를 가지고, 이 ndo_snapend는 아래와 같이 계산된다.&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;322&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sKYtv/btsGkR3w7FX/MozeufDwpPcKhYUK9r3pc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sKYtv/btsGkR3w7FX/MozeufDwpPcKhYUK9r3pc1/img.png&quot; data-alt=&quot;gdb로 caplen 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sKYtv/btsGkR3w7FX/MozeufDwpPcKhYUK9r3pc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsKYtv%2FbtsGkR3w7FX%2FMozeufDwpPcKhYUK9r3pc1%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;322&quot; height=&quot;325&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gdb로 caplen 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCILhJ/btsGl1K9T7E/9hpbPoJlZl5RxAbUSXc8C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCILhJ/btsGl1K9T7E/9hpbPoJlZl5RxAbUSXc8C0/img.png&quot; data-alt=&quot;wireshark를 사용한 caplan 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCILhJ/btsGl1K9T7E/9hpbPoJlZl5RxAbUSXc8C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCILhJ%2FbtsGl1K9T7E%2F9hpbPoJlZl5RxAbUSXc8C0%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;528&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;wireshark를 사용한 caplan 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712211415403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# print.c
ndo-&amp;gt;ndo_snapend = sp + h-&amp;gt;caplen;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- gdb을 사용해서&amp;nbsp;caplen을 확인하면&amp;nbsp;0x35이고, wireshark에서는 0x53으로 gdb에서의&amp;nbsp;caplen이 더 작은 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 그렇기 때문에, 데이터의 길이를 확인하지 않으면, out-of-bounds가 일어나 heap buffer overflow가 발생할 수 있게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 취약점 패치&lt;/span&gt;&lt;/h3&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;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBIdp0/btsGkr44UFY/51rzWvdEuy4eQ9KzxBt5Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBIdp0/btsGkr44UFY/51rzWvdEuy4eQ9KzxBt5Ok/img.png&quot; data-alt=&quot;취약점 패치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBIdp0/btsGkr44UFY/51rzWvdEuy4eQ9KzxBt5Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBIdp0%2FbtsGkr44UFY%2F51rzWvdEuy4eQ9KzxBt5Ok%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;351&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;351&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ND_TCHECK :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712211511948&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Bail if &quot;var&quot; was not captured */
#define ND_TCHECK(var) ND_TCHECK2(var, sizeof(var))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ND_TCHECK2 :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712211522668&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Bail if &quot;l&quot; bytes of &quot;var&quot; were not captured */
#define ND_TCHECK2(var, l) if (!ND_TTEST2(var, l)) goto trunc
trunc:
	ND_PRINT((ndo, &quot;%s&quot;, tstr));
	return -1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ND_TTEST2 :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712211543451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define ND_TTEST2(var, l) \
  (IS_NOT_NEGATIVE(l) &amp;amp;&amp;amp; \
	((uintptr_t)ndo-&amp;gt;ndo_snapend - (l) &amp;lt;= (uintptr_t)ndo-&amp;gt;ndo_snapend &amp;amp;&amp;amp; \
         (uintptr_t)&amp;amp;(var) &amp;lt;= (uintptr_t)ndo-&amp;gt;ndo_snapend - (l)))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ND_TCHECK 매크로를 사용해서 변수가 캡쳐되었는지 확인하고, 만약 아니라면 ND_TCHECK2 매크로를 호출한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ND_TCHECK2 매크로는 변수의 1byte가 캡쳐되었는지 확인하고, 만약 아니라면 goto trunc로 오류 메세지를 호출하고 -1을 반환해 프로그램을 종료한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- ND_TTEST2 매크로는 데이터의 캡쳐 여부를 ndo_snapend로 확인해 해당 데이터의 주소가 유효한 범위 안에 있는지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Fuzzing101</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/68</guid>
      <comments>https://leginwos.tistory.com/68#entry68comment</comments>
      <pubDate>Thu, 4 Apr 2024 15:27:31 +0900</pubDate>
    </item>
    <item>
      <title>2. Fuzzing 101 - Exercise 2</title>
      <link>https://leginwos.tistory.com/67</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 환경설정 및 설치&lt;/span&gt;&lt;/h3&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디렉토리 생성 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132178111&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME
mkdir fuzzing_libexif &amp;amp;&amp;amp; cd fuzzing_libexif/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;libexif 0.6.14 다운로드, 압축 해제 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132186171&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://github.com/libexif/libexif/archive/refs/tags/libexif-0_6_14-release.tar.gz
tar -xzvf libexif-0_6_14-release.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드 및 설치 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132199537&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd libexif-libexif-0_6_14-release/
sudo apt-get install autopoint libtool gettext libpopt-dev
autoreconf -fvi
./configure --enable-shared=no --prefix=&quot;$HOME/fuzzing_libexif/install/&quot;
make

make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;autoreconf &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;f:&amp;nbsp;이전의&amp;nbsp;파일을&amp;nbsp;지우고&amp;nbsp;새로&amp;nbsp;만든다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;v:&amp;nbsp;과정을&amp;nbsp;자세하게&amp;nbsp;보여준다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;i:&amp;nbsp;원래&amp;nbsp;없던&amp;nbsp;필요한&amp;nbsp;파일도&amp;nbsp;설치한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--enable-shared=no:&amp;nbsp;공유&amp;nbsp;라이브러리를&amp;nbsp;빌드하지&amp;nbsp;않도록&amp;nbsp;지시한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;--prefix=&quot;$HOME/fuzzing_libexif/install/&quot;는&amp;nbsp;설치될&amp;nbsp;경로를&amp;nbsp;지정한다. &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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Interface&amp;nbsp;application&amp;nbsp;설치 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;libexif는&amp;nbsp;라이브러리이므로&amp;nbsp;이를&amp;nbsp;실행하는&amp;nbsp;Interface&amp;nbsp;application이&amp;nbsp;필요한데,&amp;nbsp;여기서는&amp;nbsp;exif&amp;nbsp;command-line을&amp;nbsp;사용했다. &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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;exif 다운로드 및 압축해제&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132360128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_libexif
wget https://github.com/libexif/exif/archive/refs/tags/exif-0_6_15-release.tar.gz
tar -xzvf exif-0_6_15-release.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드 및 설치 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132392124&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd exif-exif-0_6_15-release/
autoreconf -fvi
./configure --enable-shared=no --prefix=&quot;$HOME/fuzzing_libexif/install/&quot; PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;필요한&amp;nbsp;라이브러리의&amp;nbsp;위치를&amp;nbsp;지정한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Corpus&amp;nbsp;생성 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;corpus는&amp;nbsp;Fuzzing시에&amp;nbsp;사용되는&amp;nbsp;데이터&amp;nbsp;셋을&amp;nbsp;의미하고,&amp;nbsp;여기서는&amp;nbsp;exif&amp;nbsp;이미지&amp;nbsp;샘플을&amp;nbsp;사용했다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132628010&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_libexif
wget https://github.com/ianare/exif-samples/archive/refs/heads/master.zip
unzip master.zip&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;afl-clang-lto를&amp;nbsp;사용한&amp;nbsp;libexif&amp;nbsp;빌드 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;lto는&amp;nbsp;Link&amp;nbsp;Time&amp;nbsp;Optimization의&amp;nbsp;약자로써,&amp;nbsp;link&amp;nbsp;time에&amp;nbsp;최적화를&amp;nbsp;진행한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;AFL++은&amp;nbsp;컴파일&amp;nbsp;과정에서&amp;nbsp;block의&amp;nbsp;id를&amp;nbsp;랜덤으로&amp;nbsp;설정하는데,&amp;nbsp;이는&amp;nbsp;복잡할수록&amp;nbsp;edge에서&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;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;그렇기&amp;nbsp;때문에&amp;nbsp;컴파일&amp;nbsp;과정에서&amp;nbsp;link&amp;nbsp;time에&amp;nbsp;instrumentation&amp;nbsp;code를&amp;nbsp;삽입하고,&amp;nbsp;이러한&amp;nbsp;삽입&amp;nbsp;시에&amp;nbsp;위해&amp;nbsp;lto를&amp;nbsp;사용하고,&amp;nbsp;원래의&amp;nbsp;시스템&amp;nbsp;linker를사용하는&amp;nbsp;것이&amp;nbsp;아닌&amp;nbsp;afl-ld를&amp;nbsp;사용한다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;이러한&amp;nbsp;lto는&amp;nbsp;code&amp;nbsp;coverage에서&amp;nbsp;충돌이&amp;nbsp;발생하지&amp;nbsp;않음으로써&amp;nbsp;속도는&amp;nbsp;증가하지만&amp;nbsp;컴파일&amp;nbsp;시간이&amp;nbsp;더&amp;nbsp;길어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;libexif 빌드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132670130&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rm -r $HOME/fuzzing_libexif/install
cd $HOME/fuzzing_libexif/libexif-libexif-0_6_14-release/
make clean
export LLVM_CONFIG=&quot;llvm-config-11&quot;
CC=afl-clang-lto ./configure --enable-shared=no --prefix=&quot;$HOME/fuzzing_libexif/install/&quot;
make
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;exif 빌드 &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712132690383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_libexif/exif-exif-0_6_15-release
make clean
export LLVM_CONFIG=&quot;llvm-config-11&quot;
CC=afl-clang-lto ./configure --enable-shared=no --prefix=&quot;$HOME/fuzzing_libexif/install/&quot; PKG_CONFIG_PATH=$HOME/fuzzing_libexif/install/lib/pkgconfig
make
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;export&amp;nbsp;LLVM_CONFIG=&quot;llvm-config-11&quot;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;LLVM_CONFIG'이라는&amp;nbsp;환경&amp;nbsp;변수에&amp;nbsp;&quot;llvm-config-11&quot;을&amp;nbsp;추가함으로써&amp;nbsp;llvm-config-11을&amp;nbsp;사용한다. &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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CC=afl-clang-lto &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;C&amp;nbsp;언어&amp;nbsp;컴파일러로&amp;nbsp;'afl-clang-lto'를&amp;nbsp;사용하겠다는&amp;nbsp;것을&amp;nbsp;의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Fuzzing 단계&lt;/span&gt;&lt;/h3&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;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ywmar/btsGjPj6mDn/jbYP7iu2ivuuMezZtCl5DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ywmar/btsGjPj6mDn/jbYP7iu2ivuuMezZtCl5DK/img.png&quot; data-alt=&quot;libexif Fuzzing 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ywmar/btsGjPj6mDn/jbYP7iu2ivuuMezZtCl5DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fywmar%2FbtsGjPj6mDn%2FjbYP7iu2ivuuMezZtCl5DK%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;649&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;649&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;libexif Fuzzing 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;afl-fuzz -i $HOME/fuzzing_libexif/exif-samples-master/jpg/ -o $HOME/fuzzing_libexif/out/ -s 123 -- $HOME/fuzzing_libexif/install/bin/exif @@&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. CVE-2012-2836&lt;/span&gt;&lt;/h3&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;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blm99u/btsGiYhyCeW/KfBoD4XOnZpTTMb8AJ324K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blm99u/btsGiYhyCeW/KfBoD4XOnZpTTMb8AJ324K/img.png&quot; data-alt=&quot;crash 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blm99u/btsGiYhyCeW/KfBoD4XOnZpTTMb8AJ324K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblm99u%2FbtsGiYhyCeW%2FKfBoD4XOnZpTTMb8AJ324K%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;324&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;crash 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ditxXi/btsGj1R9Dm8/1DXM2kQarbiY5B9c7zuLbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ditxXi/btsGj1R9Dm8/1DXM2kQarbiY5B9c7zuLbK/img.png&quot; data-alt=&quot;call stack(bt) 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ditxXi/btsGj1R9Dm8/1DXM2kQarbiY5B9c7zuLbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FditxXi%2FbtsGj1R9Dm8%2F1DXM2kQarbiY5B9c7zuLbK%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;473&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;call stack(bt) 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- exif_get_sshort에서 Segmentation fault가 발생했다.&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;592&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cluusu/btsGjX93GqW/Iv3WVw9bOTXWS0YKVSKZp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cluusu/btsGjX93GqW/Iv3WVw9bOTXWS0YKVSKZp1/img.png&quot; data-alt=&quot;TIFF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cluusu/btsGjX93GqW/Iv3WVw9bOTXWS0YKVSKZp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcluusu%2FbtsGjX93GqW%2FIv3WVw9bOTXWS0YKVSKZp1%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;592&quot; height=&quot;610&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TIFF&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1i8Ta/btsGi1k4Rti/LOBhpbHk0fMR8qxRgJKfh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1i8Ta/btsGi1k4Rti/LOBhpbHk0fMR8qxRgJKfh0/img.png&quot; data-alt=&quot;EXIF 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1i8Ta/btsGi1k4Rti/LOBhpbHk0fMR8qxRgJKfh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1i8Ta%2FbtsGi1k4Rti%2FLOBhpbHk0fMR8qxRgJKfh0%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;609&quot; height=&quot;659&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;EXIF 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- TIFF에서 처음 offset은 TIFF header의 0번째 IFD를 시작으로 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- EXIF 구조에서 IFD 1은 IFD 0의 offset을 통해 구할 수 있음을 알 수 있다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 분석&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;main :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712134467102&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// main.c
	if (args) {
		while (*args) {
			ExifLoader *l;

			/*
			 * Try to read EXIF data from the file. 
			 * If there is no EXIF data, exit.
			 */
			l = exif_loader_new ();
			exif_loader_log (l, log);
			exif_loader_write_file (l, *args);
			ed = exif_loader_get_data (l);
			exif_loader_unref (l);&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; exif_loader_get_data :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712134477812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ExifData *
exif_loader_get_data (ExifLoader *loader)
{
	ExifData *ed;

	if (!loader) 
		return NULL;

	ed = exif_data_new_mem (loader-&amp;gt;mem);
	exif_data_log (ed, loader-&amp;gt;log);
	exif_data_load_data (ed, loader-&amp;gt;buf, loader-&amp;gt;bytes_read);

	return ed;
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &amp;nbsp;exif_data_load_data :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712134492243&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	/* IFD 0 offset */
	offset = exif_get_long (d + 10, data-&amp;gt;priv-&amp;gt;order);
	exif_log (data-&amp;gt;priv-&amp;gt;log, EXIF_LOG_CODE_DEBUG, &quot;ExifData&quot;, 
		  &quot;IFD 0 at %i.&quot;, (int) offset);

	/* Parse the actual exif data (usually offset 14 from start) */
	exif_data_load_data_content (data, EXIF_IFD_0, d + 6, ds - 6, offset, 0);

	/* IFD 1 offset */
	if (offset + 6 + 2 &amp;gt; ds) {
		return;
	}
	n = exif_get_short (d + 6 + offset, data-&amp;gt;priv-&amp;gt;order);
	if (offset + 6 + 2 + 12 * n + 4 &amp;gt; ds) {
		return;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;main에서&amp;nbsp;exif_loader_get_data를&amp;nbsp;호출하고,&amp;nbsp;exif_loader_get_data는&amp;nbsp;exif_data_load_data를&amp;nbsp;호출하는데&amp;nbsp;여기서&amp;nbsp;문제가&amp;nbsp;발생한다. &lt;br /&gt;- 자세히 말하면 IFD 0의 offset을 구하는 과정에서 문제가 발생하는데, offset이 uint32_t이고, ds가 uint32_t이므로 4294967925 + 8 = 0이 되고, 이러면 원래 offset + 6 +2 &amp;gt; ds 조건이 0인 상황에서 조건문이 참이 되어 return되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 하지만, overflow로 인한 0 으로 인해 조건을 만족하지 않게 되면서 해당 조건문은 거짓이 되고, 결국 잘못된 값이 통과되어 문제가 발생하게 된다. &lt;br /&gt;-&amp;nbsp;IFD&amp;nbsp;0의&amp;nbsp;offset이&amp;nbsp;0xfffffff8이상이면&amp;nbsp;unsigned&amp;nbsp;data&amp;nbsp;overflow가&amp;nbsp;발생한다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;exif_get_short :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712134798088&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ExifShort
exif_get_short (const unsigned char *buf, ExifByteOrder order)
{
	return (exif_get_sshort (buf, order) &amp;amp; 0xffff);
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;exif_get_sshort :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712134826901&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ExifSShort
exif_get_sshort (const unsigned char *buf, ExifByteOrder order)
{
	if (!buf) return 0;
        switch (order) {
        case EXIF_BYTE_ORDER_MOTOROLA:
                return ((buf[0] &amp;lt;&amp;lt; 8) | buf[1]);
        case EXIF_BYTE_ORDER_INTEL:
                return ((buf[1] &amp;lt;&amp;lt; 8) | buf[0]);
        }

	/* Won't be reached */
	return (0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;IFD&amp;nbsp;0의&amp;nbsp;offset이&amp;nbsp;0xfffffff8이상이면&amp;nbsp;unsigned&amp;nbsp;data&amp;nbsp;overflow가&amp;nbsp;발생하는&amp;nbsp;이유는&amp;nbsp;위&amp;nbsp;코드를&amp;nbsp;통해&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;-&amp;nbsp;exif_get_short에서&amp;nbsp;해당&amp;nbsp;데이터를&amp;nbsp;하위&amp;nbsp;2바이트로&amp;nbsp;변환하는데,&amp;nbsp;만약&amp;nbsp;이&amp;nbsp;함수에서&amp;nbsp;Offset&amp;nbsp;값이&amp;nbsp;0xfffffff8&amp;nbsp;이상인&amp;nbsp;경우,&amp;nbsp;이&amp;nbsp;값은&amp;nbsp;부호&amp;nbsp;있는&amp;nbsp;2바이트&amp;nbsp;데이터로&amp;nbsp;표현될&amp;nbsp;때&amp;nbsp;음수의&amp;nbsp;범위에&amp;nbsp;들어갈&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;된다. &lt;br /&gt;-&amp;nbsp;그렇게&amp;nbsp;음수가&amp;nbsp;되면,&amp;nbsp;원래&amp;nbsp;의도하지&amp;nbsp;않은&amp;nbsp;영역에&amp;nbsp;shift&amp;nbsp;연산을&amp;nbsp;함으로써&amp;nbsp;Segmentation&amp;nbsp;fault가&amp;nbsp;발생하게&amp;nbsp;된다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. CVE-2009-3895&lt;/span&gt;&lt;/h3&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;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UGJDZ/btsGjLvlLDl/jm3eb2B5QYxhcpzKtkiE31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UGJDZ/btsGjLvlLDl/jm3eb2B5QYxhcpzKtkiE31/img.png&quot; data-alt=&quot;crash 실행 -&amp;amp;gt; Segmentation fault&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UGJDZ/btsGjLvlLDl/jm3eb2B5QYxhcpzKtkiE31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUGJDZ%2FbtsGjLvlLDl%2Fjm3eb2B5QYxhcpzKtkiE31%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;443&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;crash 실행 -&amp;gt; Segmentation fault&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csZpSM/btsGlZy5OfC/EF2YDgWgkkkjQm0DiKk3Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csZpSM/btsGlZy5OfC/EF2YDgWgkkkjQm0DiKk3Zk/img.png&quot; data-alt=&quot;call stack(bt)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csZpSM/btsGlZy5OfC/EF2YDgWgkkkjQm0DiKk3Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsZpSM%2FbtsGlZy5OfC%2FEF2YDgWgkkkjQm0DiKk3Zk%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;1029&quot; height=&quot;694&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;call stack(bt)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLSwbP/btsGlxQmHDY/tQGosXKfN6XJ5Ie1hikl51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLSwbP/btsGlxQmHDY/tQGosXKfN6XJ5Ie1hikl51/img.png&quot; data-alt=&quot;vmmap&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLSwbP/btsGlxQmHDY/tQGosXKfN6XJ5Ie1hikl51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLSwbP%2FbtsGlxQmHDY%2FtQGosXKfN6XJ5Ie1hikl51%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;1578&quot; height=&quot;427&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vmmap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- vmmap을 통해 buf(0x461000)가 heap영역을 벗어나 Heap buffer overflow가 일어났음을 확인할 수 있다.&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;878&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4x0F9/btsGjFvjLfn/fwaCvqxvgDiV7bBLYbxhkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4x0F9/btsGjFvjLfn/fwaCvqxvgDiV7bBLYbxhkK/img.png&quot; data-alt=&quot;libexif 문서의 exif_get_short 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4x0F9/btsGjFvjLfn/fwaCvqxvgDiV7bBLYbxhkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4x0F9%2FbtsGjFvjLfn%2FfwaCvqxvgDiV7bBLYbxhkK%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;878&quot; height=&quot;653&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;libexif 문서의 exif_get_short 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- Parameters부분에서 b, order, value가 각각 어떤 값인지 나와있어서 이를 참고해서 코드 분석을 진행했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드 분석&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;exif_get_short :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712135865919&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	case EXIF_TAG_SHARPNESS:
		switch (e-&amp;gt;format) {
		case EXIF_FORMAT_LONG:
			if (!e-&amp;gt;parent || !e-&amp;gt;parent-&amp;gt;parent) break;
			o = exif_data_get_byte_order (e-&amp;gt;parent-&amp;gt;parent);
			for (i = 0; i &amp;lt; e-&amp;gt;components; i++)
				exif_set_short (
					e-&amp;gt;data + i *
					exif_format_get_size (
					EXIF_FORMAT_SHORT), o,
					(ExifShort) exif_get_long (
					e-&amp;gt;data + i *
					exif_format_get_size (
					EXIF_FORMAT_LONG), o));
			e-&amp;gt;format = EXIF_FORMAT_SHORT;
			e-&amp;gt;size = e-&amp;gt;components *
				exif_format_get_size (e-&amp;gt;format);
			e-&amp;gt;data = exif_entry_realloc (e, e-&amp;gt;data, e-&amp;gt;size);
			exif_entry_log (e, EXIF_LOG_CODE_DEBUG,&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 인자로 b에 해당하는 data의 위치에 short형의 크기를 기준으로 인자를 전달하기 때문에 문제가 발생하게 된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 정상이었다면 byte가 곱해져야 하지만, 위의 부분에서 short를 곱하게 되면서 자연스럽게 본래 의도하지 않았던 chunk 또는 영역을 참조하게 된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;이러한&amp;nbsp;이유들로&amp;nbsp;결국&amp;nbsp;realloc에서&amp;nbsp;Segmentation&amp;nbsp;fault가&amp;nbsp;발생하게&amp;nbsp;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. 취약점 패치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CVE-2012-2836 :&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;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biygRC/btsGlfvuj1e/RSiwWOa83CZwKtyiDiPZwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biygRC/btsGlfvuj1e/RSiwWOa83CZwKtyiDiPZwK/img.png&quot; data-alt=&quot;CVE-2012-2836 (1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biygRC/btsGlfvuj1e/RSiwWOa83CZwKtyiDiPZwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiygRC%2FbtsGlfvuj1e%2FRSiwWOa83CZwKtyiDiPZwK%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;434&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CVE-2012-2836 (1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;단순히&amp;nbsp;offset+8을&amp;nbsp;비교하는&amp;nbsp;것이&amp;nbsp;아닌,&amp;nbsp;추가로&amp;nbsp;offset와&amp;nbsp;ds를&amp;nbsp;비교함으로써&amp;nbsp;offset&amp;nbsp;자체의&amp;nbsp;값이&amp;nbsp;크면&amp;nbsp;바로&amp;nbsp;return되도록&amp;nbsp;패치되었다.&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;988&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHLKbK/btsGkU59C0o/MOaFNsYKOwtmB9mYZP7KDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHLKbK/btsGkU59C0o/MOaFNsYKOwtmB9mYZP7KDK/img.png&quot; data-alt=&quot;CVE-2012-2836 (2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHLKbK/btsGkU59C0o/MOaFNsYKOwtmB9mYZP7KDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHLKbK%2FbtsGkU59C0o%2FMOaFNsYKOwtmB9mYZP7KDK%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;662&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CVE-2012-2836 (2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- JPEG APP1 section이 64KiB를 넘을 수 없게, 데이터 크기에 제한을 두도록 패치했다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CVE-2009-3895 :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712136690442&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;o = exif_data_get_byte_order(e- &amp;gt; parent- &amp;gt; parent);
newsize = e-&amp;gt;components * exif_format_get_size(EXIF_FORMAT_SHORT);
newdata = exif_entry_alloc(e, newsize);
if(!newdata) {
    exif_entry_log(e, EXIF_LOG_CODE_NO_MEMORY, &quot;Could not allocate %lu byte(s).&quot;, (unsigned long)newsize);
    break;
}

for (i = 0; i &amp;lt; e-&amp;gt;components; i++)
	exif_set_short (
		newdata + i *
		exif_format_get_size (
		 EXIF_FORMAT_SHORT), o,
		 exif_get_short_convert (
		  e-&amp;gt;data + i *
		  exif_format_get_size (e-&amp;gt;format),
		  e-&amp;gt;format, o));
          
exif_mem_free (e-&amp;gt;priv-&amp;gt;mem, e-&amp;gt;data);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;-&amp;nbsp;realloc을&amp;nbsp;사용하지&amp;nbsp;않고,&amp;nbsp;미리&amp;nbsp;size를&amp;nbsp;short로&amp;nbsp;바꾼&amp;nbsp;다음에&amp;nbsp;참조하도록&amp;nbsp;패치했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Fuzzing101</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/67</guid>
      <comments>https://leginwos.tistory.com/67#entry67comment</comments>
      <pubDate>Wed, 3 Apr 2024 18:34:49 +0900</pubDate>
    </item>
    <item>
      <title>1. Fuzzing 101 - Exercise 1</title>
      <link>https://leginwos.tistory.com/66</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 환경설정 및 설치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디렉토리 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712106164296&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME
mkdir fuzzing_xpdf &amp;amp;&amp;amp; cd fuzzing_xpdf/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;build 도구 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712106271056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install build-essential&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;xpdf 다운로드 및 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712106302545&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz
cd xpdf-3.02
sudo apt update &amp;amp;&amp;amp; sudo apt install -y build-essential gcc
./configure --prefix=&quot;$HOME/fuzzing_xpdf/install/&quot;
make
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;pdf 예제 다운로드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712106346390&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd $HOME/fuzzing_xpdf
mkdir pdf_examples &amp;amp;&amp;amp; cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;afl-clang-fast 컴파일러를 사용한 xpdf 빌드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712106354620&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export LLVM_CONFIG=&quot;llvm-config-11&quot;
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix=&quot;$HOME/fuzzing_xpdf/install/&quot;
make
make install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. Fuzzing 단계&lt;/span&gt;&lt;/h3&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;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dy0rDf/btsGkqKawPH/CKsVDgoPooVPjSLK19yi4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dy0rDf/btsGkqKawPH/CKsVDgoPooVPjSLK19yi4K/img.png&quot; data-alt=&quot;xpdf Fuzzing 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dy0rDf/btsGkqKawPH/CKsVDgoPooVPjSLK19yi4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdy0rDf%2FbtsGkqKawPH%2FCKsVDgoPooVPjSLK19yi4K%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;646&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;xpdf Fuzzing 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1712106620658&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 위 bash명령어를 사용해 AFL Fuzzer를 실행시켰고, 약 40분 뒤에 unique crash가 발생함을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 결과 분석 (gdb)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 앞서 찾은 unique crash를 분석하기 위해서 gdb의 인자로 xpdf가 위치한 경로와 Fuzzing의 결과물인 crash 파일의 경로로 설정한다. &amp;nbsp;$HOME/fuzzing_xpdf/out/ 디렉토리 내의 해당 crash를 넘겨준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1712107046021&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gdb--args ~/fuzzing_xpdf/install/bin/pdftotext ./id:000000,sig:11,src:000002,time:2353550,op:flip4,pos:799&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mmibw/btsGjKvGn1Y/jjMmBBD5iHoRa5OAkC9JQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mmibw/btsGjKvGn1Y/jjMmBBD5iHoRa5OAkC9JQ0/img.png&quot; data-alt=&quot;gdb를 사용한 crash 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mmibw/btsGjKvGn1Y/jjMmBBD5iHoRa5OAkC9JQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmmibw%2FbtsGjKvGn1Y%2FjjMmBBD5iHoRa5OAkC9JQ0%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;814&quot; height=&quot;809&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gdb를 사용한 crash 분석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- getObj 함수가 재귀적으로 계속 호출되어, 결국 Segmentation fault (SIGSEGV)가 발생했음을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 취약점 분석 및 패치&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Parser::getObj :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115251014&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// stream objects are not allowed inside content streams or
    // object streams
    if (allowStreams &amp;amp;&amp;amp; buf2.isCmd(&quot;stream&quot;)) {
      if ((str = makeStream(obj, fileKey, encAlgorithm, keyLength,
			    objNum, objGen))) {
	obj-&amp;gt;initStream(str);
      } else {&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Parser::makeStream :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115391551&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // get length
  dict-&amp;gt;dictLookup(&quot;Length&quot;, &amp;amp;obj);
  if (obj.isInt()) {
    length = (Guint)obj.getInt();
    obj.free();
} else {&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Object::dictLookup :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115412186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inline Object *Object::dictLookup(char *key, Object *obj)
{ return dict-&amp;gt;lookup(key, obj); }&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Dict::lookup :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115420570&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Object *Dict::lookup(char *key, Object *obj) {
  DictEntry *e;
  return (e = find(key)) ? e-&amp;gt;val.fetch(xref, obj) : obj-&amp;gt;initNull();
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Object::fetch :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115678845&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Object *Object::fetch(XRef *xref, Object *obj) {
  return (type == objRef &amp;amp;&amp;amp; xref) ?
         xref-&amp;gt;fetch(ref.num, ref.gen, obj) : copy(obj);
}&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; XRef::fetch :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115687034&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete parser;
      goto err;
    }
    parser-&amp;gt;getObj(obj, encrypted ? fileKey : (Guchar *)NULL,
		   encAlgorithm, keyLength, num, gen);
    obj1.free();
    obj2.free();
    obj3.free();&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 위의 코드들에서 볼 수 있듯이, &lt;span style=&quot;text-align: start;&quot;&gt;Parser::getObj -&amp;gt; Parser::makeStream -&amp;gt; Object::dictLookup -&amp;gt; Dict::lookup -&amp;gt; Object::fetch -&amp;gt; XRef::fetch -&amp;gt; Parser::getObj의 순서대로 실행흐름이 재귀된다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;취약점 패치 :&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712115866837&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (!simpleOnly &amp;amp;&amp;amp; recursion &amp;lt; recursionLimit &amp;amp;&amp;amp; buf1.isCmd(&quot;[&quot;)) {
    shift();
    obj-&amp;gt;initArray(xref);
    while (!buf1.isCmd(&quot;]&quot;) &amp;amp;&amp;amp; !buf1.isEOF())
      obj-&amp;gt;arrayAdd(getObj(&amp;amp;obj2, gFalse, fileKey, encAlgorithm, keyLength,
			   objNum, objGen, recursion + 1));
    if (buf1.isEOF())
      error(errSyntaxError, getPos(), &quot;End of file inside array&quot;);
    shift();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 조건문을 사용해서 recursion, recursionLimit 변수를 추가해 재귀를 판단하고 처리하도록 패치했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Fuzzing101</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/66</guid>
      <comments>https://leginwos.tistory.com/66#entry66comment</comments>
      <pubDate>Wed, 3 Apr 2024 13:00:40 +0900</pubDate>
    </item>
    <item>
      <title>[Hard] Operation RCity18</title>
      <link>https://leginwos.tistory.com/65</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;라쿤시티&quot;는&amp;nbsp;레드라쿤에서&amp;nbsp;제공하는&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;br /&gt;라쿤시티:&amp;nbsp;&lt;a href=&quot;https://ctf.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctf.redraccoon.kr/&lt;/a&gt;&lt;br /&gt;레드라쿤:&amp;nbsp;&lt;a href=&quot;https://www.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.redraccoon.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNzss/btsCDfZDkHq/wsclRAVwOqbybmhEMKp7JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNzss/btsCDfZDkHq/wsclRAVwOqbybmhEMKp7JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNzss/btsCDfZDkHq/wsclRAVwOqbybmhEMKp7JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNzss%2FbtsCDfZDkHq%2FwsclRAVwOqbybmhEMKp7JK%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;803&quot; height=&quot;850&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git log로 log를 보면, 각각의 log에 문자열이 하나씩 있는 것을 확인할 수 있다.&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;1405&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yvTNm/btsCG44u6Ek/tSejx7VcwdWwefcKiRJzu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yvTNm/btsCG44u6Ek/tSejx7VcwdWwefcKiRJzu1/img.png&quot; data-alt=&quot;흠&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yvTNm/btsCG44u6Ek/tSejx7VcwdWwefcKiRJzu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyvTNm%2FbtsCG44u6Ek%2FtSejx7VcwdWwefcKiRJzu1%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;53&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;53&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;모의해킹을 처음 배우는 입장에서 처음보는 명령어들이 많아서 흥미롭다.&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;</description>
      <category>모의해킹/raccooncity</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/65</guid>
      <comments>https://leginwos.tistory.com/65#entry65comment</comments>
      <pubDate>Mon, 25 Dec 2023 04:35:30 +0900</pubDate>
    </item>
    <item>
      <title>[Medium] Operation RCity17</title>
      <link>https://leginwos.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;라쿤시티&quot;는&amp;nbsp;레드라쿤에서&amp;nbsp;제공하는&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;br /&gt;라쿤시티:&amp;nbsp;&lt;a href=&quot;https://ctf.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctf.redraccoon.kr/&lt;/a&gt;&lt;br /&gt;레드라쿤:&amp;nbsp;&lt;a href=&quot;https://www.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.redraccoon.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxEVgL/btsCEJsMnMi/45SrbMnk5bT0cGXqBQfeoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxEVgL/btsCEJsMnMi/45SrbMnk5bT0cGXqBQfeoK/img.png&quot; data-alt=&quot;흠&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxEVgL/btsCEJsMnMi/45SrbMnk5bT0cGXqBQfeoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxEVgL%2FbtsCEJsMnMi%2F45SrbMnk5bT0cGXqBQfeoK%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;895&quot; height=&quot;391&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;391&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;git 명령어를 몰라서 헤맸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모의해킹/raccooncity</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/64</guid>
      <comments>https://leginwos.tistory.com/64#entry64comment</comments>
      <pubDate>Mon, 25 Dec 2023 03:47:13 +0900</pubDate>
    </item>
    <item>
      <title>[Easy] Operation RCity16</title>
      <link>https://leginwos.tistory.com/63</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJNOJz/btsCu1tqZ0o/bg5IVDrau1n7Gv0NSmFHi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJNOJz/btsCu1tqZ0o/bg5IVDrau1n7Gv0NSmFHi0/img.png&quot; data-alt=&quot;git log 딸깍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJNOJz/btsCu1tqZ0o/bg5IVDrau1n7Gv0NSmFHi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJNOJz%2FbtsCu1tqZ0o%2Fbg5IVDrau1n7Gv0NSmFHi0%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;817&quot; height=&quot;661&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git log 딸깍&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;</description>
      <category>모의해킹/raccooncity</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/63</guid>
      <comments>https://leginwos.tistory.com/63#entry63comment</comments>
      <pubDate>Fri, 22 Dec 2023 03:38:12 +0900</pubDate>
    </item>
    <item>
      <title>[Hard] Operation RCity15</title>
      <link>https://leginwos.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;라쿤시티&quot;는&amp;nbsp;레드라쿤에서&amp;nbsp;제공하는&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;br /&gt;라쿤시티:&amp;nbsp;&lt;a href=&quot;https://ctf.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ctf.redraccoon.kr/&lt;/a&gt;&lt;br /&gt;레드라쿤:&amp;nbsp;&lt;a href=&quot;https://www.redraccoon.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.redraccoon.kr/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bymmpO/btsCtoCECOA/JyNWCLZ8o0fSAIroIe7rvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bymmpO/btsCtoCECOA/JyNWCLZ8o0fSAIroIe7rvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bymmpO/btsCtoCECOA/JyNWCLZ8o0fSAIroIe7rvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbymmpO%2FbtsCtoCECOA%2FJyNWCLZ8o0fSAIroIe7rvK%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;817&quot; height=&quot;530&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;530&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;765&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2qw17/btsCs96y16w/vfPLJBNGa1xYbGtqYoKsOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2qw17/btsCs96y16w/vfPLJBNGa1xYbGtqYoKsOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2qw17/btsCs96y16w/vfPLJBNGa1xYbGtqYoKsOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2qw17%2FbtsCs96y16w%2FvfPLJBNGa1xYbGtqYoKsOk%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;765&quot; height=&quot;157&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;157&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;501&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wsxk/btsCr9FZV3o/PDbIPuUKjYxUKzrKJOKdu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wsxk/btsCr9FZV3o/PDbIPuUKjYxUKzrKJOKdu0/img.png&quot; data-alt=&quot;test.py&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wsxk/btsCr9FZV3o/PDbIPuUKjYxUKzrKJOKdu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wsxk%2FbtsCr9FZV3o%2FPDbIPuUKjYxUKzrKJOKdu0%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;501&quot; height=&quot;263&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test.py&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfTj0L/btsCsAi11NV/gG9fUvNZPzpw1AMFOcUJgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfTj0L/btsCsAi11NV/gG9fUvNZPzpw1AMFOcUJgk/img.png&quot; data-alt=&quot;flag 글자수 맞추기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfTj0L/btsCsAi11NV/gG9fUvNZPzpw1AMFOcUJgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfTj0L%2FbtsCsAi11NV%2FgG9fUvNZPzpw1AMFOcUJgk%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;1068&quot; height=&quot;132&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;132&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;파이썬도 공부해야겠다.&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;</description>
      <category>모의해킹/raccooncity</category>
      <author>leginwos</author>
      <guid isPermaLink="true">https://leginwos.tistory.com/62</guid>
      <comments>https://leginwos.tistory.com/62#entry62comment</comments>
      <pubDate>Fri, 22 Dec 2023 03:20:23 +0900</pubDate>
    </item>
  </channel>
</rss>