<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>werty2 님의 블로그</title>
    <link>https://werty2.tistory.com/</link>
    <description>werty2 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 14 Jun 2026 02:42:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>werty2</managingEditor>
    <item>
      <title>7주차_Jadx(2)</title>
      <link>https://werty2.tistory.com/25</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;아래 코드를 이어서 분석&lt;/p&gt;
&lt;pre id=&quot;code_1779184727811&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final int onStartCommand(Intent intent, int i2, int i3) {
    String str;
    String str2;
    String str3;
    String str4;
    Thread thread;
    String str5;
    int iM2535 = C1032.m2535(&quot;۠ۨۨ&quot;);
    Thread thread2 = null;
    String str6 = null;
    while (true) {
        switch (iM2535) {
            case 56293:
            case 1746818:
            case 1752670:
                iM2535 = C1025.f + (C1023.f4365 / 6412) &amp;lt; 0 ? C1058.m2711(&quot;ۨ۟۟&quot;) : (C1050.f4392 - C1022.f4364) + 1753444;
                break;
            case 56356:
                String strM2476 = C1023.m2476(intent);
                if (C1058.f4402 * (C1075.f4419 | (-2499)) &amp;gt;= 0) {
                    iM2535 = C1032.m2535(&quot;ۢ۟۠&quot;);
                    str6 = strM2476;
                } else {
                    iM2535 = (C1073.f4417 / C1055.f4399) + 1751653;
                    str6 = strM2476;
                }
                break;
            case 56414:
                thread = new Thread(new RunnableC0019q(C1067.f4411 ^ (-625), this), C1051.m2668(m2663(), 492, C1020.f4362 ^ (-960), 1703));
                if ((C1050.f4392 ^ (C1040.f4382 / (-3268))) &amp;lt; 0) {
                    str5 = &quot;ۣۨۨ&quot;;
                    iM2535 = C1068.m2771(str5);
                    thread2 = thread;
                } else {
                    iM2535 = C1067.m2764(&quot;ۣ۟ۧ&quot;);
                    thread2 = thread;
                }
                break;
            case 1746819:
                if (C1031.f4373 &amp;gt;= 0) {
                    str = &quot;ۡۥ&quot;;
                    iM2535 = C1059.m2718(str);
                } else {
                    C1020.m2452();
                    str4 = &quot;۟ۧ۠&quot;;
                    iM2535 = C1029.m2519(str4);
                }
                break;
            case 1747748:
                C1047.m2635(thread2);
                iM2535 = C1046.f4388 + (C1036.f4378 ^ 7498) &amp;gt;= 0 ? C1049.m2649(&quot;ۨۨۦ&quot;) : (C1060.f4404 | C1041.f4383) + 1750631;
                break;
            case 1747868:
                if (C1032.f4374 * (C1064.f4408 - 3537) &amp;lt;= 0) {
                    iM2535 = C1064.m2747(&quot;ۣۡ&quot;);
                } else {
                    C1043.f4385 = 4;
                    str3 = &quot;ۨ۠ۨ&quot;;
                    iM2535 = C1045.m2622(str3);
                }
                break;
            case 1747936:
                if (intent == null) {
                    if (C1041.f4383 - (C1050.f4392 + 6568) &amp;lt; 0) {
                        iM2535 = C1067.f4411 + C1065.f4409 + 1753428;
                    } else {
                        C1041.m2594();
                        str2 = &quot;ۣۦۤ&quot;;
                        iM2535 = C1023.m2469(str2);
                    }
                    break;
                } else if (C1031.f4373 &amp;gt;= 0) {
                }
                break;
            case 1749571:
                C1067.m2768(this, true);
                str3 = &quot;ۤ۟ۡ&quot;;
                iM2535 = C1045.m2622(str3);
                break;
            case 1749573:
                if (C1048.m2641(C1051.m2668(m2663(), 504, C1047.f4389 ^ (-862), 566), str6)) {
                    iM2535 = (C1056.f4400 - C1023.f4365) ^ (-1751895);
                } else if (C1025.f + (C1023.f4365 / 6412) &amp;lt; 0) {
                }
                break;
            case 1750753:
                if (C1043.m2606(this)) {
                    if (C1053.m2682() &amp;gt; 0) {
                        str2 = &quot;ۨۦۨ&quot;;
                        iM2535 = C1023.m2469(str2);
                    } else {
                        C1068.m2774();
                        iM2535 = C1068.m2771(&quot;ۣ۟ۦ&quot;);
                    }
                    break;
                } else if (C1032.f4374 * (C1064.f4408 - 3537) &amp;lt;= 0) {
                }
                break;
            case 1751494:
                if (C1021.f4363 &amp;gt; 0) {
                    str4 = &quot;ۥۦ۟&quot;;
                    iM2535 = C1029.m2519(str4);
                } else {
                    C1041.m2594();
                    iM2535 = C1031.m2528(&quot;۠ۢۦ&quot;);
                }
                break;
            case 1751625:
                C1038.m2576(this);
                if (C1027.f4369 &amp;lt; 0) {
                    str2 = &quot;ۦ۟ۢ&quot;;
                    iM2535 = C1023.m2469(str2);
                } else {
                    C1065.f4409 = 26;
                    iM2535 = C1049.m2649(&quot;ۢ۟ۢ&quot;);
                }
                break;
            case 1751649:
                if (C1054.m2683() &amp;lt; 0) {
                    str3 = &quot;۟ۤ&quot;;
                    iM2535 = C1045.m2622(str3);
                } else {
                    iM2535 = C1040.m2588(&quot;ۦ۟ۢ&quot;);
                }
                break;
            case 1751653:
                if (C1048.m2641(C1055.m2694(m2663(), 434, C1024.f4366 ^ 384, 1670), str6)) {
                    str2 = &quot;ۣۦۤ&quot;;
                    iM2535 = C1023.m2469(str2);
                } else if (C1055.m2692() &amp;lt;= 0) {
                    iM2535 = (C1033.f4375 * C1040.f4382) + 1678999;
                } else {
                    str5 = &quot;ۣۧۡ&quot;;
                    thread = thread2;
                    iM2535 = C1068.m2771(str5);
                    thread2 = thread;
                }
                break;
            case 1751774:
                if (C1055.m2692() &amp;lt;= 0) {
                }
                break;
            case 1753417:
                return 1;
            case 1753538:
                return C1069.f4413 ^ 346;
            case 1755562:
                C1043.m2607(C1062.m2737(m2663(), 466, C1056.f4400 ^ 61, 3093), C1058.m2714(m2663(), 473, C1048.f4390 ^ (-163), 2338));
                if ((C1051.f4395 ^ (C1059.f4403 ^ (-5623))) &amp;lt; 0) {
                    str3 = &quot;ۢ۟۠&quot;;
                    iM2535 = C1045.m2622(str3);
                } else {
                    C1068.m2774();
                    iM2535 = C1074.m2810(&quot;ۡۥ&quot;);
                }
                break;
            case 1755619:
                this.f1818b = thread2;
                if (C1042.f4384 &amp;lt;= 0) {
                    C1047.m2631();
                    iM2535 = C1065.m2753(&quot;ۨۦۨ&quot;);
                } else {
                    iM2535 = (C1056.f4400 / C1052.f4396) + 1747748;
                }
                break;
            case 1755622:
                if (C1039.f4381 &amp;lt; 0) {
                    iM2535 = C1040.m2588(&quot;۠ۨۨ&quot;);
                } else {
                    str = &quot;ۢ۠ۤ&quot;;
                    iM2535 = C1059.m2718(str);
                }
                break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 1750753: if의 조건인 m2606 함수 안으로 들어가보면 아래와 같다.
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffff;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public static boolean m2606(Object obj) {
    if (C1020.m2452() &amp;lt;= 0) {
        return ((ServiceHandler) obj).f1817a;
    }
    return false;
}&lt;/code&gt;&lt;/pre&gt;
안드로이드에서 Service는 화면이 꺼져 있거나 앱을 닫아도 백그라운드에서 계속 실행되는 컴포넌트를 말한다. 그리고 Handler는 특정 작업이나 메시지를 순차적으로 처리하는 역할을 한다. 즉, 이 함수에 들어오는 obj는 백그라운드 작업을 관리하는 객체이다. C1020.m2452() &amp;lt;= 0 라는 조건문이 참이어야만 정상값을 반환하는 데, 특정 환경(분석 환경)이 감지되면 정상 작동을 멈추도록 설계한 것 같다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 1751625: m2576으로 들어가면, 아래와 같은 함수가 나온다.
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffff;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public static void m2576(Object obj) {
    if (C1048.m2644() &amp;lt;= 0) {
        ((ServiceHandler) obj).m1476e();
    }
}&lt;/code&gt;&lt;/pre&gt;
m1476 함수로 들어가면, 아래와 같다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779686795146&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final void m1476e() {
    String str;
    String str2;
    String str3;
    String str4;
    String str5;
    Thread threadM2557;
    String str6;
    ParcelFileDescriptor parcelFileDescriptor = null;
    Thread thread = null;
    String strM2778 = null;
    int iM2676 = C1052.m2676(&quot;ۣۡۢ&quot;);
    while (true) {
        switch (iM2676) {
            case 56482:
                threadM2557 = C1035.m2557(this);
                str5 = &quot;ۣ۟ۥ&quot;;
                iM2676 = C1027.m2500(str5);
                thread = threadM2557;
                break;
            case 1746753:
                strM2778 = C1069.m2778(m2663(), 390, C1056.f4400 ^ 61, 1195);
                if (C1026.m2495() &amp;lt; 0) {
                    str = &quot;ۧۦۨ&quot;;
                    iM2676 = C1054.m2688(str);
                } else {
                    C1075.m2811();
                    str = &quot;ۨۢۤ&quot;;
                    iM2676 = C1054.m2688(str);
                }
                break;
            case 1746817:
                if (thread == null) {
                    iM2676 = (C1074.f4418 % C1040.f4382) ^ (-1754454);
                } else if ((C1049.f4391 | (C1071.f4415 ^ 2207)) &amp;lt; 0) {
                    iM2676 = (C1028.f4370 | C1054.f4398) + 1751723;
                } else {
                    str2 = &quot;ۨۧ۠&quot;;
                    iM2676 = C1060.m2724(str2);
                }
                break;
            case 1746843:
                C1023.m2475(this);
                if (C1070.m2783() &amp;gt;= 0) {
                    C1040.m2591();
                    iM2676 = C1058.m2711(&quot;ۦۡۢ&quot;);
                } else {
                    iM2676 = C1053.f4397 + C1067.f4411 + 1750206;
                }
                break;
            case 1747653:
                C1067.m2768(this, false);
                iM2676 = (C1048.f4390 % C1027.f4369) + 1747021;
                break;
            case 1747772:
                iM2676 = C1066.f4410 &amp;gt; 0 ? C1069.m2781(&quot;۟۟&quot;) : C1072.m2797(&quot;ۣ۟ۡ&quot;);
                break;
            case 1747775:
            case 1755585:
                str3 = C1041.f4383 % (C1075.f4419 ^ 5134) &amp;lt;= 0 ? &quot;ۡ۟ۦ&quot; : &quot;ۣۨ۠&quot;;
                iM2676 = C1075.m2812(str3);
                break;
            case 1748706:
                if (!C1043.m2606(this)) {
                    if (C1062.f4406 &amp;lt;= 0) {
                        C1028.m2503();
                        iM2676 = C1052.m2676(&quot;ۣۡۢ&quot;);
                    } else {
                        iM2676 = (C1073.f4417 / C1057.f4401) + 1748804;
                    }
                } else if (C1066.f4410 &amp;gt; 0) {
                }
                break;
            case 1748804:
            case 1749572:
                break;
            case 1749574:
                try {
                    C1033.m2539(parcelFileDescriptor);
                    str = &quot;ۨۢۤ&quot;;
                    iM2676 = C1054.m2688(str);
                } catch (IOException e2) {
                    C1043.m2603(strM2778, C1054.m2689(m2663(), 412, C1030.f4372 ^ (-176), 1728), e2);
                    if (C1051.m2665() &amp;lt;= 0) {
                        C1074.f4418 = 93;
                        str6 = &quot;ۣ۟ۥ&quot;;
                    } else {
                        str6 = &quot;ۨۧ۠&quot;;
                    }
                    iM2676 = C1022.m2467(str6);
                }
                break;
            case 1750539:
                this.f1817a = false;
                if (C1030.m2526() &amp;gt;= 0) {
                    C1035.m2554();
                    iM2676 = C1031.m2528(&quot;۟ۤ۠&quot;);
                } else {
                    iM2676 = (C1067.f4411 % C1052.f4396) + 57118;
                }
                break;
            case 1750600:
                this.f1818b = null;
                str = &quot;ۧۥۥ&quot;;
                iM2676 = C1054.m2688(str);
                break;
            case 1750811:
                this.f1819c = null;
                str2 = &quot;۠۟ۤ&quot;;
                iM2676 = C1060.m2724(str2);
                break;
            case 1751530:
                C1025.m2489(thread);
                if (C1048.f4390 &amp;lt; 0) {
                    str3 = &quot;ۣۡۦ&quot;;
                    iM2676 = C1075.m2812(str3);
                } else {
                    iM2676 = C1048.m2642(&quot;ۦۥۤ&quot;);
                }
                break;
            case 1751740:
                break;
            case 1753479:
                if (C1020.f4362 / (C1023.f4365 | (-9728)) != 0) {
                    C1063.f4407 = 61;
                    iM2676 = C1049.m2649(&quot;ۣۡ۠&quot;);
                } else {
                    iM2676 = C1049.m2649(&quot;ۨۢۤ&quot;);
                }
                break;
            case 1753605:
                iM2676 = parcelFileDescriptor == null ? (C1025.f ^ C1058.f4402) + 1747711 : C1023.f4365 - (C1044.f4386 ^ 5756) &amp;gt;= 0 ? C1074.m2810(&quot;ۥۧ&quot;) : C1030.f4372 + C1050.f4392 + 1750499;
                break;
            case 1754537:
                if (C1040.f4382 &amp;lt;= 0) {
                    C1061.m2726();
                    str5 = &quot;ۥۧۥ&quot;;
                    threadM2557 = thread;
                } else {
                    str5 = &quot;ۣۡۢ&quot;;
                    threadM2557 = thread;
                }
                iM2676 = C1027.m2500(str5);
                thread = threadM2557;
                break;
            case 1754539:
                iM2676 = (C1074.f4418 % C1040.f4382) ^ (-1754454);
                break;
            case 1754567:
                ParcelFileDescriptor parcelFileDescriptorM2734 = C1062.m2734(this);
                if (C1026.f4368 / (C1053.f4397 - 9053) != 0) {
                    iM2676 = C1053.m2677(&quot;ۣۨ۠&quot;);
                    parcelFileDescriptor = parcelFileDescriptorM2734;
                } else {
                    iM2676 = (C1047.f4389 * C1075.f4419) ^ 1574155;
                    parcelFileDescriptor = parcelFileDescriptorM2734;
                }
                break;
            case 1754601:
                C1043.m2607(strM2778, C1026.m2491(m2663(), 397, C1046.f4388 ^ 428, 2197));
                if (C1073.f4417 % (C1073.f4417 * (-5181)) &amp;gt;= 0) {
                    C1052.f4396 = 52;
                    str4 = &quot;ۤ۠ۦ&quot;;
                } else {
                    str4 = &quot;ۣ۟ۧ&quot;;
                }
                iM2676 = C1047.m2629(str4);
                break;
            case 1754661:
                iM2676 = (C1070.f4414 - C1026.f4368) ^ 1749746;
                break;
            case 1755434:
                if (C1042.f4384 / (C1020.f4362 | (-2882)) &amp;lt; 0) {
                    str4 = &quot;ۣ۠ۢ&quot;;
                    iM2676 = C1047.m2629(str4);
                } else {
                    C1020.f4362 = 12;
                    iM2676 = C1029.m2519(&quot;ۧۤۨ&quot;);
                }
                break;
        }
        return;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;switch-case로 난독화가 되어있어서 보기가 어렵다. 중요한 부분만 보자면, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;ParcelFileDescriptor parcelFileDescriptorM2734 = C1062.m2734(this);&lt;/span&gt; 이 부분에서는 이 앱이 기기 내부의 특정 파일, 데이터베이스, 혹은 외부 서버와 연결된 통신 통로를 연다는 것을 알 수 있고, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;threadM2557 = C1035.m2557(this);&lt;/span&gt; 이 코드를 통해 스드를 생성하고 뒤에서 실행한다는 것을 알 수 있다. 마지막에 열었던 파일을 닫으려면 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;this.f1817a = false;&lt;/span&gt;을 통해 흔적을 지우며 서비스를 종료한다는 것을 알 수 있다. 간단하게 보면, 이 함수는 조용히특정 파일을 열어서 백그라운드 스레드를 띄워 가동한 뒤, 목적을 달성하면 흔적을 지우고 꺼지는 일련의 백그라운드 동작 프로세스를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 1751653: m2641함수로 들어와보면 아래와 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779692151414&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static boolean m2641(Object obj, Object obj2) {
    if (C1035.m2554() &amp;lt;= 0) {
        return ((String) obj).equals(obj2);
    }
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인자로 들어온 두 값이 같으면 true, 다르면 false를 반환한다. 그러면 인자는 어떤 코드일까. 인자 안의 m2694 함수로 들어가보면 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1779692691551&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static String m2694(short[] sArr, int i2, int i3, int i4) {
    char[] cArr = new char[i3];
    for (int i5 = 0; i5 &amp;lt; i3; i5++) {
        cArr[i5] = (char) (sArr[i2 + i5] ^ i4);
    }
    return new String(cArr);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화되어 있던 short형 정수 배열을 우리가 읽을 수 있는 String으로 변환해 주는 아주 전형적인 XOR 복호화 함수가 나온다. i3 크기만큼의 새로운 char 배열을 만들고 &lt;span&gt;암호화된 배열의 특정 시작 위치(i2)부터 값을 하나씩 가져와서 &lt;/span&gt;&lt;span&gt;복호화 키 값(i4)과 XOR 연산을 한다. &lt;/span&gt;&lt;span&gt;계산된 숫자를 다시 char로 변환 후, cArr 이라는 새로운 문자열을 반환한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;위의 함수들과 연관지어서 해석하면,&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;m2663() 메서드로 암호화된 전체 데이터 배열을 가져옴&lt;/li&gt;
&lt;li&gt;434번째 위치부터 시작&lt;/li&gt;
&lt;li&gt;C1024.f4366 ^ 384 글자 수만큼 1670이라는 키를 이용해 XOR 복호화를 수행&lt;/li&gt;
&lt;li&gt;복호화되어 나온 진짜 텍스트가 다른 값(str6)과 일치하는지(equals) 비교&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같다. 만약 일치한다면 다른 곳으로 분기하도록 한다. else if일 때는 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;C1055.m2692() &amp;lt;= 0&lt;/span&gt;를 만족하면 실행되는데, 들어가면 764^881의 값을 반환하는 것을 알 수 있다. 그래서 일치하지 않는다면, else까지는 가지않고 else if에서 다른 분기 위치가 정해지는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 1755562:m2607 함수로 들어가보면 아래와 같다.
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffff;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public static int m2607(Object obj, Object obj2) {
    if (C1051.m2665() &amp;gt;= 0) {
        return Log.i((String) obj, (String) obj2);
    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;obj를 태그로 하고, obj2가 그 내용으로 로그를 만든다. 공격자가 원하는 행동을 시작할 때 로그를 남기는 것 같다. 그러고 다른 곳으로 분기하도록 한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 1755619: 현재 떠 있는 스레드(thread2) 정보를 클래스 내부 변수(this.f1818b)에 백업 후 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;C1042.f4384 &amp;lt;= &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;0&lt;/span&gt;이면, &lt;/span&gt;m2631 실행. f4384는 882로 실행되지 않음. 무조건 else의 코드가 실행됨. else에서는 (58)/(-759)+1747748으로 case 1747748로 분기된다. 1747748은 아래 코드이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffff;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;case 1747748:
    C1047.m2635(thread2);
    _go = C1046.f4388 + (C1036.f4378 ^ 7498) &amp;gt;= 0 ? C1049.m2649(&quot;ۨۨۦ&quot;) : (C1060.f4404 | C1041.f4383) + 1750631;
    break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m2635 함수의 내용이 m2480 변수가 0보다 크면 &lt;span style=&quot;background-color: #dddddd; color: #000000; text-align: start;&quot;&gt;((Thread) obj).start();&lt;/span&gt; 로 인자로 받은 스레드(thread2)를 실제로 구동하는 것인데, m2480이 ( &lt;span style=&quot;text-align: start;&quot;&gt;-835)^(-739)으로 0보다 큰 값이 나와&lt;/span&gt; 백그라운드 작업(thread2)을 시작시키고, 삼항 연산자로 다음 case에 분기하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>악성코드</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/25</guid>
      <comments>https://werty2.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 25 May 2026 17:06:29 +0900</pubDate>
    </item>
    <item>
      <title>와이파이 공유기 분해</title>
      <link>https://werty2.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CmakV/dJMcacXrWeB/fIUdz2vtszdKSlsi3pR6x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CmakV/dJMcacXrWeB/fIUdz2vtszdKSlsi3pR6x0/img.png&quot; data-alt=&quot;윗판을 제거한 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CmakV/dJMcacXrWeB/fIUdz2vtszdKSlsi3pR6x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCmakV%2FdJMcacXrWeB%2FfIUdz2vtszdKSlsi3pR6x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;458&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윗판을 제거한 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceImx2/dJMcaiJ5UeZ/d12Aey1qVmzp8IXgJfUm2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceImx2/dJMcaiJ5UeZ/d12Aey1qVmzp8IXgJfUm2K/img.png&quot; data-alt=&quot;PCB를 꺼낸 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceImx2/dJMcaiJ5UeZ/d12Aey1qVmzp8IXgJfUm2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceImx2%2FdJMcaiJ5UeZ%2Fd12Aey1qVmzp8IXgJfUm2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;869&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;3000&quot; data-origin-height=&quot;2250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PCB를 꺼낸 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;2369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6dYOB/dJMcahRYlv5/6brR6nfkTJonrs2XqWcKok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6dYOB/dJMcahRYlv5/6brR6nfkTJonrs2XqWcKok/img.png&quot; data-alt=&quot;PCB 근접샷&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6dYOB/dJMcahRYlv5/6brR6nfkTJonrs2XqWcKok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6dYOB%2FdJMcahRYlv5%2F6brR6nfkTJonrs2XqWcKok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;836&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;2369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PCB 근접샷&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기판 부품 구성&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;1. 외부 연결 포트 (상단)&lt;/span&gt;&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오렌지색 포트 (LAN): 컴퓨터, TV, 게임기 등을 유선으로 연결하는 곳.&lt;/li&gt;
&lt;li&gt;노란색 포트 (WAN/Internet): 통신사 모뎀에서 오는 메인 인터넷 선을 꽂는 곳.&lt;/li&gt;
&lt;li&gt;전원 잭 (좌측 상단 검은색): AC 어댑터를 연결하여 보드에 전기를 공급.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;2. 전원 공급 및 필터부 (좌측 상단)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원통형 부품 (전해 커패시터): 전기를 일시적으로 저장했다가 안정적으로 내보냄. 회로를 보호함.&lt;/li&gt;
&lt;li&gt;작은 사각형 부품들 (인덕터 및 레귤레이터): 외부에서 들어온 높은 전압을 칩셋들이 사용할 수 있는 낮은 전압으로 변환.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;3. 핵심 연산 장치 (중앙 및 우측)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검은색 방열판 (Heatsink): 아래에는 공유기의 두뇌인 CPU가 있음. 인터넷 트래픽을 처리하면서 열이 많이 나기 때문에 금속판을 붙여 열을 식힘.&lt;/li&gt;
&lt;li&gt;우측 사각형 칩 (무선 칩셋): Wi-Fi 신호를 생성하고 관리하는 역할.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;4. 무선 신호 및 안테나 (중앙 하단)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회색 및 검은색 선 (안테나 케이블): 기판의 무선 칩셋에서 만들어진 신호를 외부 안테나로 전달.&lt;/li&gt;
&lt;li&gt;납땜 패드 (ANT): 케이블이 보드에 고정된 부분으로, 무선 신호가 증폭되어 밖으로 나감.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;5. 상태 표시등 (하단)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;투명한 전구 모양 (LED): 현재 공유기의 상태(전원, Wi-Fi 작동, LAN 연결 등)를 사용자에게 빛으로 알려줌. 보드 하단에 'CPU', 'WIFI', 'LAN1~4'라고 이름이 써져 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;구조가 생각보다 단순했다. 필요한 기능들을 하는 부품들만 넣어 최대한 단순화를 한 것 같다고 느꼈다.&lt;/p&gt;</description>
      <category>네트워크</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/24</guid>
      <comments>https://werty2.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 18 May 2026 21:20:25 +0900</pubDate>
    </item>
    <item>
      <title>6주차_Jadx(1)</title>
      <link>https://werty2.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;이번 주에 한 일&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Jadx로 Anubis 정적분석(ServiceHandler.onStartCommand 함수 일부)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Anubis 샘플 apk파일을 Jadx에 넣어주었다. 폴더 이름이 a, b, c, d 등으로 난독화가 되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;1365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JSvPR/dJMcadPsXap/UcT8K1kSJ960fS21LxDDsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JSvPR/dJMcadPsXap/UcT8K1kSJ960fS21LxDDsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JSvPR/dJMcadPsXap/UcT8K1kSJ960fS21LxDDsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJSvPR%2FdJMcadPsXap%2FUcT8K1kSJ960fS21LxDDsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;1082&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;1365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;난독화 해제를 위해 설정 -&amp;gt; 난독화 해제 -&amp;gt; 난독 해제 활성화를 체크해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dopI0S/dJMcaipLXtW/YSiAho76UV8ducXYJtEklk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dopI0S/dJMcaipLXtW/YSiAho76UV8ducXYJtEklk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dopI0S/dJMcaipLXtW/YSiAho76UV8ducXYJtEklk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdopI0S%2FdJMcaipLXtW%2FYSiAho76UV8ducXYJtEklk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;554&quot; height=&quot;637&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후, 폴더 이름이 아래와 같이 모든 폴더를 완벽히 알아볼 수는 없지만, 중요 폴더들은 식별이 가능하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pnruG/dJMcacJSWwA/U7CodlPavnrmjK7mhNjbp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pnruG/dJMcacJSWwA/U7CodlPavnrmjK7mhNjbp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pnruG/dJMcacJSWwA/U7CodlPavnrmjK7mhNjbp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpnruG%2FdJMcacJSWwA%2FU7CodlPavnrmjK7mhNjbp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;719&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. AndroidManifest.xml&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1778581712346&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
    android:versionCode=&quot;1&quot;
    versionName=&quot;3.1.5&quot;
    compileSdkVersion=&quot;35&quot;
    compileSdkVersionCodename=&quot;15&quot;
    package=&quot;com.eksctm.android&quot;
    platformBuildVersionCode=&quot;35&quot;
    platformBuildVersionName=&quot;15&quot;
    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
    &amp;lt;uses-sdk
        minSdkVersion=&quot;26&quot;
        targetSdkVersion=&quot;35&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;uses-permission
        name=&quot;android.permission.INTERNET&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;uses-permission
        name=&quot;android.permission.REQUEST_INSTALL_PACKAGES&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;uses-permission
        name=&quot;android.permission.ACCESS_NETWORK_STATE&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;permission
        android:name=&quot;com.eksctm.android.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&quot;
        android:protectionLevel=&quot;signature&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;uses-permission
        name=&quot;com.eksctm.android.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
    &amp;lt;application
        theme=&quot;@kbfcb17/kbfcb_res_0x7f110222&quot;
        android:label=&quot;@kbfcb16/kbfcb_res_0x7f10001c&quot;
        android:icon=&quot;@kbfcb13/kbfcb_res_0x7f0d0000&quot;
        allowBackup=&quot;true&quot;
        supportsRtl=&quot;true&quot;
        android:fullBackupContent=&quot;@kbfcb19/kbfcb_res_0x7f130000&quot;
        android:roundIcon=&quot;@kbfcb13/kbfcb_res_0x7f0d0002&quot;
        appComponentFactory=&quot;androidx.core.app.CoreComponentFactory&quot;
        android:dataExtractionRules=&quot;@kbfcb19/kbfcb_res_0x7f130001&quot;
        android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
        &amp;lt;activity
            name=&quot;com.eksctm.android.MainActivity&quot;
            exported=&quot;true&quot;
            android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;android.intent.action.MAIN&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
                &amp;lt;category
                    android:name=&quot;android.intent.category.LAUNCHER&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/activity&amp;gt;
        &amp;lt;service
            name=&quot;com.eksctm.android.ServiceHandler&quot;
            permission=&quot;android.permission.BIND_VPN_SERVICE&quot;
            exported=&quot;true&quot;
            android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;android.net.VpnService&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/service&amp;gt;
        &amp;lt;receiver
            android:name=&quot;com.eksctm.android.Receiver&quot;
            exported=&quot;true&quot;
            android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
        &amp;lt;provider
            name=&quot;androidx.startup.InitializationProvider&quot;
            exported=&quot;false&quot;
            authorities=&quot;com.eksctm.android.androidx-startup&quot;
            android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
            &amp;lt;meta-data
                android:name=&quot;androidx.emoji2.text.EmojiCompatInitializer&quot;
                android:value=&quot;androidx.startup&quot;
                android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;meta-data
                android:name=&quot;androidx.lifecycle.ProcessLifecycleInitializer&quot;
                android:value=&quot;androidx.startup&quot;
                android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;meta-data
                android:name=&quot;androidx.profileinstaller.ProfileInstallerInitializer&quot;
                android:value=&quot;androidx.startup&quot;
                android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
        &amp;lt;/provider&amp;gt;
        &amp;lt;receiver
            android:name=&quot;androidx.profileinstaller.ProfileInstallReceiver&quot;
            permission=&quot;android.permission.DUMP&quot;
            enabled=&quot;true&quot;
            exported=&quot;true&quot;
            directBootAware=&quot;false&quot;
            android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;androidx.profileinstaller.action.INSTALL_PROFILE&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;androidx.profileinstaller.action.SKIP_FILE&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;androidx.profileinstaller.action.SAVE_PROFILE&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
            &amp;lt;intent-filter android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;&amp;gt;
                &amp;lt;action
                    android:name=&quot;androidx.profileinstaller.action.BENCHMARK_OPERATION&quot;
                    android:tag=&quot;⟨STRING_DECODE_ERROR⟩&quot;/&amp;gt;
            &amp;lt;/intent-filter&amp;gt;
        &amp;lt;/receiver&amp;gt;
    &amp;lt;/application&amp;gt;
&amp;lt;/manifest&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;name=&quot;com.eksctm.android.ServiceHandler&quot; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;permission=&quot;android.permission.BIND_VPN_SERVICE&quot; &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt;기기의 모든 네트워크 트래픽을 가로채기 위해 VpnService 권한을 요구한다고 의심이 된다. 사용자가 입력하는 데이터를 탈취하는 목적일 수 있다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &amp;lt;uses-permission name=&quot;android.permission.INTERNET&quot;/&amp;gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;uses-permission name=&quot;android.permission.REQUEST_INSTALL_PACKAGES&quot;/&amp;gt; &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt; INTERNET 권한(앱이 네트워크를 쓸 수 있게 허용)으로 추가 악성 페이로드를 다운로드한 뒤, REQUEST_INSTALL_PACKAGES를 이용해 가짜 업데이트나 다른 악성 앱을 사용자 몰래설치할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; text-align: start;&quot;&gt; exported=&quot;false&quot; &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;다른 조종용 시스템이 이 앱의 기능을 원격으로 사용할 수 있도록 true로 설정했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. com.eksctm.android.ServiceHandler&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;onStartCommand 함수 부분을 먼저 보면&lt;/p&gt;
&lt;pre id=&quot;code_1778585693457&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final int onStartCommand(android.content.Intent r9, int r10, int r11) {
        /*
            Method dump skipped, instruction units count: 632
            To view this dump change 'Code comments level' option to 'DEBUG'
        */
        throw new UnsupportedOperationException(&quot;Method not decompiled: com.eksctm.android.ServiceHandler.onStartCommand(android.content.Intent, int, int):int&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;JADX가 코드를 제대로 해석하지 못하고 &quot;Method dump skipped&quot;라는 메시지를 띄웠다. 코드가 너무 길거나(632 units), 분석을 방해하기 위해 바이트코드를 비정상적으로 꼬아놓아서 그런 것 같다. &lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;632 유닛&lt;/b&gt;이라는 건, 이 서비스가 켜지자마자 하는 일이 매우 방대하고 복잡하다는 뜻이다. 일반적인 서비스와는 확실히 다른 점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파일 &amp;gt; 설정 &amp;gt; 디컴파일에서 &lt;b&gt;디컴파일 안된 코드 표시에 체크&lt;/b&gt;를 해주고, &lt;b&gt;코드 주석 수준을 DEBUG&lt;/b&gt;로 바꿔준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후, 다시 com.eksctm.android.ServiceHandler를 보면&lt;/p&gt;
&lt;pre id=&quot;code_1778813023152&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public final int onStartCommand(Intent intent, int i2, int i3) {
    String str;
    String str2;
    String str3;
    String str4;
    Thread thread;
    String str5;
    int iM2535 = C1032.m2535(&quot;۠ۨۨ&quot;);
    Thread thread2 = null;
    String str6 = null;
    while (true) {
        switch (iM2535) {
            case 56293:
            case 1746818:
            case 1752670:
                iM2535 = C1025.f4367 + (C1023.f4365 / 6412) &amp;lt; 0 ? C1058.m2711(&quot;ۨ۟۟&quot;) : (C1050.f4392 - C1022.f4364) + 1753444;
                break;
            case 56356:
                String strM2476 = C1023.m2476(intent);
                if (C1058.f4402 * (C1075.f4419 | (-2499)) &amp;gt;= 0) {
                    iM2535 = C1032.m2535(&quot;ۢ۟۠&quot;);
                    str6 = strM2476;
                } else {
                    iM2535 = (C1073.f4417 / C1055.f4399) + 1751653;
                    str6 = strM2476;
                }
                break;
            case 56414:
                thread = new Thread(new RunnableC0019q(C1067.f4411 ^ (-625), this), C1051.m2668(m2663(), 492, C1020.f4362 ^ (-960), 1703));
                if ((C1050.f4392 ^ (C1040.f4382 / (-3268))) &amp;lt; 0) {
                    str5 = &quot;ۣۨۨ&quot;;
                    iM2535 = C1068.m2771(str5);
                    thread2 = thread;
                } else {
                    iM2535 = C1067.m2764(&quot;ۣ۟ۧ&quot;);
                    thread2 = thread;
                }
                break;
            case 1746819:
                if (C1031.f4373 &amp;gt;= 0) {
                    str = &quot;ۡۥ&quot;;
                    iM2535 = C1059.m2718(str);
                } else {
                    C1020.m2452();
                    str4 = &quot;۟ۧ۠&quot;;
                    iM2535 = C1029.m2519(str4);
                }
                break;
            case 1747748:
                C1047.m2635(thread2);
                iM2535 = C1046.f4388 + (C1036.f4378 ^ 7498) &amp;gt;= 0 ? C1049.m2649(&quot;ۨۨۦ&quot;) : (C1060.f4404 | C1041.f4383) + 1750631;
                break;
            case 1747868:
                if (C1032.f4374 * (C1064.f4408 - 3537) &amp;lt;= 0) {
                    iM2535 = C1064.m2747(&quot;ۣۡ&quot;);
                } else {
                    C1043.f4385 = 4;
                    str3 = &quot;ۨ۠ۨ&quot;;
                    iM2535 = C1045.m2622(str3);
                }
                break;
            case 1747936:
                if (intent == null) {
                    if (C1041.f4383 - (C1050.f4392 + 6568) &amp;lt; 0) {
                        iM2535 = C1067.f4411 + C1065.f4409 + 1753428;
                    } else {
                        C1041.m2594();
                        str2 = &quot;ۣۦۤ&quot;;
                        iM2535 = C1023.m2469(str2);
                    }
                    break;
                } else if (C1031.f4373 &amp;gt;= 0) {
                }
                break;
            case 1749571:
                C1067.m2768(this, true);
                str3 = &quot;ۤ۟ۡ&quot;;
                iM2535 = C1045.m2622(str3);
                break;
            case 1749573:
                if (C1048.m2641(C1051.m2668(m2663(), 504, C1047.f4389 ^ (-862), 566), str6)) {
                    iM2535 = (C1056.f4400 - C1023.f4365) ^ (-1751895);
                } else if (C1025.f4367 + (C1023.f4365 / 6412) &amp;lt; 0) {
                }
                break;
            case 1750753:
                if (C1043.m2606(this)) {
                    if (C1053.m2682() &amp;gt; 0) {
                        str2 = &quot;ۨۦۨ&quot;;
                        iM2535 = C1023.m2469(str2);
                    } else {
                        C1068.m2774();
                        iM2535 = C1068.m2771(&quot;ۣ۟ۦ&quot;);
                    }
                    break;
                } else if (C1032.f4374 * (C1064.f4408 - 3537) &amp;lt;= 0) {
                }
                break;
            case 1751494:
                if (C1021.f4363 &amp;gt; 0) {
                    str4 = &quot;ۥۦ۟&quot;;
                    iM2535 = C1029.m2519(str4);
                } else {
                    C1041.m2594();
                    iM2535 = C1031.m2528(&quot;۠ۢۦ&quot;);
                }
                break;
            case 1751625:
                C1038.m2576(this);
                if (C1027.f4369 &amp;lt; 0) {
                    str2 = &quot;ۦ۟ۢ&quot;;
                    iM2535 = C1023.m2469(str2);
                } else {
                    C1065.f4409 = 26;
                    iM2535 = C1049.m2649(&quot;ۢ۟ۢ&quot;);
                }
                break;
            case 1751649:
                if (C1054.m2683() &amp;lt; 0) {
                    str3 = &quot;۟ۤ&quot;;
                    iM2535 = C1045.m2622(str3);
                } else {
                    iM2535 = C1040.m2588(&quot;ۦ۟ۢ&quot;);
                }
                break;
            case 1751653:
                if (C1048.m2641(C1055.m2694(m2663(), 434, C1024.f4366 ^ 384, 1670), str6)) {
                    str2 = &quot;ۣۦۤ&quot;;
                    iM2535 = C1023.m2469(str2);
                } else if (C1055.m2692() &amp;lt;= 0) {
                    iM2535 = (C1033.f4375 * C1040.f4382) + 1678999;
                } else {
                    str5 = &quot;ۣۧۡ&quot;;
                    thread = thread2;
                    iM2535 = C1068.m2771(str5);
                    thread2 = thread;
                }
                break;
            case 1751774:
                if (C1055.m2692() &amp;lt;= 0) {
                }
                break;
            case 1753417:
                return 1;
            case 1753538:
                return C1069.f4413 ^ 346;
            case 1755562:
                C1043.m2607(C1062.m2737(m2663(), 466, C1056.f4400 ^ 61, 3093), C1058.m2714(m2663(), 473, C1048.f4390 ^ (-163), 2338));
                if ((C1051.f4395 ^ (C1059.f4403 ^ (-5623))) &amp;lt; 0) {
                    str3 = &quot;ۢ۟۠&quot;;
                    iM2535 = C1045.m2622(str3);
                } else {
                    C1068.m2774();
                    iM2535 = C1074.m2810(&quot;ۡۥ&quot;);
                }
                break;
            case 1755619:
                this.f1818b = thread2;
                if (C1042.f4384 &amp;lt;= 0) {
                    C1047.m2631();
                    iM2535 = C1065.m2753(&quot;ۨۦۨ&quot;);
                } else {
                    iM2535 = (C1056.f4400 / C1052.f4396) + 1747748;
                }
                break;
            case 1755622:
                if (C1039.f4381 &amp;lt; 0) {
                    iM2535 = C1040.m2588(&quot;۠ۨۨ&quot;);
                } else {
                    str = &quot;ۢ۠ۤ&quot;;
                    iM2535 = C1059.m2718(str);
                }
                break;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;t&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;제어 흐름 난독화가 되어 있어 분석하기가 어렵다. ㅠ.ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함수 안의 모든 코드가 switch-case 제어문 안에 있다. case에 맞는 코드로 바로 이동해 실행하는 조건이 여러 개인 제어문이다. break로 끊어주어야지 다음 코드까지 실행하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;case 56293, 1746818, 1752670:&lt;span style=&quot;color: #000000; text-align: start; background-color: #dddddd;&quot;&gt;iM2535 = C1025.f4367 + (C1023.f4365 / 6412) &amp;lt; 0 ? C1058.m2711(&quot;ۨ۟۟&quot;) : (C1050.f4392 - C1022.f4364) + 1753444;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 의 삼항연산자가 있다. 분석가가 이해하는데에 오래 걸리도록 꼬아놓은 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;웬만하면 조건이 거짓이 되도록 해 &lt;/span&gt;(C1050.f4392 - C1022.f4364) +&lt;span style=&quot;background-color: #dddddd; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;1753444&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;라는 값을 iM2535라는 변수에 넣는 코드를 어렵게 만들어놓은 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; case 56356: &lt;span style=&quot;background-color: #dddddd;&quot;&gt;String strM2476 = C1023.m2476(intent);&lt;/span&gt; 이 서비스가 시작될 때 받은 intent에서 중요한 문자열(명령어, 서버 주소 등)을 뽑아내서 strM2476에 저장한다. 그 뒤로 if-else 문이 있는데, 조건이 맞든 안맞든 iM2535에 새로운 값을 넣어 다시 분기하도록 한다. 두 iM2535의 값이 다른지 다르지 않은지는 여기서는 알 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; case 56414: 이 부분이 가장 위험한 부분이다.&lt;span style=&quot;background-color: #dddddd;&quot;&gt; thread = new Thread(new RunnableC0019q(C1067.f4411 ^ (-625), this), C1051.m2668(m2663(), 492, C1020.f4362 ^ (-960), 1703));&lt;/span&gt; 여기서 새로운 작업 스래드를 만든다. RunnableC0019q가 실제 악성 짓을 수행하는 스래드일 확률이 높다. 스래드를 실행할 때 넘겨주는 인자값을 비트연산(^) 등으로 알아보기 어렵게 해놨다. 인자는 어떤 값인지 여기서는 알 수가 없지만 이 코드의 전반적인 의도는 메인 서비스 흐름과는 별개로 &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;10,3,0&quot;&gt;백그라운드에서 계속 동작하는 악성 루프&lt;/b&gt;를 돌리겠다는 의미로 보인다. 그 후 iM2535에 특정 값을 넣어 분기하도록 하고, thread2 = thread를 통해 만든 스래드에 thread2라는 다른 이름을 붙인다. thread라는 이름을 나중에 또 사용하기 위해서이거나, 분석을 어렵게 만들기 위해서인 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; case 1746819: C1031.f4373이라는 변수값이 0보다 큰지 확인한다. case 1747748(스레드 시작) 바로 전 부분에서 이 체크가 일어나므로 실행환경이 안전한지 확인하는 코드로 보인다. 예를 들어 실행환경이 실제 환경인지, 에뮬레이터인지와 같은&amp;nbsp; 것을 확인하는 것으로 보인다.&amp;nbsp; 그 후 if-else를 통해 iM2535가 서로 다른 곳으로 분기할 수 있도록 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; case 1747748: &lt;span style=&quot;background-color: #dddddd;&quot;&gt;C1047.m2635(thread2);&lt;/span&gt; 를 통해 위에서 만든 thread2 이름표의 스레드에게 실행을 시작하라고 신호를 보내는 곳으로 보인다. m2635는 아마도 Thread.start()를 호출하는 함수일 가능성이 높다. 그 후, 삼항연산자로 iM2535에 새 값을 넣어줘 다른 곳으로 분기하도록 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt; case 1747868: &lt;span style=&quot;background-color: #dddddd;&quot;&gt;if (intent == null)&lt;/span&gt;에서 intent는 컴포넌트 간에 데이터를 주고받는 핵심 객체인데 이게 null이라는 것은 정상적인 실행이 아니라는 뜻이다. intent에 아무것도 없다면 다음 케이스로 분기하도록 한다. 중간중간에 보이는&amp;nbsp; &lt;span style=&quot;text-align: start;&quot;&gt;ۦ 이렇게 생긴 이상한 문자는 다른 함수에 넣으면 의도한대로 값이 나오도록 설계한 것 같다. 분석하기 어렵게 이상한 문자를 넣은 것 같다. intent가 null이 아니라면 실행하는 값은 중괄호 안에 아무것도 넣어놓지 않아서 겉보기에는 그냥 스위치문을 탈출하는 것처럼 보인다. 코드 제작자가 다른 곳에 참일시 실행하는 코드를 숨겨놓은 것 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;case 1749571: this 인자를 넘겨줌으로써 현재 이 코드의 화면이나 권한 등의 것을 m2768 함수로 넘겨준다. 그리고 true를 통해 어떤 기능을 활성화한다는 것 같다. m2768 함수를 보면 아래와 같다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #ffffff;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;    /* JADX INFO: renamed from: ۥۣۣۢ, reason: contains not printable characters */
    public static void m2768(Object obj, boolean z2) {
        if (C1023.m2471() &amp;gt;= 0) {
            ((ServiceHandler) obj).m1474c(z2);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Object obj로 들어온 객체를 진짜 타입인 (ServiceHandler)로 강제 형변환을 하고 있다. m1474 함수를 보면
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff;&quot;&gt;&lt;code&gt;    public final void m1474c(boolean z2) {
        String strM2703;
        boolean z3;
        ArrayList arrayList;
        String strM2668;
        int i2 = 1616;
        while (true) {
            i2 ^= 1633;
            switch (i2) {
                case 14:
                    break;
                case 49:
                    i2 = !z2 ? 1678 : 1709;
                    break;
                case 204:
                    strM2703 = C1052.m2673(m2663(), 25, 13, 1513);
                    int i3 = 1740;
                    while (true) {
                        i3 ^= 1757;
                        switch (i3) {
                            case 17:
                                i3 = 1771;
                                continue;
                            case 54:
                                break;
                        }
                    }
                    break;
                case 239:
                    strM2703 = C1056.m2703(m2663(), 38, 16, 452);
                    break;
            }
        }​&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;case 49 -&amp;gt; case 204 순으로 실행이 된다. case 204는 난독화해 둔 중요한 문자열(C2 서버 주소, 탈취할 데이터 항목 등)을 드디어 복호화해서 strM2703이라는 변수에 담고 있는 것 같다. 더 자세히 알아보기 위해 m2673 함수를 보면
&lt;pre class=&quot;arduino&quot; style=&quot;background-color: #ffffff;&quot;&gt;&lt;code&gt;    public static String m2673(short[] sArr, int i2, int i3, int i4) {
        char[] cArr = new char[i3];
        for (int i5 = 0; i5 &amp;lt; i3; i5++) {
            cArr[i5] = (char) (sArr[i2 + i5] ^ i4);
        }
        return new String(cArr);
    }​&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;XOR 연산을 이용해 암호화된 데이터를 글자로 복원하는 함수이다. 이 함수는 난독화가 되어있지 않다. 위의 case 204 코드와 연결지어 보면, m2663()이 가진 배열의 25번째 인덱스부터 시작해서 13개의 숫자를 각각 1513과 XOR 연산하면 숨겨진 진짜 문자열이 나오는 구조이다. m2663()으로 들어가면
&lt;pre class=&quot;reasonml&quot; style=&quot;background-color: #ffffff;&quot;&gt;&lt;code&gt;    public static short[] m2663() {
        short[] sArr;
        String str;
        short[] sArr2 = null;
        short[] sArr3 = null;
        int iM2747 = C1064.m2747(&quot;۟ۡ&quot;);
        while (true) {
            switch (iM2747) {
                case 56289:
                    str = &quot;ۥۥۢ&quot;;
                    sArr3 = null;
                    iM2747 = C1055.m2695(str);
                    break;
                case 56290:
                    if (C1056.m2696() &amp;lt; 0) {
                        iM2747 = C1066.m2758(&quot;ۨۡۤ&quot;);
                    } else if (C1068.f4412 &amp;lt;= 0) {
                        C1048.f4390 = 57;
                        iM2747 = C1061.m2729(&quot;۟۠&quot;);
                    } else {
                        iM2747 = (C1058.f4402 % C1025.f) + 1749697;
                    }
                    break;
                case 56538:
                case 1746942:
                    if (C1061.f4405 &amp;gt;= 0) {
                        C1044.m2616();
                        iM2747 = C1060.m2724(&quot;ۣۢۢ&quot;);
                    } else {
                        iM2747 = C1022.m2467(&quot;ۧۥ۟&quot;);
                    }
                    break;
                case 56567:
                    iM2747 = C1066.m2758(&quot;ۨۡۤ&quot;);
                    break;
                case 1746812:
                    if (C1048.f4390 &amp;lt; 0) {
                        iM2747 = C1058.m2711(&quot;۟ۡ&quot;);
                    } else {
                        C1072.m2798();
                        str = &quot;ۣۣۡ&quot;;
                        iM2747 = C1055.m2695(str);
                    }
                    break;
                case 1749703:
                    sArr = f4394short;
                    if (C1048.f4390 &amp;lt; 0) {
                        iM2747 = 1748521 + C1066.f4410 + C1045.f4387;
                        sArr2 = sArr;
                    } else {
                        C1045.f4387 = 18;
                        iM2747 = C1067.m2764(&quot;ۧۥ۟&quot;);
                        sArr2 = sArr;
                    }
                    break;
                case 1749794:
                    if (C1038.f4380 + C1033.f4375 + 4148 &amp;gt; 0) {
                        sArr = sArr2;
                        sArr3 = sArr2;
                        iM2747 = C1067.m2764(&quot;ۧۥ۟&quot;);
                        sArr2 = sArr;
                    } else {
                        sArr3 = sArr2;
                        iM2747 = C1064.m2747(&quot;ۢۦۦ&quot;);
                    }
                    break;
                case 1752642:
                    iM2747 = C1063.f4407 / (C1039.f4381 + (-9919)) != 0 ? C1060.m2724(&quot;ۣ۟۠&quot;) : C1042.m2600(&quot;ۧۡ&quot;);
                    break;
                case 1754561:
                    break;
                case 1755403:
                    iM2747 = C1059.f4403 / (C1068.f4412 + (-4286)) != 0 ? C1068.m2771(&quot;۟ۧۦ&quot;) : (C1044.f4386 - C1044.f4386) + 56289;
                    break;
            }
            return sArr3;
        }
    }​&lt;/code&gt;&lt;/pre&gt;
위와 같은데, &lt;span&gt;case&lt;/span&gt; &lt;span&gt;1749703과 1749794를 보면 &lt;/span&gt;sArr3에 담겨 리턴되는 원본 배열은 이 클래스(혹은 상위 클래스)의 멤버 변수로 선언되어 있는 f4394short라는 변수를 sArr3 으로 반환한다는 것을 알 수 있다. f4394short 변수로들어가면
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #ffffff;&quot;&gt;&lt;code&gt;    private static final short[] f4394short = {933, 899, 925, 944, 924, 897, 918, 2982, 2967, 2965, 2973, 2963, 2946, 3030, 2950, 2967, 2948, 2949, 2963, 3030, 2963, 2948, 2948, 2969, 2948, 1471, 1465, 1447, 1462, 1450, 1446, 1447, 1447, 1452, 1450, 1469, 1452, 1453, 402, 404, 394, 411, 384, 397, 407, 391, 395, 394, 394, 385, 391, 400, 385, 384, 2357, 2327, 2304, 2333, 2331, 2330, 2388, 2328, 2333, 2311, 2304, 2382, 2388, 905, 958, 936, 948, 951, 941, 946, 949, 956, 1019, 943, 930, 939, 958, 1019, 3188, 3159, 3163, 3161, 3156, 3194, 3146, 3159, 3161, 3164, 3163, 3161, 3147, 3148, 3189, 3161, 3158, 3161, 3167, 3165, 3146, 1355, 1304, 1288, 1283, 1294, 1286, 1294, 1355, 2803, 2748, 2741, 2803, 2746, 2749, 2727, 2742, 2749, 2727, 2803, 2590, 2621, 2609, 2611, 2622, 2576, 2592, 2621, 2611, 2614, 2609, 2611, 2593, 2598, 2591, 2611, 2620, 2611, 2613, 2615, 2592, 3321, 3290, 3286, 3284, 3289, 3319, 3271, 3290, 3284, 3281, 3286, 3284, 3270, 3265, 3320, 3284, 3291, 3284, 3282, 3280, 3271, 731, 759, 738, 757, 766, 767, 760, 753, 694, 759, 753, 759, 767, 760, 741, 738, 694, 752, 767, 762, 738, 755, 740, 694, 262, 293, 297, 299, 294, 264, 312, 293, 299, 302, 297, 299, 313, 318, 263, 299, 292, 299, 301, 303, 312, 1192, 1192, 1230, 1249, 1252, 1276, 1261, 1274, 1199, 1275, 1192, 1276, 1257, 1274, 1263, 1261, 1276, 1192, 1257, 1252, 1274, 1261, 1257, 1260, 1265, 1192, 1257, 1260, 1260, 1261, 1260, 1733, 1766, 1770, 1768, 1765, 1739, 1787, 1766, 1768, 1773, 1770, 1768, 1786, 1789, 1732, 1768, 1767, 1768, 1774, 1772, 1787, 2381, 2414, 2402, 2400, 2413, 2371, 2419, 2414, 2400, 2405, 2402, 2400, 2418, 2421, 2380, 2400, 2415, 2400, 2406, 2404, 2419, 3083, 3083, 3181, 3138, 3143, 3167, 3150, 3161, 3083, 3142, 3146, 3167, 3144, 3139, 3150, 3151, 3082, 3083, 3083, 3142, 3146, 3167, 3144, 3139, 3094, 3099, 3155, 2323, 2312, 2317, 2312, 2313, 2321, 2312, 2374, 2324, 2307, 2311, 2325, 2313, 2312, 2576, 2589, 2580, 2561, 1866, 1871, 1882, 1871, 1730, 1728, 1751, 1738, 1740, 1741, 1305, 1307, 1294, 1311, 1309, 1301, 1288, 1283, 1845, 1814, 1818, 1816, 1813, 1851, 1803, 1814, 1816, 1821, 1818, 1816, 1802, 1805, 1844, 1816, 1815, 1816, 1822, 1820, 1803, 2362, 2362, 2396, 2419, 2422, 2414, 2431, 2408, 2362, 2430, 2419, 2430, 2362, 2420, 2421, 2414, 2362, 2423, 2427, 2414, 2425, 2418, 2336, 2362, 1277, 1243, 1221, 1256, 1220, 1241, 1230, 2246, 2273, 2298, 2277, 2277, 2300, 2299, 2290, 2229, 2243, 2245, 2267, 2235, 2235, 2235, 1668, 1701, 1715, 1699, 1714, 1705, 1712, 1716, 1711, 1714, 1760, 1699, 1708, 1711, 1715, 1701, 1760, 1701, 1714, 1714, 1711, 1714, 1765, 1769, 1771, 1704, 1744, 1782, 1768, 1749, 1763, 1780, 1776, 1775, 1765, 1763, 1704, 1767, 1768, 1762, 1780, 1769, 1775, 1762, 1704, 1749, 1746, 1735, 1748, 1746, 1753, 1744, 1750, 1736, 3139, 3173, 3195, 3158, 3194, 3175, 3184, 2420, 2418, 2412, 2306, 2371, 2382, 2384, 2375, 2371, 2374, 2395, 2306, 2371, 2369, 2390, 2379, 2388, 2375, 2316, 1779, 1746, 1737, 1737, 1730, 1739, 1776, 1736, 1749, 1740, 1730, 1749, 597, 601, 603, 536, 608, 582, 600, 613, 595, 580, 576, 607, 597, 595, 536, 599, 600, 594, 580, 601, 607, 594, 536, 613, 610, 633, 614, 617, 608, 614, 632};​&lt;/code&gt;&lt;/pre&gt;
&amp;nbsp;&lt;/li&gt;
&lt;li&gt;위와 같이 숫자들의 배열이 있다. 이 배열이 바로 m2663()이 반환하는 배열이다. 이 배열을 통해 위의 코드와 같이 25번째 인덱스부터 시작해서 13개의 숫자를 각각 1513과 XOR 연산을 하면, &lt;b&gt;VPN_CONNECTED&lt;/b&gt; 라는 글자가 나온다. 안드로이드 시스템은 기기에 VPN이 연결되거나 해제될 때 전체 앱에 브로드캐스트 인텐트를 보낸다. 이 코드는 이를 수신한 뒤, 방금 들어온 시스템 신호가 VPN이 연결되었다는 신호인지 문자열을 비교하며 체크하는 부분이라는 것을 알게되었다. 악성코드가 외부 서버와 통신하는 패킷을 가로채기 위해 분석 환경에 VPN 형태의 네트워크 프록시 도구를 켜두는 경우가 많기 때문에 기기에 VPN이 켜진 것을 감지하면 악성 행위를 일시 중단하여 정체를 숨기기 위함인 것 같다. 따라서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;분석 환경일 때를 감지하기 위한 부분이라고 보면 될 것 같다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이런 식으로 파고 들어가면서 분석을 해야할 것 같다. 이제 한 부분 분석을 완료했다. 전체적으로 제어 흐름 평탄화(모든 구조를 평평하게 늘어뜨리는 대표적인 난독화 기법)가 되어있어서 나머지 부분도 분석이 쉽지 않을 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>악성코드</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/23</guid>
      <comments>https://werty2.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 18 May 2026 20:47:03 +0900</pubDate>
    </item>
    <item>
      <title>5주차_Frida(1)</title>
      <link>https://werty2.tistory.com/22</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;이번 주에 한 일&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Anubis 다운로드&lt;/li&gt;
&lt;li&gt;Frida를 통해 에뮬레이터 내용 가로채기(동적분석)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUMZQ/dJMcad2YWnE/z5Wl44HNEbKM9NeB5gpRNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUMZQ/dJMcad2YWnE/z5Wl44HNEbKM9NeB5gpRNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUMZQ/dJMcad2YWnE/z5Wl44HNEbKM9NeB5gpRNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUMZQ%2FdJMcad2YWnE%2Fz5Wl44HNEbKM9NeB5gpRNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;458&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우분투 내에서 MalwareBazaar에서 tag:anubis로 검색한 후, 위 사진의 두 번째로 보이는 샘플을 다운받았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xk3GF/dJMcaakVNyW/Q7aDHkGBg43XsJgtLgX8hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xk3GF/dJMcaakVNyW/Q7aDHkGBg43XsJgtLgX8hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xk3GF/dJMcaakVNyW/Q7aDHkGBg43XsJgtLgX8hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxk3GF%2FdJMcaakVNyW%2FQ7aDHkGBg43XsJgtLgX8hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;492&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;zip 폴더의 패스워트는 infected 라는 설명이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX66Dj/dJMcag6wNyG/tdEeeUkxhlhgEkfcGl4cM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX66Dj/dJMcag6wNyG/tdEeeUkxhlhgEkfcGl4cM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX66Dj/dJMcag6wNyG/tdEeeUkxhlhgEkfcGl4cM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX66Dj%2FdJMcag6wNyG%2FtdEeeUkxhlhgEkfcGl4cM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;383&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;버추얼박스 설정에서 포트포워딩 규칙을 추가해주었다. 규칙은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,0,0&quot;&gt;이름:&lt;/b&gt; adb&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,1,0&quot;&gt;프로토콜:&lt;/b&gt; TCP&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,2,0&quot;&gt;호스트 IP:&lt;/b&gt; 127.0.0.1&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,3,0&quot;&gt;호스트 포트:&lt;/b&gt; 5555&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,1,4,0&quot;&gt;게스트 포트:&lt;/b&gt; 5555&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KXKfS/dJMcahRSvmS/ch8liRHluvUEiSUCGJWKfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KXKfS/dJMcahRSvmS/ch8liRHluvUEiSUCGJWKfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KXKfS/dJMcahRSvmS/ch8liRHluvUEiSUCGJWKfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKXKfS%2FdJMcahRSvmS%2Fch8liRHluvUEiSUCGJWKfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;144&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후 우분투로 들어와 adb connect 명령어를 통해 호스트(10.0.2.2)의 에뮬레이터와 연결해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;successfully 메시지가 아래에 뜨면 성공한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJyMqy/dJMcacJQ7Dq/Rzsc1GW3AwHWvLbvdSvArK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJyMqy/dJMcacJQ7Dq/Rzsc1GW3AwHWvLbvdSvArK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJyMqy/dJMcacJQ7Dq/Rzsc1GW3AwHWvLbvdSvArK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJyMqy%2FdJMcacJQ7Dq%2FRzsc1GW3AwHWvLbvdSvArK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;174&quot; data-origin-width=&quot;294&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후, 우분투에서 아까 다운받은 zip 파일의 압축을 푼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmrmnF/dJMcabKXJ2P/cc8TFTdBiCuTs9NZ33bKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmrmnF/dJMcabKXJ2P/cc8TFTdBiCuTs9NZ33bKWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmrmnF/dJMcabKXJ2P/cc8TFTdBiCuTs9NZ33bKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmrmnF%2FdJMcabKXJ2P%2Fcc8TFTdBiCuTs9NZ33bKWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1360&quot; height=&quot;246&quot; data-origin-width=&quot;1360&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;압축을 푼 apk 파일이 있는 곳으로 이동해서 에뮬레이터에 push 명령어를 이용해 전송한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후, install 명령어를 통해 apk 파일을 에뮬레이터 안에서 설치하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5nIiD/dJMcadaPvhh/KXj4wkUwz4fFJ1EWQRxnMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5nIiD/dJMcadaPvhh/KXj4wkUwz4fFJ1EWQRxnMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5nIiD/dJMcadaPvhh/KXj4wkUwz4fFJ1EWQRxnMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5nIiD%2FdJMcadaPvhh%2FKXj4wkUwz4fFJ1EWQRxnMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;106&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;adb root 명령어를 이용해 root 권한을 얻어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;adb shell 명령어를 통해 내부의 셸에 접속한 다음, frida-server 실행 파일을 실행시킨다. &amp;amp;는 백그라운드에서 실행되도록 한다. 백그라운드에서 실행되므로 셸은 바로 반환된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlqBM/dJMb990FCXv/qc7wM6plx4KmhtZdYK50m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlqBM/dJMb990FCXv/qc7wM6plx4KmhtZdYK50m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlqBM/dJMb990FCXv/qc7wM6plx4KmhtZdYK50m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlqBM%2FdJMb990FCXv%2Fqc7wM6plx4KmhtZdYK50m0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;814&quot; height=&quot;107&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;시스템에 설치된 외부 앱 목록을 확인한다. 아마 첫 번째는 저번에 다른 악성코드 분석할 때 설치한 앱이므로 두 번째 앱인 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O5Sac/dJMcafzNADq/AMrrSEqrafPojFwJ374xQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O5Sac/dJMcafzNADq/AMrrSEqrafPojFwJ374xQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O5Sac/dJMcafzNADq/AMrrSEqrafPojFwJ374xQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO5Sac%2FdJMcafzNADq%2FAMrrSEqrafPojFwJ374xQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;1061&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;1600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;frida -U -f com.eksctm.android&lt;/span&gt; 명령어를 이용해 com.eksctm.android 앱을 Frida로 실행한다. 위 사진과 같이 설치할 것인지 알림이 뜨고, install을 눌러 설치한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;1686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMd3L/dJMcafmgxiF/ExxzDtGLKhKWfb6P5A8HQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMd3L/dJMcafmgxiF/ExxzDtGLKhKWfb6P5A8HQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMd3L/dJMcafmgxiF/ExxzDtGLKhKWfb6P5A8HQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMd3L%2FdJMcafmgxiF%2FExxzDtGLKhKWfb6P5A8HQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;589&quot; height=&quot;1229&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;1686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱을 실행하면 위와 같이 권한 허용에 관해 물어본다. 모든 권한 허용을 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RG1DU/dJMcah5sqvn/1MiTqM5sTs2xgdOzoepLhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RG1DU/dJMcah5sqvn/1MiTqM5sTs2xgdOzoepLhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RG1DU/dJMcah5sqvn/1MiTqM5sTs2xgdOzoepLhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRG1DU%2FdJMcah5sqvn%2F1MiTqM5sTs2xgdOzoepLhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;1387&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;1632&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앱 내부는 위와 같이 생겼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWanKq/dJMcac36sIx/GhRzaoX983XtHc6Bk8DUMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWanKq/dJMcac36sIx/GhRzaoX983XtHc6Bk8DUMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWanKq/dJMcac36sIx/GhRzaoX983XtHc6Bk8DUMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWanKq%2FdJMcac36sIx%2FGhRzaoX983XtHc6Bk8DUMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;114&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 후, 지금 에뮬레이터 화면의 가장 맨 위에 떠 있는 앱이 무엇인지 확인하는 명령어를 입력하니 현재 실행 중인 앱의 이름이 바껴 있었다. 처음 리스트에서 com.eksctm.android는 이 본체를 안전하게 설치하기 위해 사용된 설치용 앱인 것 같고, com.racmeo.android가 이 악성코드의 본체인 것 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;adb shell dumpsys window: 안드로이드 기기 내부에 접속하여 윈도우 매니저라는 서비스가 관리하는 모든 화면 구성 정보를 텍스트 형태로 길게 출력&lt;/li&gt;
&lt;li&gt;grep -E 'mCurrentFocus|mFocusedApp': 넘겨받은 수많은 텍스트 중에서 현재 사용자가 보고 있는 창(mCurrentFocus)과 시스템이 실행 중인 앱 정보(mFocusedApp)가 포함된 줄만 골라내어 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdlyB5/dJMcabqDzrs/FPyK33NKpQIKWW1m3lKys1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdlyB5/dJMcabqDzrs/FPyK33NKpQIKWW1m3lKys1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdlyB5/dJMcabqDzrs/FPyK33NKpQIKWW1m3lKys1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdlyB5%2FdJMcabqDzrs%2FFPyK33NKpQIKWW1m3lKys1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;200&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이미 실행 중인 앱(com.racmeo.android) 내부에 Frida라는 감시 장치를 심어서, 해당 앱이 StringBuilder라는 도구를 사용하여 문자열을 합치는&amp;nbsp;순간마다 그 내용을 가로채 화면에 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(악성코드는 평소에는 단어를 쪼개서 저장하다가 프로그램이 실제로 돌아가는 순간에만 StringBuilder.append()를 사용해 조각들을 합쳐서 완성한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yysoO/dJMcaiceFN2/Kui7D32cprIeiLEvypW4A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yysoO/dJMcaiceFN2/Kui7D32cprIeiLEvypW4A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yysoO/dJMcaiceFN2/Kui7D32cprIeiLEvypW4A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyysoO%2FdJMcaiceFN2%2FKui7D32cprIeiLEvypW4A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;758&quot; data-origin-width=&quot;1338&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;에뮬레이터로 들어가 실행된 앱 입력칸에 아무값이나 입력을 하면 위와 같이 터미널에내부에서 문자열을 어떻게 조립하고 있는지 실시간으로 가로챈 결과를 보여준다. 로그는 아래와 같은 의미를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;컴포넌트 확인:&lt;/b&gt; 상단에 com.racmeo.android.MainActivity를 합치는 로그는 현재 어떤 화면이 활성화되어 있는지 기록하고 있는 것이다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;기기 정보 수집:&lt;/b&gt; 중간에 숫자 1080, 1380 같은 값들은 에뮬레이터나 스마트폰의 화면 해상도(가로/세로 크기) 정보를 가져와서 문자열로 만들고 있는 과정이다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,2,0&quot;&gt;웹뷰(WebView) 탐색:&lt;/b&gt; 로그 하단에 webview, app:id/webview 같은 단어들이 조립되는 것을 볼 수 있다. 이는 이 악성코드가 앱 내부의 웹 브라우저 화면을 통해 무언가 조작하거나, 사용자에게 가짜 페이지를 보여주려고 준비 중임을 의미한다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,3,0&quot;&gt;식별값 생성:&lt;/b&gt; c78c38c, 7f0800c6 같은 알 수 없는 코드값들도 보입니다. 이는 감염된 기기를 식별하기 위해 고유한 ID 값을 생성하거나 특정 리소스를 지칭하는 번호를 조립하는 과정이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>악성코드</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/22</guid>
      <comments>https://werty2.tistory.com/22#entry22comment</comments>
      <pubDate>Mon, 11 May 2026 00:09:23 +0900</pubDate>
    </item>
    <item>
      <title>FTK Imager 사용</title>
      <link>https://werty2.tistory.com/21</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;디스크/드라이브 불러 탐색&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;1. File &amp;gt; Add Evidence Item&lt;br /&gt;2. 넷 중 하나 선택, 여기서는 D 드라이브만 볼거라서 logical 선택&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Physical Drive (피지컬 드라이브)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드디스크/SSD 전체를 통째로 이미지&lt;/li&gt;
&lt;li&gt;파티션, 삭제된 파일, 여유 공간 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;포렌식 목적이면 대부분 이걸 선택&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Logical Drive (로지컬 드라이브)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제에서 보여주는 C:, D: 같은 드라이브 단위만 이미지&lt;/li&gt;
&lt;li&gt;삭제된 파일이나 빈 공간은 포함 안 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Image File (이미지 파일)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 디스크 이미지를 다시 불러오거나 분석할 때 선택&lt;/li&gt;
&lt;li&gt;새로 이미지를 만들 때는 다른 옵션(Physical/Logical)을 먼저 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Contents of a Folder (폴더의 컨텐츠)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 폴더 안의 파일만 이미지&lt;/li&gt;
&lt;li&gt;백업용이나 간단한 증거 수집용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;3. 해당하는 디스크 선택 후 Finish&lt;br /&gt;4. 화면 오른쪽 아래는 파일의 내용을 보여주는 Hex 값, 그 오른쪽에는 Hex 값을 해석한 ASCII 문자로 해석한 값(해석 불가능한 값은 . 으로 표시)&lt;br /&gt;5. 폴더는 메타데이터, 안에 어떤 파일/폴더가 있는지 기록한 값(디렉터리 엔트리)이 나옴&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이미지 파일 생성&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;1. File &amp;gt; Create Disk Image&lt;br /&gt;2. Physical Drive, Logical Drive, Image File, Contents of a Folder 넷 중 하나 선택 (Fernico Device는 특별한 포렌식 하드웨어가 있는 경우에만 선택)&lt;br /&gt;3. 해당하는 디스크 선택 후 Finish&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cf) 삭제 파일 확인하려면 Physical Drive를 선택해야 함.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;4. 셋 중에 필요한 것 선택, 첫 번째꺼만 선택해도 됨. 여기서는 파일이 만들어지는게 궁금해서 1,3번 체크&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Verify images after they are created&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지가 제대로 만들어졌는지 &lt;b&gt;무결성 검증&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;디스크 데이터와 이미지 파일을 비교해 &lt;b&gt;오류나 손상 여부 확인&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Precalculate Progress statistics&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 생성 중에 &lt;b&gt;진행률과 통계(몇 % 완료, 속도 등)를 미리 계산&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create directory listings of all files in the image after they are created&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 생성 후 &lt;b&gt;디스크 안의 파일 목록을 텍스트/보고서 형태로 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;5. Add 클릭 후, 넷 중에 선택, 여기서는 가장 많이 사용되는 방식인 E01 선택&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Raw (DD):
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디스크를 &lt;b&gt;있는&lt;/b&gt; 그대로 1:1 복제&lt;/li&gt;
&lt;li&gt;메타데이터나 압축 없이 순수 데이터만 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SMART:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FTK Imager에서 지원하는 자동화된 검사/추적 기능 포함 포맷&lt;/li&gt;
&lt;li&gt;보통 전문 포렌식 장비에서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;E01:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사하면서 압축/무결성 체크 가능 &amp;rarr; 안전하게 관리&lt;/li&gt;
&lt;li&gt;포렌식에서 가장 많이 사용&lt;/li&gt;
&lt;li&gt;E01 파일을 분석, 관리, 고급 기능 사용하려면 EnCase가 필요(유료)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AFF:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오픈소스 포렌식 이미지 포맷&lt;/li&gt;
&lt;li&gt;압축, 무결성 체크, 메타데이터 저장 가능&lt;/li&gt;
&lt;li&gt;이미지 만들고 분석까지 무료로 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;6. 사건 설명 적는 부분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY9TQC/dJMcaiwtLR3/C5C0KD0ypKvYkSH1daukt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY9TQC/dJMcaiwtLR3/C5C0KD0ypKvYkSH1daukt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY9TQC/dJMcaiwtLR3/C5C0KD0ypKvYkSH1daukt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY9TQC%2FdJMcaiwtLR3%2FC5C0KD0ypKvYkSH1daukt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;465&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7. 이미지를 저장할 폴더와 이미지 파일 이름 작성(확장자 제외)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(이미지 저장할 폴더는 덤프할 디스크와 같은 곳에 존재 X)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;8. Image Fragment Size: 하나의 이미지 파일을 쪼개는 크기, 0으로 설정하면 디스크 전체를 하나의 이미지 파일로 생성&lt;br /&gt;9. Compression: 압축 정도, 9에 가까울수록 용량 &lt;b&gt;&amp;darr; but&lt;/b&gt; 만드는 시간 &lt;b&gt;&amp;uarr;&lt;/b&gt;&lt;br /&gt;(여기서는 기본으로 설정된 1500, 6으로 설정)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;10. Start 클릭하면 이미지 덤프 시작&lt;br /&gt;11. 끝나면 증거의 무결성에 사용되는 해시값들을 보여줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3wIDC/dJMcabxl34m/K0DKWDRu5epCkcbsvwkWo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3wIDC/dJMcabxl34m/K0DKWDRu5epCkcbsvwkWo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3wIDC/dJMcabxl34m/K0DKWDRu5epCkcbsvwkWo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3wIDC%2FdJMcabxl34m%2FK0DKWDRu5epCkcbsvwkWo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;443&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>포렌식</category>
      <category>FTK Imager</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/21</guid>
      <comments>https://werty2.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 10 May 2026 02:33:21 +0900</pubDate>
    </item>
    <item>
      <title>PII 위험도 기준</title>
      <link>https://werty2.tistory.com/20</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보별 점수화&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;10점: 고유 식별 정보 및 민감 정보 &amp;rarr;&lt;/b&gt; 권장 조치: 업로드 차단 / 암호화 저장 / 일정 기간 내 삭제 권고 등.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;주민등록번호, 여권번호, 운전면허번호 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;8점: 금융 정보 및 생체 정보 &amp;rarr;&lt;/b&gt; 권장 조치: 업로드 차단 / 암호화 저장 / 일정 기간 내 삭제 권고 등.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;신용카드 번호, 계좌번호, 지문, 얼굴 인식 데이터 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;5점: 직접 식별 가능 정보 &amp;rarr;&lt;/b&gt; 권장 조치: 불필요한 항목 삭제, 마스킹, 최소한의 공유 범위 설정 등.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;전체 이름, 상세 주소, 휴대폰 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3점: 간접 식별 정보&lt;/b&gt; (다른 정보와 결합 시 식별 가능한 정보) &amp;rarr; 권장 조치: 보관 기간 축소, 접근 권한 최소화 등.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;IP 주소, MAC 주소, 접속 기록(로그), 쿠키&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일을 스캔할 수 없을 때 &amp;rarr; 가이드라인에 따로 경고 메시지 추가&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;암호화/비밀번호가 걸려있어서 내용을 볼 수 없는 경우
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;경고 메시지 예시) 이 파일은 암호화되어 있어 자동 검사에 실패했습니다. 민감한 개인정보가 포함되었을 수 있으므로, 꼭 필요한 경우에만 제한된 범위에서 공유하고, 불필요하다면 삭제를 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단순 미지원/손상된 파일이어서 내용을 볼 수 없는 경우
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;경고 메시지 예시) 현재 지원하지 않는 형식이거나 손상된 파일이라 자동 검사에 실패했습니다. 신뢰할 수 있는 출처인지 확인하고, 필요하지 않다면 삭제를 권장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;각 식별자 정규식 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※지문과 얼굴 인식은 정규식이 없음&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;KR_RRN&quot;: {
    &quot;label&quot;: &quot;주민등록번호&quot;,
    &quot;regex&quot;: &quot;(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01]))-[1-4][0-9]{6}&quot;,
    &quot;score&quot;: 10
  },
  &quot;PASSPORT&quot;: {
    &quot;label&quot;: &quot;여권번호&quot;,
    &quot;regex&quot;: &quot;[MS][A-Z0-9]{8,9}&quot;,
    &quot;score&quot;: 10
  },
  &quot;DRIVER_LICENSE&quot;: {
    &quot;label&quot;: &quot;운전면허번호&quot;,
    &quot;regex&quot;: &quot;[0-9]{2}-[0-9]{2}-[0-9]{6}-[0-9]{2}&quot;,
    &quot;score&quot;: 10
  },

  &quot;CREDIT_CARD&quot;: {
    &quot;label&quot;: &quot;신용카드번호&quot;,
    &quot;regex&quot;: &quot;(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2}|6(?:011|5\\\\d{2}))-?\\\\d{4}-?\\\\d{4}-?\\\\d{4}&quot;,
    &quot;score&quot;: 8
  },
  &quot;BANK_ACCOUNT&quot;: {
    &quot;label&quot;: &quot;계좌번호&quot;,
    &quot;regex&quot;: &quot;\\\\d{2,4}-?\\\\d{3,6}-?\\\\d{3,6}&quot;,
    &quot;score&quot;: 8
  },

  &quot;NAME&quot;: {
    &quot;label&quot;: &quot;이름(한글)&quot;,
    &quot;regex&quot;: &quot;(?&amp;lt;![가-힣])[가-힣]{2,4}(?![가-힣])&quot;,
    &quot;score&quot;: 5
  },
  &quot;PHONE_NUMBER&quot;: {
    &quot;label&quot;: &quot;전화번호&quot;,
    &quot;regex&quot;: &quot;(?:01[016789]-\\\\d{3,4}-\\\\d{4})|(?:0[2-8]\\\\d?-\\\\d{3,4}-\\\\d{4})&quot;,
    &quot;score&quot;: 5
  },
  &quot;ADDRESS&quot;: {
    &quot;label&quot;: &quot;주소(상세)&quot;,
    &quot;regex&quot;: &quot;(?:[가-힣0-9]+(시|도)\\\\s*[가-힣0-9]+(구|군)|[가-힣0-9]+(동|읍|면)\\\\s*\\\\d+-?\\\\d*)&quot;,
    &quot;score&quot;: 5
  },

  &quot;IP_ADDRESS&quot;: {
    &quot;label&quot;: &quot;IP 주소&quot;,
    &quot;regex&quot;: &quot;\\\\b(?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}\\\\b&quot;,
    &quot;score&quot;: 3
  },
  &quot;MAC_ADDRESS&quot;: {
    &quot;label&quot;: &quot;MAC 주소&quot;,
    &quot;regex&quot;: &quot;\\\\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\\\\b&quot;,
    &quot;score&quot;: 3
  },

  &quot;COOKIE&quot;: {
    &quot;label&quot;: &quot;쿠키 / 세션 ID&quot;,
    &quot;regex&quot;: &quot;(?i)\\\\b(?:JSESSIONID|SESSIONID|SID|SESSION_TOKEN)=([A-Za-z0-9\\\\-_]{16,})&quot;,
    &quot;score&quot;: 3
  },
  &quot;LOG_ENTRY&quot;: {
    &quot;label&quot;: &quot;접속 기록(로그)&quot;,
    &quot;regex&quot;: &quot;\\\\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\\\\s+\\\\/[^\\\\s]*\\\\s+HTTP\\\\/1\\\\.[01]\\\\b&quot;,
    &quot;score&quot;: 3
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터 형식 정의&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  // 사용자가 업로드한 파일 이름
  &quot;filename&quot;: &quot;string&quot;,

  // 파일의 MIME 타입 (예: text/plain, application/pdf 등)
  &quot;mime_type&quot;: &quot;string&quot;,

  // 스캔 상태: &quot;ok&quot; | &quot;failed&quot; | &quot;not_supported&quot;
  &quot;scan_status&quot;: &quot;ok&quot;,

  // 스캔 실패 사유 (scan_status가 &quot;failed&quot;일 때만 사용)
  // 예: &quot;encrypted&quot; | &quot;corrupted&quot; | &quot;unsupported&quot; | &quot;too_large&quot; | &quot;timeout&quot;
  &quot;fail_reason&quot;: null,

  // 전체 파일의 위험 점수 (발견된 항목들의 최대값 또는 합산값)
  // 스캔 불가 파일이면 null 또는 0으로 둘 수 있음
  &quot;overall_score&quot;: 0,

  // 점수 기반 위험 등급
  // 예: low | medium | high
  &quot;risk_level&quot;: &quot;low&quot;,

  // 발견된 개인정보 목록
  &quot;findings&quot;: [
    {
      // 개인정보 유형 코드 (엔진 내부용)
      // 예: KR_RRN(주민등록번호), CREDIT_CARD(카드 번호), PHONE_NUMBER(전화번호) 등
      &quot;type_code&quot;: &quot;KR_RRN&quot;,

      // 사람이 읽기 쉽게 표시할 라벨
      &quot;type_label&quot;: &quot;주민등록번호&quot;,

      // 민감도 점수 (10점/8점/5점/3점)
      &quot;score&quot;: 10,

      // 어떤 부분에서 발견되었는지
      // 예: &quot;content&quot; | &quot;filename&quot; | &quot;metadata&quot; | &quot;url_query&quot; 등
      &quot;location&quot;: &quot;content&quot;,

      // 마스킹 처리된 개인정보 (실제 원본을 그대로 노출하면 안 됨)
      &quot;value_preview&quot;: &quot;990101-1******&quot;,
    }
  ],

  // 점수 기반 요약 정보
  &quot;summary&quot;: {
    // 점수별 발견된 항목 개수
    &quot;score_breakdown&quot;: {
      &quot;10&quot;: 1,
      &quot;8&quot;: 0,
      &quot;5&quot;: 0,
      &quot;3&quot;: 0
    },

    // 개인정보 유형별 개수
    &quot;by_type&quot;: {
      &quot;KR_RRN&quot;: 1
    }
  }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개인정보가 발견되는 위치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일명 (업로드된 파일 이름 전체 문자열에서 개인정보 패턴을 1차로 탐지)&lt;/li&gt;
&lt;li&gt;파일 내용 (의심스러운 파일명, 확장자일 때 파일 내용 탐색)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;.csv (고객 정보, 전화번호&amp;middot;이메일 목록이 가장 자주 들어감)&lt;/li&gt;
&lt;li&gt;.xlsx / .xls (엑셀 파일: 이름&amp;middot;전화번호&amp;middot;주소 같은 개인정보를 표로 관리하는 대표 포맷)&lt;/li&gt;
&lt;li&gt;.pdf (신분증 스캔, 계약서, 민원 서류 등 민감한 자료가 매우 자주 포함됨)&lt;/li&gt;
&lt;li&gt;.txt / .doc / .docx / .hwp (자유 형식 텍스트 문서로, 메모&amp;middot;보고서&amp;middot;양식 등에서 개인정보가 섞여 있을 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;압축 파일
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;.zip / .7z / .rar / .tar / .gz (내부에 민감한 문서&amp;middot;이미지&amp;middot;엑셀 등이 통째로 들어 있어 위험도 최상위 &amp;rarr; 가능하면 압축 내부 파일까지 스캔 )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;바이오 정보 파일
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;.min (지문 정보 전용 표준 확장자)&lt;/li&gt;
&lt;li&gt;.face (얼굴 정보 전용 표준 확장자)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메타데이터 (문서 작성자, 제목, 코멘트, 태그, EXIF GPS 좌표 등 파일 메타데이터에 포함된 이름, 이메일, 전화번호, 위치 정보 등을 스캔)&lt;/li&gt;
&lt;li&gt;클라우드가 자동 생성하는 로그 (IP 주소, 계정 ID, 쿠키/세션 ID, URL 파라미터에 포함된 개인정보를 탐지)&lt;/li&gt;
&lt;li&gt;URL 또는 쿼리 파라미터에 포함되는 개인정보 (URL 경로와 쿼리 파라미터에 포함된 전화번호, 이메일, 계정 ID, 토큰 등이 있는지 검사)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;PII(개인 식별 정보) 탐지 오픈소스&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Microsoft Presidio&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;텍스트&amp;middot;이미지&amp;middot;구조화 데이터에서 이름, 전화번호, 이메일, 카드번호 같은 PII를 탐지&amp;middot;마스킹&amp;middot;익명화까지 해주는 프레임워크.&lt;/li&gt;
&lt;li&gt;Python 라이브러리로 쓸 수도 있고, Docker로 서비스 띄워서 다른 백엔드에서 API로 호출할 수도 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;깃허브 주소: &lt;a href=&quot;https://github.com/microsoft/presidio&quot;&gt;https://github.com/microsoft/presidio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Presidio 공식 웹사이트(기능 설명, 설치 방법 등): &lt;a href=&quot;https://microsoft.github.io/presidio/&quot;&gt;https://microsoft.github.io/presidio/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>과제</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/20</guid>
      <comments>https://werty2.tistory.com/20#entry20comment</comments>
      <pubDate>Thu, 7 May 2026 22:28:09 +0900</pubDate>
    </item>
    <item>
      <title>ARP Spoofing을 이용한 네트워크 내 MITM 공격 실습</title>
      <link>https://werty2.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://github.com/ndb796/JavaFX-ARP-Spoofing&quot;&gt;https://github.com/ndb796/JavaFX-ARP-Spoofing&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 깃허브 주소에 있는 JavaFX 코드를 가져와서 프로그램 구축&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 코드는 인텔리제이가 아닌 이클립스로 작성되었고 오래된 코드이기 때문에 기존 내 인텔리제이의 설정과 달라 설정 조정이 필요함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drgp9F/dJMcagemXOP/Rtkk8zpoTcoWrJiVGtV5jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drgp9F/dJMcagemXOP/Rtkk8zpoTcoWrJiVGtV5jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drgp9F/dJMcagemXOP/Rtkk8zpoTcoWrJiVGtV5jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrgp9F%2FdJMcagemXOP%2FRtkk8zpoTcoWrJiVGtV5jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;590&quot; data-origin-width=&quot;1798&quot; data-origin-height=&quot;1684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 사진과 같이 이전에는&lt;b&gt; &lt;span data-token-index=&quot;1&quot;&gt;OpenJDK 24&lt;/span&gt;&lt;/b&gt;를 사용하고 있었는데, JavaFX는 JDK에서 분리가 되어서 호환되지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvSwPS/dJMcaiJXVZ8/qxDePAP04emyjchY1eK2a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvSwPS/dJMcaiJXVZ8/qxDePAP04emyjchY1eK2a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvSwPS/dJMcaiJXVZ8/qxDePAP04emyjchY1eK2a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvSwPS%2FdJMcaiJXVZ8%2FqxDePAP04emyjchY1eK2a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;392&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위와 같이 liberica full 버전(FX 지원 포함)을 다운로드해 프로젝트에 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;※깃허브 코드가 9년 전 코드이기 때문에 버전도 그만큼 낮은 버전으로 다운로드, 여기에서는 버전 11을 적용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WIkKk/dJMcagMdLqw/mokSN7Ko5UGlYRBgxvFN10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WIkKk/dJMcagMdLqw/mokSN7Ko5UGlYRBgxvFN10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WIkKk/dJMcagMdLqw/mokSN7Ko5UGlYRBgxvFN10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWIkKk%2FdJMcagMdLqw%2FmokSN7Ko5UGlYRBgxvFN10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;450&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로젝트 설정의 modules에서 jnetpcap 항목 체크&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jnetpcap은 C/C++에서 쓰는 &lt;b&gt;패킷 캡처 표준 라이브러리&lt;/b&gt;인 ****libpcap을 Java에서 쓰게 해주는 다리 역할을 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jnetpcap 사용을 위해 C로 작성된 libpcap 소스 코드를 window용으로 컴파일한 &lt;b&gt;.dll 라이브러리&lt;/b&gt;가 필요, 깃허브 폴더에 포함되어 있음&lt;/li&gt;
&lt;li&gt;.dll 라이브러리 실행을 위해서는 Npcap 설치 필요, Npcap은 Windows 운영체제에서 libpcap API와 호환되는 네트워크 캡처 드라이버로, &lt;b&gt;커널 레벨&lt;/b&gt;에서 네트워크 인터페이스 카드(NIC)의 &lt;b&gt;패킷을 캡처&lt;/b&gt; (libpcap 구현체)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vrogY/dJMcagMdLqG/TKTZkmOOf6aejUBYycvP71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vrogY/dJMcagMdLqG/TKTZkmOOf6aejUBYycvP71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vrogY/dJMcagMdLqG/TKTZkmOOf6aejUBYycvP71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvrogY%2FdJMcagMdLqG%2FTKTZkmOOf6aejUBYycvP71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;178&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Npcap 드라이버 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로그램 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행시 보이는 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdhJ90/dJMcadu58Ne/xvBHuOTwKAQvwSYl8xgi2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdhJ90/dJMcadu58Ne/xvBHuOTwKAQvwSYl8xgi2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdhJ90/dJMcadu58Ne/xvBHuOTwKAQvwSYl8xgi2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdhJ90%2FdJMcadu58Ne%2FxvBHuOTwKAQvwSYl8xgi2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;525&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;안전한 실습을 위해서 개인 휴대폰으로 핫스팟을 켜 연결함.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;찾은 네트워크 장치 중 가상환경 등에서 사용하는 네트워크 장치가 아닌 실제 사용 중인 장치 선택(Intel(R), Wi-Fi 등의 단어 포함)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My IP: 공격자(이 노트북)의 IP&lt;/li&gt;
&lt;li&gt;Sender IP: 피해자(AP와 통신하는 또 다른 기기)의 IP&lt;/li&gt;
&lt;li&gt;Target IP: AP(핫스팟을 켠 폰)의 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 세 IP를 &lt;b&gt;arp -a&lt;/b&gt; 등의 명령어(같은 네트워크에 연결된 실제로 통신한 기기들의 ip, mac주소, 정보를 알려줌)를 통해 알아낸 뒤 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRFLSc/dJMcacXjzR0/x3t9wTSPYACRbTw0wKlWK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRFLSc/dJMcacXjzR0/x3t9wTSPYACRbTw0wKlWK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRFLSc/dJMcacXjzR0/x3t9wTSPYACRbTw0wKlWK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRFLSc%2FdJMcacXjzR0%2Fx3t9wTSPYACRbTw0wKlWK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;509&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;모두 입력 후 GET MAC 버튼을 눌러 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;1016&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctqKuK/dJMcabxkpd2/B6HfVjdsIY4QS0lQm9ulx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctqKuK/dJMcabxkpd2/B6HfVjdsIY4QS0lQm9ulx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctqKuK/dJMcabxkpd2/B6HfVjdsIY4QS0lQm9ulx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctqKuK%2FdJMcabxkpd2%2FB6HfVjdsIY4QS0lQm9ulx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;733&quot; height=&quot;498&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;1016&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행 결과&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 후 콘솔에 찍히는 ARP 프로토콜&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주기적으로 프로토콜을 보내 공격자의 MAC주소를 Sender에게는 Target의 맥주소로, Target에게는 Sender의 맥주소로 속임&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV9QLw/dJMcaaSLqI8/5bPnQpPRNtnMluPgYwQV00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV9QLw/dJMcaaSLqI8/5bPnQpPRNtnMluPgYwQV00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV9QLw/dJMcaaSLqI8/5bPnQpPRNtnMluPgYwQV00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV9QLw%2FdJMcaaSLqI8%2F5bPnQpPRNtnMluPgYwQV00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;531&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 중 와이어샤크를 이용해 Sender가 보낸 패킷(내가 보낸 패킷이 아님)이 잡히는지 확인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ip.src ==172.20.10.7&lt;/b&gt; (ip 주소가 172.20.10.7인 컴퓨터에서 전송되는 패킷만을 확인)을 입력하면, sender의 모든 인터넷 접속 패킷이 잡히는 것을 볼 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;※원래는 잡히지 않아야 할 source ip 주소의 패킷이 공격자 노트북 랜카드로 들어와 와이어샤크에 캡처됨&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2842&quot; data-origin-height=&quot;1028&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6XQ1/dJMcai4fyYz/Vy9Ckru3YOEnWnMmGlrUU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6XQ1/dJMcai4fyYz/Vy9Ckru3YOEnWnMmGlrUU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6XQ1/dJMcai4fyYz/Vy9Ckru3YOEnWnMmGlrUU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6XQ1%2FdJMcai4fyYz%2FVy9Ckru3YOEnWnMmGlrUU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;296&quot; data-origin-width=&quot;2842&quot; data-origin-height=&quot;1028&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프로그램 종료시 다시 패킷이 잡히지 않음&lt;/p&gt;</description>
      <category>네트워크</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/19</guid>
      <comments>https://werty2.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 7 May 2026 22:16:37 +0900</pubDate>
    </item>
    <item>
      <title>WebGoat A1_IDOR</title>
      <link>https://werty2.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ne5AB/dJMcaduZxUF/nSUI87RoSXxzo1449x1pb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ne5AB/dJMcaduZxUF/nSUI87RoSXxzo1449x1pb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ne5AB/dJMcaduZxUF/nSUI87RoSXxzo1449x1pb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fne5AB%2FdJMcaduZxUF%2FnSUI87RoSXxzo1449x1pb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;562&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 후 가장 첫 화면은 IDOR에 관해 설명하는 화면이 나온다. IDOR은 Insecure Direct Object References의 약자로, 웹사이트가 클라이언트의 데이터에 접근할 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 예시들과 같이 url에 사용자 정보를 그대로 받아들이고, 그 사용자에 대한 검증을 하지 않는 경우 등에 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이는 데이터를 단순히 보는 것을 넘어, 타인의 데이터를 수정하거나 삭제하는 행위로까지 확장될 수 있는 심각한 문제로 이어질 수 있기에 항상 검증을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDIe1P/dJMcaa6bzc3/9qYMiaAy3wiYY1z6G74f4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDIe1P/dJMcaa6bzc3/9qYMiaAy3wiYY1z6G74f4k/img.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;759&quot; data-is-animation=&quot;false&quot; width=&quot;618&quot; height=&quot;541&quot; data-filename=&quot;blob&quot; style=&quot;width: 48.4314%; margin-right: 10px;&quot; data-widthpercent=&quot;49&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDIe1P/dJMcaa6bzc3/9qYMiaAy3wiYY1z6G74f4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDIe1P%2FdJMcaa6bzc3%2F9qYMiaAy3wiYY1z6G74f4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ASJLc/dJMcacQrLN2/0ks0entwr8mHKtOBw1IRn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ASJLc/dJMcacQrLN2/0ks0entwr8mHKtOBw1IRn1/img.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;668&quot; data-is-animation=&quot;false&quot; width=&quot;524&quot; height=&quot;392&quot; style=&quot;width: 50.4058%;&quot; data-widthpercent=&quot;51&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ASJLc/dJMcacQrLN2/0ks0entwr8mHKtOBw1IRn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FASJLc%2FdJMcacQrLN2%2F0ks0entwr8mHKtOBw1IRn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;문제로 넘어가면 위와 같은 화면이 나온다. 위 페이지는 그냥 취약한 앱에 로그인하는 과정이다. 알려준대로 user에 tom을 적고 pass에 cat을 적으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u6llI/dJMcafzEX7m/yf5xnvrMpKfT2Y2WiasRU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u6llI/dJMcafzEX7m/yf5xnvrMpKfT2Y2WiasRU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u6llI/dJMcafzEX7m/yf5xnvrMpKfT2Y2WiasRU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu6llI%2FdJMcafzEX7m%2Fyf5xnvrMpKfT2Y2WiasRU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;389&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 페이지에는 가공되지 않은 응답 데이터와 화면에 실제로 보이는 것 사이의 차이를 살펴보는 단계이다. 화면이나 페이지에는 나타나지 않지만 서버가 보낸 원본 응답 데이터 안에는 포함되어 있는 정보를 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnesIO/dJMcafTXvMS/kKo8BUPhk9aCnvzYEe4quk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnesIO/dJMcafTXvMS/kKo8BUPhk9aCnvzYEe4quk/img.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;902&quot; data-is-animation=&quot;false&quot; width=&quot;596&quot; height=&quot;375&quot; style=&quot;width: 58.1698%; margin-right: 10px;&quot; data-widthpercent=&quot;58.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnesIO/dJMcafTXvMS/kKo8BUPhk9aCnvzYEe4quk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnesIO%2FdJMcafTXvMS%2FkKo8BUPhk9aCnvzYEe4quk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcbf1x/dJMcagZA4ib/wh86rJpoRFYpVmVbWykGUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcbf1x/dJMcagZA4ib/wh86rJpoRFYpVmVbWykGUK/img.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;1292&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.6674%;&quot; data-widthpercent=&quot;41.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcbf1x/dJMcagZA4ib/wh86rJpoRFYpVmVbWykGUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcbf1x%2FdJMcagZA4ib%2Fwh86rJpoRFYpVmVbWykGUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;1292&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;버프스위트 프록시 인터셉트를 킨 후 프로필 버튼을 누르면 요청이 잡힌다. 이 요청을 repeater로 보내 응답을 보면 response에는 role과 userId가 추가로 보이는 것을 확인할 수 있다. 입력창에 role, userId를 입력하면 성공하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qIAGx/dJMcafzE0xj/pez3h5S8pke47swEWSfUsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qIAGx/dJMcafzE0xj/pez3h5S8pke47swEWSfUsk/img.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;806&quot; data-is-animation=&quot;false&quot; width=&quot;523&quot; height=&quot;445&quot; data-widthpercent=&quot;49.43&quot; style=&quot;width: 48.8526%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qIAGx/dJMcafzE0xj/pez3h5S8pke47swEWSfUsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqIAGx%2FdJMcafzE0xj%2Fpez3h5S8pke47swEWSfUsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wiZQF/dJMcahK0GzP/4WCuw2tq6wVaHUpIPu201k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wiZQF/dJMcahK0GzP/4WCuw2tq6wVaHUpIPu201k/img.png&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;816&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.9846%;&quot; data-widthpercent=&quot;50.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wiZQF/dJMcahK0GzP/4WCuw2tq6wVaHUpIPu201k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwiZQF%2FdJMcahK0GzP%2F4WCuw2tq6wVaHUpIPu201k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음 페이지는 관리자가 각 사용자마다의 정보를 보기위해서는 /profile이라는 주소만으로는 충분하지 않고, 추가적인 정보가 필요하다고 한다. 추가될 파라미터를 찾는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 버프스위트에서 프로필 정보를 불러오는 주소가 WebGoat/IDOR/profile 이었다. 그렇다면 뒤에 각 유저의 id를 붙인다면 유저마다의 정보가 나오지 않을까 싶다. 그래서 아까 찾은 tom의 userId인 2342384를 경로 제일 뒤에 붙였다. 제출을 하니 tom의 정보가 화면에 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EKcUb/dJMcaa6bEa5/ivOgyKHk9EoYXldrpOtpvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EKcUb/dJMcaa6bEa5/ivOgyKHk9EoYXldrpOtpvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EKcUb/dJMcaa6bEa5/ivOgyKHk9EoYXldrpOtpvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEKcUb%2FdJMcaa6bEa5%2FivOgyKHk9EoYXldrpOtpvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;661&quot; height=&quot;216&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 문제는 다른 사람의 프로필을 확인하는 문제이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYIHZd/dJMcaiXojtR/T57hOeewRAYKrQgBNie6JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYIHZd/dJMcaiXojtR/T57hOeewRAYKrQgBNie6JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYIHZd/dJMcaiXojtR/T57hOeewRAYKrQgBNie6JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYIHZd%2FdJMcaiXojtR%2FT57hOeewRAYKrQgBNie6JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;347&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;repeater에서 Tom cat의 userId에서 하나씩 바꿔가며 요청을 보내보았다. Tom cat의 userId를 2342388로 올리니까 Buffalo Bill 이라는 사람의 정보가 보이면서 성공하게 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNT3r0/dJMcac3XPCD/QcbMRAQOP2VxkBcmbj4rYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNT3r0/dJMcac3XPCD/QcbMRAQOP2VxkBcmbj4rYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNT3r0/dJMcac3XPCD/QcbMRAQOP2VxkBcmbj4rYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNT3r0%2FdJMcac3XPCD%2FQcbMRAQOP2VxkBcmbj4rYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;96&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biTnxR/dJMcaaSEZhU/DX8vhHkUR3NgbFTBZRF7mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biTnxR/dJMcaaSEZhU/DX8vhHkUR3NgbFTBZRF7mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biTnxR/dJMcaaSEZhU/DX8vhHkUR3NgbFTBZRF7mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiTnxR%2FdJMcaaSEZhU%2FDX8vhHkUR3NgbFTBZRF7mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;232&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;다음 문제는 다른 사람의 프로필을 바꾸는 것이다. 문제 설명은 &lt;/span&gt;오래된 애플리케이션은 각기 다른 패턴을 따를 수도 있지만, RESTful 애플리케이션(현재 다루는 앱)은 대부분&amp;nbsp;메소드만 바꾸거나하는 방식으로 서로 다른 기능을 수행하기 때문에 메소드, 경로, 본문을 변경해 다른 사용자인 Buffalo Bill의 프로필을 수정할 수 있다고 한다. 수정 사항은 권한(role)을 더 낮은 숫자로 변경하거나, 색상(color)을 red로 변경하는 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv1wVL/dJMcaduZEyR/A7kkteBBv6zcNRhch5tvbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv1wVL/dJMcaduZEyR/A7kkteBBv6zcNRhch5tvbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv1wVL/dJMcaduZEyR/A7kkteBBv6zcNRhch5tvbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv1wVL%2FdJMcaduZEyR%2FA7kkteBBv6zcNRhch5tvbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;406&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;1032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;버프스위트의 프록시를 킨 다음 View profile 버튼을 누른 후, 받은 GET 메소드의 요청을 repeater로 보낸다. repeater에서 아까 보았던 tom의 데이터 형식인 JSON과 똑같이 JSON 형식의 Buffalo의 데이터를 뒤에 적고, color를 &quot;red&quot;, role을 1로 바꿔주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고 데이터 수정을 요청하기 위해 GET을 PUT로 바꿔주고, 데이터의 종류가 JSON 형식의 데이터라는 것을 전하기 위해 Content-Type을 application/json으로 수정해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후 Send를 눌러보니 Buffalo의 role과 color가 바뀐 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmsLXM/dJMcabRxm8t/sGCK8YkCKqtKo0XDdyVya0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmsLXM/dJMcabRxm8t/sGCK8YkCKqtKo0XDdyVya0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmsLXM/dJMcabRxm8t/sGCK8YkCKqtKo0XDdyVya0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmsLXM%2FdJMcabRxm8t%2FsGCK8YkCKqtKo0XDdyVya0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;454&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;프록시 창으로 넘어와 아까와 같이 데이터를 수정한 다음, Forward 버튼을 눌러 보내주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bspevv/dJMb99MVHZm/A0AuMvKXymXl6nIzvjgj5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bspevv/dJMb99MVHZm/A0AuMvKXymXl6nIzvjgj5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bspevv/dJMb99MVHZm/A0AuMvKXymXl6nIzvjgj5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbspevv%2FdJMb99MVHZm%2FA0AuMvKXymXl6nIzvjgj5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;307&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;정보가 성공적으로 바뀐 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Web</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/18</guid>
      <comments>https://werty2.tistory.com/18#entry18comment</comments>
      <pubDate>Tue, 28 Apr 2026 19:43:40 +0900</pubDate>
    </item>
    <item>
      <title>VirtualBox에 FreeDOS 설치</title>
      <link>https://werty2.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;예전(80년대 후반~90년대 초반) 악성코드를 분석하기 위해서는 그 시기에 자주 사용되던 운영체제인 MS-DOS를 깔아 분석을 하면 동작 흐름을 알기가 더 쉬울 것이다. FreeDOS는 MS-DOS와 호환되는 오픈소스 무료 배포 운영체제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://www.freedos.org/download/&quot;&gt;https://www.freedos.org/download/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위의 링크로 들어가&lt;span&gt; LiveCD&lt;/span&gt;를 다운받아준 후&lt;span&gt;, &lt;/span&gt;압축을 푼 뒤 그 안에 있는&lt;span&gt; iso &lt;/span&gt;파일을 버추얼박스에 넣어주었다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;버추얼박스에서 설정은 크게 건드린 부분은 없다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OesYb/dJMcad2MQ0n/hytitiEwRAnrqeaJt9tpZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OesYb/dJMcad2MQ0n/hytitiEwRAnrqeaJt9tpZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OesYb/dJMcad2MQ0n/hytitiEwRAnrqeaJt9tpZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOesYb%2FdJMcad2MQ0n%2FhytitiEwRAnrqeaJt9tpZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;240&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;위 사진에서처럼 부팅 순서를 정해주었다&lt;span&gt;. DOS &lt;/span&gt;운영체제에서는 플로피디스크를 이용한 바이러스가 많았기 때문에 플로피도 마지막 순서에 넣어주었다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhFCVE/dJMcab41bQk/0omISUDuIkJJMXKT1uksyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhFCVE/dJMcab41bQk/0omISUDuIkJJMXKT1uksyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhFCVE/dJMcab41bQk/0omISUDuIkJJMXKT1uksyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhFCVE%2FdJMcab41bQk%2F0omISUDuIkJJMXKT1uksyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;258&quot; height=&quot;60&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그리고&lt;span&gt; iso &lt;/span&gt;파일 설치가 모두 끝난 후&lt;span&gt;, CD-ROM &lt;/span&gt;드라이브에서&lt;span&gt; iso &lt;/span&gt;파일을 뺀다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WHSv0/dJMcafTTXK6/DWqjWRy2SgqUpI0GyOuHL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WHSv0/dJMcafTTXK6/DWqjWRy2SgqUpI0GyOuHL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WHSv0/dJMcafTTXK6/DWqjWRy2SgqUpI0GyOuHL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWHSv0%2FdJMcafTTXK6%2FDWqjWRy2SgqUpI0GyOuHL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;403&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치를 모두 하고&lt;span&gt; reboot &lt;/span&gt;해주면 위와 같은 화면이 나온다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYNNSx/dJMcabKLg8z/OyEB2Kfv6MzlB18FG759e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYNNSx/dJMcabKLg8z/OyEB2Kfv6MzlB18FG759e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYNNSx/dJMcabKLg8z/OyEB2Kfv6MzlB18FG759e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYNNSx%2FdJMcabKLg8z%2FOyEB2Kfv6MzlB18FG759e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;458&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치 후&lt;span&gt; dir 명령어&lt;/span&gt;로 하드디스크&lt;span&gt;(C:)&lt;/span&gt;에 있는 파일들을 볼 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYxQEM/dJMcabKLg9D/c5kkhwdiyoWF1yH4OkSUB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYxQEM/dJMcabKLg9D/c5kkhwdiyoWF1yH4OkSUB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYxQEM/dJMcabKLg9D/c5kkhwdiyoWF1yH4OkSUB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYxQEM%2FdJMcabKLg9D%2Fc5kkhwdiyoWF1yH4OkSUB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;298&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;debug &lt;/span&gt;기능을 통해 어셈블리 코드를 메모리에 바로 입력해서 실행할 수 있다&lt;span&gt;. &lt;/span&gt;위 사진에서는&lt;span&gt; int 21&lt;/span&gt;을 통해&lt;span&gt; dl&lt;/span&gt;에 있는 값을 읽어서 출력하는 간단한 프로그램을 만들어 본 화면이다&lt;span&gt;. &lt;/span&gt;명령어&lt;span&gt; g&lt;/span&gt;를 통해 프로그램을 실행해보니&lt;span&gt; A(&lt;/span&gt;아스키코드&lt;span&gt; 41)&lt;/span&gt;가 화면에 잘 출력되는 것을 확인할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3jou6/dJMcaiiLBlA/Kk9ygmupNSK4kUwvfBrOb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3jou6/dJMcaiiLBlA/Kk9ygmupNSK4kUwvfBrOb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3jou6/dJMcaiiLBlA/Kk9ygmupNSK4kUwvfBrOb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3jou6%2FdJMcaiiLBlA%2FKk9ygmupNSK4kUwvfBrOb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;276&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;또한 현재 메모리의 특정 주소에 어떤 데이터가 있는지&lt;span&gt; 16&lt;/span&gt;진수로 확인할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;debug&lt;/span&gt;를 쓰면 바이러스 분석 시&lt;span&gt;, &lt;/span&gt;메모리의 어느 주소에 바이러스가 숨어있는지&lt;span&gt;, &lt;/span&gt;인터럽트 주소가 정말로 바뀌었는지를 눈으로 직접 확인할 수 있기 때문에 자주 사용될 거 같다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;debug&lt;/span&gt;에서 나와서(q -&amp;gt; 엔터)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/burXk4/dJMcajonhk6/8ETr7YxPCOKPZGFLtJScy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/burXk4/dJMcajonhk6/8ETr7YxPCOKPZGFLtJScy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/burXk4/dJMcajonhk6/8ETr7YxPCOKPZGFLtJScy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FburXk4%2FdJMcajonhk6%2F8ETr7YxPCOKPZGFLtJScy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;492&quot; data-origin-width=&quot;1344&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;edit&lt;/span&gt;을 입력해 새 파일을 만들면 위와 같이 텍스트 에디터도 잘 나온다&lt;span&gt;. &lt;/span&gt;이 곳에서 원하는 코드를 짜고, 컴파일어나 어셈블러를 이용해 실행 파일로 바꿔줄 수 있다.&lt;/p&gt;</description>
      <category>시스템</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/17</guid>
      <comments>https://werty2.tistory.com/17#entry17comment</comments>
      <pubDate>Thu, 23 Apr 2026 17:25:18 +0900</pubDate>
    </item>
    <item>
      <title>4주차_학습용 악성코드 동적분석</title>
      <link>https://werty2.tistory.com/16</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;이번 주에 한 일&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;syssecApp.apk 동적 분석_Frida이용(아래 보고서 링크에서 확인할 수 있다.)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.exploit-db.com/docs/english/33093-introduction-to-android-malware-analysis.pdf&quot;&gt;https://www.exploit-db.com/docs/english/33093-introduction-to-android-malware-analysis.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-size: 1.12em; color: #333333; letter-spacing: 0px;&quot;&gt;Android studio&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기존에 설치한 안드로이드 스튜디오에서 frida와 adb 설정을 해 준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일단 먼저 frida-tools를 깔아준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1520&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4WeqN/dJMcac3CPAH/3ty0dZyG5jrgBDX9GWwM6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4WeqN/dJMcac3CPAH/3ty0dZyG5jrgBDX9GWwM6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4WeqN/dJMcac3CPAH/3ty0dZyG5jrgBDX9GWwM6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4WeqN%2FdJMcac3CPAH%2F3ty0dZyG5jrgBDX9GWwM6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;640&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 다음 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;frida-server가 설치된 폴더로 들어가&lt;/span&gt; 안드로이드 에뮬레이터 안에 윈도우의 frida-server 실행파일을 복사하기 위해 adb push 명령어를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;복사하여 안에 들어간 파일이 실행 가능한 권한을 가질 수 있도록 chmod 명령어로 권한을 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btdwhW/dJMcaa5RTAh/k8l25wsTfAy8gk0yHCOCs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btdwhW/dJMcaa5RTAh/k8l25wsTfAy8gk0yHCOCs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btdwhW/dJMcaa5RTAh/k8l25wsTfAy8gk0yHCOCs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtdwhW%2FdJMcaa5RTAh%2Fk8l25wsTfAy8gk0yHCOCs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;125&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 후, adb root 명령어를 이용해 관리자 권한을 얻어야 한다. 왜냐하면 안드로이드 에뮬레이터는 기본적으로 일반 사용자 모드이기 때문에 분석을 하려면 관리자 권한이 필요하다. 처음에 관리가 권한 없이 에뮬레이터 안에서 frida 서버를 실행하려고 하니 거부된 것이 아래 사진의 첫 번째 명령어 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;adb shell &quot;/data/local/tmp/frida-server&quot; &lt;/span&gt; 이 코드는 frida-server를 에뮬레이터 안에서 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;frida-server는 안드로이드 안에서의 정보를 윈도우로 보내주어 실시간 흐름을 감시할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSKgll/dJMcadOZr2D/jtvwpFZDQuECisZNosvkc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSKgll/dJMcadOZr2D/jtvwpFZDQuECisZNosvkc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSKgll/dJMcadOZr2D/jtvwpFZDQuECisZNosvkc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSKgll%2FdJMcadOZr2D%2FjtvwpFZDQuECisZNosvkc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;189&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1441&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;실행 후, &lt;span style=&quot;background-color: #dddddd;&quot;&gt;frida-ps -U&lt;/span&gt; 명령어를 통해 에뮬레이터 안에서 실행 중인 프로세스들을 아래 사진과 같이 윈도우에서 볼 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;1546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHk5l7/dJMcaiW5frt/K8QXzSlkxEmK7NhQbDJVZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHk5l7/dJMcaiW5frt/K8QXzSlkxEmK7NhQbDJVZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHk5l7/dJMcaiW5frt/K8QXzSlkxEmK7NhQbDJVZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHk5l7%2FdJMcaiW5frt%2FK8QXzSlkxEmK7NhQbDJVZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;642&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1349&quot; data-origin-height=&quot;1546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그 다음 보고서 안에 있는 링크를 타고 들어가 아래 사진의 악성코드를 다운로드 받아준다. 아래 사진에서 밑쪽을 향하는 화살표 모양을 누르면 설치가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyuPL/dJMcacbxDdf/CRRkkvQCLs0plgSDdOxTR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyuPL/dJMcacbxDdf/CRRkkvQCLs0plgSDdOxTR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyuPL/dJMcacbxDdf/CRRkkvQCLs0plgSDdOxTR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkyuPL%2FdJMcacbxDdf%2FCRRkkvQCLs0plgSDdOxTR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;408&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;설치를 하고 앱을 바로 열어보면 일반적인 게임 앱이 필요한 권한이라기에는 많아보이는 권한 접근 허용을 요구한다. 사진에서 보면 문자, 연락처, 위치, 캘린터, 전화, 통화기록으로의 접근 허용을 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;기본적으로 모두 허용이 된 상태에서 사용자에게 허용/거부 여부를 물어보기 때문에 일반 사용자들이 게임인줄 알고 큰 생각없이 continue 버튼을 쉽게 누를 수도 있겠다는 생각이 들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;1517&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CSG16/dJMcaargTSw/KXQVNxoojkKByBWHqiPvjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CSG16/dJMcaargTSw/KXQVNxoojkKByBWHqiPvjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CSG16/dJMcaargTSw/KXQVNxoojkKByBWHqiPvjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCSG16%2FdJMcaargTSw%2FKXQVNxoojkKByBWHqiPvjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;832&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;1517&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;게임 화면 안으로 들어가면 아래 사진과 같이 알림창이 나온다. 이 앱이 지금 안드로이트 에뮬레이터 버전보다 더 낮은 버전에서 만들어져서 적절하게 돌아가지 않을 것이라고 한다. 이거까지 감안을 해서 일부러 안드로이드 12.0 버전의 에뮬레이터를 설치했는데 더 낮은 버전으로 설치했어야 했나보다.. 다음 실습에서는 더 낮은 버전의 에뮬레이터를 다시 설치해 이 앱을 실행해 봐야할 것 같다. (참고로 현재(2026-04-02 기준) 안드로이드의 가장 최신 버전은 16이다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KgyYI/dJMcacWTJsT/dEqiVruGkkfeMyQkhRL9Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KgyYI/dJMcacWTJsT/dEqiVruGkkfeMyQkhRL9Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KgyYI/dJMcacWTJsT/dEqiVruGkkfeMyQkhRL9Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKgyYI%2FdJMcacWTJsT%2FdEqiVruGkkfeMyQkhRL9Lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;786&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;OK를 누르고 앱 안으로 들어가면 아래 사진과 같이 화면 비율이 이상한 미로찾기 게임이 나온다. 버전이 안맞아서 그런지 누르면 하얀 점이 움직이기는 하는데 딱히 컨트롤을 할 수는 없었다. 아무래도 버전 차이 때문에 화면이나 컨트롤이나 잘 맞지 않은 것 같다. 하지만 중요한건 게임화면이 아니다!!!!!!!!!!!!!!!!!!!!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdDgVg/dJMcab4LzRM/O9vZnrok4wxP4EmfEK1K9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdDgVg/dJMcab4LzRM/O9vZnrok4wxP4EmfEK1K9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdDgVg/dJMcab4LzRM/O9vZnrok4wxP4EmfEK1K9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdDgVg%2FdJMcab4LzRM%2FO9vZnrok4wxP4EmfEK1K9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;455&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;게임을 실행한 후, 호스트 윈도우 cmd창에서 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;adb logcat&lt;/span&gt;을 입력해주면 adb를 통해 에뮬레이터에서 발생하는 모든 로그를 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;아래 사진과 같이 단말기 식별 정보를 가져오는 것은 거부되었지만, 문자나 통화기록(clog), 브라우저 북마크(bbookmarks), 브라우저 검색기록(bsearches), 위치정보(geocoord)등을 수집하고 서버로 보내는 것에 대한 로그가 보인다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/35Ie7/dJMcaipiPx1/3uFN1KubW4jJ6uNQztXrO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/35Ie7/dJMcaipiPx1/3uFN1KubW4jJ6uNQztXrO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/35Ie7/dJMcaipiPx1/3uFN1KubW4jJ6uNQztXrO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F35Ie7%2FdJMcaipiPx1%2F3uFN1KubW4jJ6uNQztXrO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2692&quot; height=&quot;607&quot; data-origin-width=&quot;2692&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;에뮬레이터 환경에는 연락처나 일정과 같은 것이 아무것도 없어서 이런 정보들은 모드 SKIPPING하였고, 위치 정보를 수집해 서버로 보내고 있다. 아래 사진의 마지막에 반복되는 timestamp에 따른 위도와 경도를 통해 사용자의 실시간 위치를 수집할 수 있다. (아래 사진에 있는 위치 정보는 내 위치 정보다........... 개인정보 무료공개 합니다^^7)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;962&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAIONQ/dJMcaiiwcya/cQxF8rFBDWRCKKIKyQoYyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAIONQ/dJMcaiiwcya/cQxF8rFBDWRCKKIKyQoYyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAIONQ/dJMcaiiwcya/cQxF8rFBDWRCKKIKyQoYyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAIONQ%2FdJMcaiiwcya%2FcQxF8rFBDWRCKKIKyQoYyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2879&quot; height=&quot;962&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;다음에는 본격적으로 악성코드가 악성 내용을 보내는 주소인 127.0.0.1:53471 서버를 만들고 열어서 이곳으로 보내지는 사용자의 개인정보들을 직접 확인해볼 것 이다.&lt;/p&gt;</description>
      <category>악성코드</category>
      <author>werty2</author>
      <guid isPermaLink="true">https://werty2.tistory.com/16</guid>
      <comments>https://werty2.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 2 Apr 2026 22:53:25 +0900</pubDate>
    </item>
  </channel>
</rss>