{"id":42,"date":"2026-04-14T15:15:43","date_gmt":"2026-04-14T07:15:43","guid":{"rendered":"https:\/\/www.seekinthevortex.cn\/?p=42"},"modified":"2026-04-14T15:15:43","modified_gmt":"2026-04-14T07:15:43","slug":"sunshine-ctf-2","status":"publish","type":"post","link":"https:\/\/www.seekinthevortex.cn\/index.php\/2026\/04\/14\/sunshine-ctf-2\/","title":{"rendered":"sunshine CTF"},"content":{"rendered":"<p>\u66f4\u65b0\u4e2d&#8230;<\/p>\n<h1>Pluto Chat<\/h1>\n<h2>\u7a0b\u5e8f\u5206\u6790<\/h2>\n<p>\u9996\u5148\u770b\u5230main\u51fd\u6570<\/p>\n<pre><code class=\"language-cpp\">void __fastcall __noreturn main(int a1, char **a2, char **a3)\n{\n    sockaddr addr; \/\/ [rsp+20h] [rbp-220h] BYREF\n    char s_1[256]; \/\/ [rsp+30h] [rbp-210h] BYREF\n    char s[268]; \/\/ [rsp+130h] [rbp-110h] BYREF\n    int fd; \/\/ [rsp+23Ch] [rbp-4h]\n\n    puts(&quot;Login to PlutoChat&quot;);\n    printf(&quot;Username: &quot;);\n    fgets(s, 256, stdin);\n    printf(&quot;Password: &quot;);\n    fgets(s_1, 256, stdin);\n    fd = socket(2, 1, 0);                       \/\/ \u521b\u5efa\u4e00\u4e2aipv4\u5957\u63a5\u5b57,\u7c7b\u578b\u662f\u6d41\u5f0f\u5957\u63a5\u5b57\n    if ( fd == -1 )\n    {\n        puts(&quot;Could not connect to PlutoChat servers. Try again later!&quot;);\n        exit(0);\n    }\n    addr.sa_family = 2;\n    *&amp;addr.sa_data[6] = 0LL;\n    *&amp;addr.sa_data[2] = inet_addr(&quot;127.0.0.1&quot;);\n    *addr.sa_data = htons(31337u);\n    if ( connect(fd, &amp;addr, 0x10u) )\n    {\n        puts(&quot;Could not connect to PlutoChat servers. Try again later!&quot;);\n        exit(0);\n    }\n    sub_555555555CD7(fd);\n    sub_55555555589A(fd, s, s_1);\n    while ( !dword_55555555822C )\n        usleep(0x186A0u);\n    sub_5555555559E3(fd);\n}\n<\/code><\/pre>\n<p>\u53d1\u73b0\u4e86\u5173\u952e\u7684\u51fd\u6570socket,\u518d\u7ed3\u5408\u4e0b\u9762\u7684\u5185\u5bb9,\u53ef\u4ee5\u731c\u6d4b\u5230\u7a0b\u5e8f\u662f\u4e00\u4e2a\u5ba2\u6237\u7aef\u7a0b\u5e8f,\u4f1a\u901a\u8fc7127.0.0.1:31337\u548c\u670d\u52a1\u7aef\u7a0b\u5e8f\u901a\u4fe1<\/p>\n<pre><code class=\"language-cpp\">\tfd = socket(2, 1, 0)\n\t\n    addr.sa_family = 2;\n    *&amp;addr.sa_data[6] = 0LL;\n    *&amp;addr.sa_data[2] = inet_addr(&quot;127.0.0.1&quot;);\n    *addr.sa_data = htons(31337u);\n<\/code><\/pre>\n<h3>\u4e09\u4e2a\u5173\u952e\u51fd\u6570\u5206\u6790<\/h3>\n<p>\u4e4b\u540e\u6211\u4eec\u7ee7\u7eed\u8ddf\u8e2a\u4e00\u4e0b\u4e09\u4e2a\u5173\u952e\u51fd\u6570<\/p>\n<pre><code class=\"language-cpp\">    sub_555555555CD7(fd);\n    sub_55555555589A(fd, s, s_1);\n    while ( !dword_55555555822C )\n        usleep(0x186A0u);\n    sub_5555555559E3(fd);\n<\/code><\/pre>\n<h4>\u51fd\u6570CD7<\/h4>\n<p>\u5148\u5206\u6790\u7b2c\u4e00\u4e2aCD7\u51fd\u6570<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003153551.png\" alt=\"image.png\"><\/p>\n<p>\u53ef\u4ee5\u53d1\u73b0\u8fd9\u91cc\u542f\u52a8\u4e86\u4e00\u4e2a\u7ebf\u7a0b,\u6211\u4eec\u7ee7\u7eed\u8ddf\u8e2a\u89c2\u5bdf,\u53ef\u4ee5\u53d1\u73b0\u8fd9\u4e2a\u7ebf\u7a0b\u4e00\u81f4\u518d\u5faa\u73af\u542f\u52a8\u4e00\u4e2a\u51fd\u6570<\/p>\n<pre><code class=\"language-cpp\">void __fastcall __noreturn start_routine(unsigned int *a1)\n{\n    unsigned int i; \/\/ [rsp+14h] [rbp-Ch]\n\n    for ( i = *a1; ; main_func(i) );\n}\n<\/code><\/pre>\n<p>\u7ee7\u7eed\u8ddf\u8e2a,\u6211\u4eec\u53d1\u73b0main_func\u4e2d\u4e00\u76f4\u518d\u8c03\u7528read\u51fd\u6570\u901a\u8fc7fd\u8bfb\u5165\u670d\u52a1\u7aef\u53d1\u56de\u7684\u4fe1\u606f,\u5982\u679c\u6821\u9a8c\u901a\u8fc7,\u5c31\u4f1a\u8f93\u51faLogin Successful\u7684\u9a8c\u8bc1\u4fe1\u606f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003153931.png\" alt=\"image.png\"><\/p>\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u6765\u5206\u6790\u4e00\u4e0b\u6821\u9a8c\u7684\u6d41\u7a0b,\u9996\u5148\u5206\u6790\u4e00\u4e0binit_sbox\u51fd\u6570<br \/>\n\u53d1\u73b0\u5728return\u4e4b\u524d\u90fd\u662f\u5bf9key\u8fdb\u884c\u6df7\u6dc6,\u4e8e\u662f\u6211\u4eec\u7ee7\u7eed\u8ddf\u8e2areturn\u7684\u51fd\u6570<\/p>\n<pre><code class=\"language-cpp\">_BYTE *__fastcall init_sbox(_BYTE *sbox, unsigned int key_in)\n{\n    int v4; \/\/ [rsp+18h] [rbp-28h]\n    _DWORD *key; \/\/ [rsp+28h] [rbp-18h]\n    int k; \/\/ [rsp+30h] [rbp-10h]\n    int j; \/\/ [rsp+34h] [rbp-Ch]\n    int i; \/\/ [rsp+38h] [rbp-8h]\n    char v9; \/\/ [rsp+3Fh] [rbp-1h]\n\n    key = malloc(0x50uLL);\n    malloc(0x100uLL);\n    for ( i = 0; i &lt;= 19; ++i )\n    {\n        key[i] = key_in;\n        key_in = _ROL4___w(key_in, key_in &amp; 0xF);\n    }\n    for ( j = 0; j &lt;= 19; ++j )\n    {\n        v4 = key[j];\n        key[j] = key[byte0[j]];\n        key[byte0[j]] = v4;\n    }\n    for ( k = 0; k &lt;= 79; ++k )\n    {\n        *(key + k) = v9 ^ byte1[*(key + k)];\n        v9 = *(key + k);\n    }\n    return RC4_KSA(sbox, key, 0x50uLL);\n}\n<\/code><\/pre>\n<p>\u4ece\u8fd9\u91cc\u6211\u4eec\u5c31\u53ef\u4ee5\u5f88\u660e\u663e\u770b\u51fa\u6765\u8fd9\u4e2a\u51fd\u6570\u7684RC4\u7279\u5f81\u4e86<\/p>\n<pre><code class=\"language-cpp\">_BYTE *__fastcall RC4_KSA(_BYTE *sbox, __int64 key, unsigned __int64 keylen)\n{\n    _BYTE *newbuffer_1; \/\/ rax\n    __int64 newc; \/\/ [rsp+20h] [rbp-18h]\n    unsigned __int64 idx; \/\/ [rsp+28h] [rbp-10h]\n    unsigned __int64 i; \/\/ [rsp+30h] [rbp-8h]\n\n    *sbox = 0;\n    newbuffer_1 = sbox;\n    sbox[1] = 0;\n    for ( i = 0LL; i &lt;= 0xFF; ++i ) \/\/ \u8fd9\u91cc\u662f\u521d\u59cb\u5316sbox\n    {\n        newbuffer_1 = &amp;sbox[i + 2];\n        *newbuffer_1 = i;\n    }\n    idx = 0LL;\n    LOBYTE(newc) = 0;\n    while ( idx &lt;= 0xFF ) \/\/ \u8fd9\u91cc\u662fKSA\u5b9e\u73b0\n    {\n        newc = (sbox[idx + 2] + newc + *(idx % keylen + key));\n        newbuffer_1 = swap(sbox, idx++, newc);\n    }\n    return newbuffer_1;\n}\n<\/code><\/pre>\n<p>\u8fd9\u91cc\u662f\u6807\u51c6\u7684RC4\u5b9e\u73b0,\u901a\u8fc7\u5bf9\u6bd4\u53ef\u4ee5\u7406\u89e3\u4e0a\u9762\u4ee3\u7801sbox\u5e94\u8be5\u662f\u4ecesbox[2]\u7d22\u5f15\u5f00\u59cb\u8ba1\u7b97\u7684<\/p>\n<pre><code class=\"language-python\">def KSA(key):\n    &quot;&quot;&quot; KSA \u5bc6\u94a5\u62d3\u5c55 &quot;&quot;&quot;\n    S = list(range(256))\n    j = 0\n    for i in range(256):\n        j = (j + S[i] + key[i % len(key)]) % 256\n        S[i], S[j] = S[j], S[i]\n    return S\n \ndef PRGA(S):\n    &quot;&quot;&quot; PRGA &quot;&quot;&quot;\n    i, j = 0, 0\n    while True:\n        i = (i + 1) % 256\n        j = (j + S[i]) % 256\n        S[i], S[j] = S[j], S[i]\n        K = S[(S[i] + S[j]) % 256]\n        yield K\n<\/code><\/pre>\n<p>\u56de\u5230\u5148\u524d\u7684\u5730\u65b9\u5206\u67905452\u51fd\u6570.\u7531\u4e8e\u6211\u4eec\u660e\u767d\u4e86\u8fd9\u4e2a\u662fRC4\u52a0\u5bc6,\u6240\u4ee5\u8fd9\u91cc\u4e5f\u5f88\u6e05\u6670\u4e86,\u51fd\u657052e5\u660e\u663e\u5c31\u662fRC4\u7684PRGA\u5b9e\u73b0.<br \/>\n\u6240\u4ee5\u8fd9\u4e2a\u51fd\u6570\u7684\u4f5c\u7528\u5c31\u662f,\u8bfb\u5165\u670d\u52a1\u5668\u8fd4\u56de\u7684\u6570\u636e\u5e76\u89e3\u7801.<\/p>\n<pre><code class=\"language-cpp\">void __fastcall sub_555555555452(\n        unsigned __int8 *newbuffer,\n        unsigned __int8 *buf,\n        unsigned __int8 *p_check_flag,\n        unsigned __int64 nbytes)\n{\n    unsigned __int8 v4; \/\/ bl\n    unsigned __int64 i; \/\/ [rsp+28h] [rbp-10h]\n\n    if ( nbytes )\n    {\n        for ( i = 0LL; i &lt; nbytes; ++i )\n        {\n            v4 = buf[i];\n            p_check_flag[i] = v4 ^ sub_5555555552E5(newbuffer);\n        }\n    }\n}\n\n__int64 __fastcall sub_5555555552E5(unsigned __int8 *p_idx)\n{\n    p_idx[1] += p_idx[++*p_idx + 2];\n    swap(p_idx, *p_idx, p_idx[1]);\n    return p_idx[(p_idx[*p_idx + 2] + p_idx[p_idx[1] + 2]) + 2];\n\n}\n<\/code><\/pre>\n<p>\u90a3\u4e48\u6211\u4eec\u5c31\u77e5\u9053\u4e86\u7b2c\u4e00\u4e2a\u51fd\u6570\u662f\u7528\u6765\u4ece\u670d\u52a1\u5668\u5f97\u5230\u8fd4\u56de\u7684\u5b57\u7b26\u4e32\u89e3\u5bc6\u6821\u9a8c,\u5e76\u8f93\u51fa\u5bf9\u5e94\u7684\u72b6\u6001.<\/p>\n<h4>\u51fd\u657089a<\/h4>\n<p>\u73b0\u5728\u5206\u679089a\u51fd\u6570,\u53ef\u4ee5\u53d1\u73b0\u8fd9\u4e2a\u51fd\u6570\u5c31\u662f\u5c06\u6211\u4eec\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u6574\u7406\u52a0\u5bc6\u540e\u53d1\u7ed9\u4e86\u670d\u52a1\u7aef<br \/>\n\u503c\u5f97\u6ce8\u610f\u7684\u662fsub_555555555687()\u8fd4\u56de\u4e86\u4e00\u4e2a48\u4f4d\u7684\u968f\u673a\u6570\u4f5c\u4e3a\u5bc6\u94a5\u52a0\u5bc6\u6570\u636e.<\/p>\n<pre><code class=\"language-cpp\">ssize_t __fastcall sub_55555555589A(int fd, char **name, char *password)\n{\n    unsigned __int8 *buf; \/\/ [rsp+20h] [rbp-10h]\n    unsigned __int8 n_1; \/\/ [rsp+2Eh] [rbp-2h]\n    unsigned __int8 n; \/\/ [rsp+2Fh] [rbp-1h]\n\n    n = strlen(name);\n    if ( n &amp;&amp; *(name + n - 1) == 10 )\n        *(name + --n) = 0;\n    n_1 = strlen(password);\n    if ( n_1 &amp;&amp; password[n_1 - 1] == 10 )\n        password[--n_1] = 0;\n    buf = malloc(n_1 + n + 3);\n    *buf = 0;\n    buf[1] = n;\n    memcpy(buf + 2, name, n);\n    buf[n + 2] = n_1;\n    memcpy(&amp;buf[n + 3], password, n_1);\n    return sub_5555555556A7(fd, buf, n_1 + n + 3);\n}\n\nssize_t __fastcall send_encypt(int fd, unsigned __int8 *data, unsigned __int64 data_len)\n{\n    unsigned __int8 *newbuffer; \/\/ [rsp+28h] [rbp-18h]\n    unsigned int key; \/\/ [rsp+34h] [rbp-Ch]\n    void *buf; \/\/ [rsp+38h] [rbp-8h]\n\n    buf = malloc(data_len + 8);\n    key = init_key();\n    *buf = key;\n    *(buf + 1) = data_len;\n    newbuffer = malloc(0x102uLL);\n    sbox_KSA(newbuffer, key);\n    RC4(newbuffer, data, buf + 8, data_len);\n    return send(fd, buf, data_len + 8, 0);\n}\n\n__int64 sub_555555555687()\n{\n    int v0; \/\/ ebx\n\n    v0 = rand() &lt;&lt; 16;\n    return v0 | rand();\n}\n<\/code><\/pre>\n<h4>\u51fd\u6570sub_5555555559E3()<\/h4>\n<p>\u8fd9\u4e2a\u51fd\u6570\u4e5f\u5c31\u662f\u4e0d\u65ad\u8bfb\u5165\u7528\u6237\u8f93\u5165,\u5e76\u52a0\u5bc6\u53d1\u9001\u7ed9\u670d\u52a1\u7aef<\/p>\n<pre><code class=\"language-cpp\">void __fastcall __noreturn sub_5555555559E3(unsigned int fd)\n{\n    char s1[256]; \/\/ [rsp+10h] [rbp-200h] BYREF\n    char s[256]; \/\/ [rsp+110h] [rbp-100h] BYREF\n\n    while ( 1 )\n    {\n        printf(&quot;Type a username to send a message to, or 'EXIT' to exit: &quot;);\n        fgets(s, 256, stdin);\n        if ( !strcmp(s, &quot;EXIT&quot;) )\n            break;\n        while ( 1 )\n        {\n            printf(&quot;Send a message to %s (or 'EXIT' to select a new user): &quot;, s);\n            fgets(s1, 256, stdin);\n            if ( !strcmp(s1, &quot;EXIT&quot;) )\n                break;\n            sub_555555555751(fd, s, s1);\n        }\n    }\n    puts(&quot;Exiting PlutoChat...&quot;);\n    exit(0);\n}\n\nssize_t __fastcall sub_555555555751(int fd, char *s, char *s1)\n{\n    unsigned __int8 *buf; \/\/ [rsp+20h] [rbp-10h]\n    unsigned __int8 n_1; \/\/ [rsp+2Eh] [rbp-2h]\n    unsigned __int8 n; \/\/ [rsp+2Fh] [rbp-1h]\n\n    n = strlen(s);\n    if ( n &amp;&amp; s[n - 1] == 10 )\n        s[--n] = 0;\n    n_1 = strlen(s1);\n    if ( n_1 &amp;&amp; s1[n_1 - 1] == 10 )\n        s1[--n_1] = 0;\n    buf = malloc(n_1 + n + 3);\n    *buf = 2;\n    buf[1] = n;\n    memcpy(buf + 2, s, n);\n    buf[n + 2] = n_1;\n    memcpy(&amp;buf[n + 3], s1, n_1);\n    return sub_5555555556A7(fd, buf, n_1 + n + 3);\n}\n<\/code><\/pre>\n<h2>\u89e3\u5bc6\u6d41\u7a0b<\/h2>\n<h3>\u89e3\u6cd51<\/h3>\n<p>\u6240\u4ee5\u8fd9\u4e2a\u7a0b\u5e8f\u5927\u81f4\u7684\u6d41\u7a0b\u5c31\u662f<\/p>\n<blockquote>\n<p>[!\u5927\u81f4\u6d41\u7a0b]<br \/>\n\u5ba2\u6237\u7aef\u52a0\u5bc6 &lt;-&gt; \u53d1\u9001 &lt;-&gt; \u670d\u52a1\u7aef\u89e3\u5bc6<\/p>\n<\/blockquote>\n<p>\u6211\u4eec\u518d\u4ed4\u7ec6\u89c2\u5bdf\u8fd9\u4e2a\u4e24\u4e2a\u51fd\u6570,\u6211\u4eec\u5f88\u5bb9\u6613\u53d1\u73b0\u5728\u89e3\u7801\u6d88\u606f\u7684\u65f6\u5019,\u6211\u4eec\u7684\u51fd\u6570\u4f1a\u53d6\u51fa\u7f16\u7801\u5728\u6d88\u606f\u5f00\u5934\u7684key\u548clen\u518d\u8fdb\u884c\u89e3\u7801,\u53c8\u7531\u4e8eRC4\u662f\u5bf9\u79f0\u52a0\u5bc6,\u6240\u4ee5\u6211\u4eec\u53ea\u9700\u8981\u5c06\u4e00\u6837\u7684\u6570\u636e\u53d1\u9001\u7ed9\u670d\u52a1\u5c31\u53ef\u4ee5\u5f97\u5230\u89e3\u5bc6\u4e4b\u540e\u7684\u6587\u672c\u4e86.<\/p>\n<pre><code class=\"language-cpp\">ssize_t __fastcall send_encypt(int fd, unsigned __int8 *data, unsigned __int64 data_len)\n{\n    unsigned __int8 *newbuffer; \/\/ [rsp+28h] [rbp-18h]\n    unsigned int key; \/\/ [rsp+34h] [rbp-Ch]\n    void *buf; \/\/ [rsp+38h] [rbp-8h]\n\n    buf = malloc(data_len + 8);\n    key = init_key();\n    *buf = key;\n    *(buf + 1) = data_len;\n    newbuffer = malloc(0x102uLL);\n    sbox_KSA(newbuffer, key);\n    RC4(newbuffer, data, buf + 8, data_len);\n    return send(fd, buf, data_len + 8, 0);\n}\n<\/code><\/pre>\n<pre><code class=\"language-cpp\">int __fastcall main_func(int fd)\n{\n    unsigned int seed; \/\/ eax\n    int buf__1; \/\/ eax\n    _DWORD buf[2]; \/\/ [rsp+10h] [rbp-840h] BYREF\n    unsigned __int8 check_flag; \/\/ [rsp+18h] [rbp-838h] BYREF\n    unsigned __int8 j_2; \/\/ [rsp+19h] [rbp-837h]\n    const char *v6; \/\/ [rsp+818h] [rbp-38h]\n    unsigned __int8 k_1; \/\/ [rsp+827h] [rbp-29h]\n    const char *v8; \/\/ [rsp+828h] [rbp-28h]\n    unsigned __int8 j_1; \/\/ [rsp+833h] [rbp-1Dh]\n    int buf__2; \/\/ [rsp+834h] [rbp-1Ch]\n    __int64 sbox; \/\/ [rsp+838h] [rbp-18h]\n    unsigned int nbytes; \/\/ [rsp+840h] [rbp-10h]\n    unsigned int key; \/\/ [rsp+844h] [rbp-Ch]\n    int j; \/\/ [rsp+848h] [rbp-8h]\n    int i; \/\/ [rsp+84Ch] [rbp-4h]\n\n    seed = time(0LL);\n    srand(seed);\n    read(fd, buf, 8uLL);\n    key = buf[0];\n    nbytes = buf[1];\n    sbox = malloc(0x102uLL);\n    sbox_KSA(sbox, key);\n    read(fd, &amp;check_flag, nbytes);\n    RC4(sbox, &amp;check_flag, &amp;check_flag, nbytes);\n    buf__1 = check_flag;\n    buf__2 = check_flag;\n    if ( check_flag == 1 )\n    {\n        buf__1 = puts(&quot;Login successful! Welcome to PlutoChat!&quot;);\n        dword_55555555822C = 1;\n    }\n    else if ( buf__2 == 3 )\n    {\n        j_1 = j_2;\n        v8 = malloc(j_2 + 1);\n        for ( i = 0; i &lt; j_1; ++i )\n            v8[i] = *(&amp;buf[2] + i + 2);\n        k_1 = *(&amp;buf[2] + j_1 + 2);\n        v6 = malloc(k_1 + 1);\n        for ( j = 0; j &lt; k_1; ++j )\n            v6[j] = *(&amp;buf[2] + j_1 + j + 3);\n        printf(&quot;%d %d\\n&quot;, k_1, j_1);\n        return printf(&quot;New message from %s: %s\\n&quot;, v8, v6);\n    }\n    return buf__1;\n}\n<\/code><\/pre>\n<p>\u5728wireshark\u4e2d\u7b5b\u9009\u51fa\u6709\u7528\u7684\u6d41\u91cf\u5305.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003175532.png\" alt=\"image.png\"><\/p>\n<p>\u63a5\u7740\u5c31\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a\u670d\u52a1\u7aef,\u6765\u53d1\u9001\u8fd9\u4e9b\u4fe1\u606f.<\/p>\n<pre><code class=\"language-python\">import socket\nimport time\n\n# \u5b9a\u4e49\u8981\u53d1\u9001\u7684\u6570\u636e\ndata2 = bytes.fromhex(&quot;5961965e01000000f2&quot;)\ndata3 = bytes.fromhex(&quot;43a72f7d4f0000000e6bcbc2f22c2ab292df5214621f539fb64957e5bc263200363280f254c9cef412c3daed1bca89945c4c8de150da6353ec04eb2c44aafb21841041f8dc032f7f31ed4a3d50477a9c5e96ba2c22a88e&quot;)\ndata4 = bytes.fromhex(&quot;7fc8fe7f48000000f31cd383bb6fdd8f41a8924099f79eda967f039fda8253b668843bd32cd8e6b085cd34f14563a3534c61b78e81c2246ed231daa7e93fba5634fe344c0524b1922569b8de54f391ba&quot;)\n\n# \u521b\u5efa TCP\/IP \u5957\u63a5\u5b57\nserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n\n# \u7ed1\u5b9a\u670d\u52a1\u7aef\u5730\u5740\u548c\u7aef\u53e3\nserver_socket.bind(('127.0.0.1', 31337))\n\n# \u5f00\u59cb\u76d1\u542c\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u6700\u591a 1 \u4e2a\u8fde\u63a5\nserver_socket.listen(1)\nprint(&quot;Server is listening on port 31337...&quot;)\n\n# \u7b49\u5f85\u5ba2\u6237\u7aef\u8fde\u63a5\nclient_socket, client_address = server_socket.accept()\nprint(f&quot;Connection from {client_address} established.&quot;)\n\n# \u6a21\u62df\u670d\u52a1\u5668\u7aef\u53d1\u9001\u6570\u636e\ntry:\n    # \u53d1\u9001\u6570\u636e2\uff08\u767b\u5f55\u6210\u529f\u4fe1\u606f\uff09\n    client_socket.sendall(data2)\n    print(&quot;Sent login success data (data2)&quot;)\n\n    # \u5c0f\u5ef6\u8fdf\u6a21\u62df\u771f\u5b9e\u901a\u4fe1\n    time.sleep(1)\n\n    # \u53d1\u9001\u6570\u636e3\uff08\u7528\u6237\u95f4\u6d88\u606f\uff09\n    client_socket.sendall(data3)\n    print(&quot;Sent message data (data3)&quot;)\n\n    # \u5c0f\u5ef6\u8fdf\u6a21\u62df\u771f\u5b9e\u901a\u4fe1\n    time.sleep(1)\n\n    # \u53d1\u9001\u6570\u636e4\uff08\u7528\u6237\u95f4\u6d88\u606f\uff09\n    client_socket.sendall(data4)\n    print(&quot;Sent message data (data4)&quot;)\n\nfinally:\n    # \u5173\u95ed\u4e0e\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\n    client_socket.close()\n    print(&quot;Connection closed.&quot;)\n\n# \u5173\u95ed\u670d\u52a1\u5668\nserver_socket.close()\nprint(&quot;Server stopped.&quot;)\n<\/code><\/pre>\n<p>\u7136\u540e\u5728ida\u4e2d\u89c2\u5bdf\u89e3\u5bc6\u540e\u7684\u6570\u636e\u5373\u53ef<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003183207.png\" alt=\"image.png\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003183341.png\" alt=\"image.png\"><\/p>\n<pre><code class=\"language-shell\">Username: 1234\nPassword: 5678\nLogin successful! Welcome to PlutoChat!\nType a username to send a message to, or 'EXIT' to exit: 62 14\nNew message from givemethemoney: Hey can you give me that sensitive key you were talking about?\n<\/code><\/pre>\n<p>\u6700\u540e\u4e00\u4e2a\u7531\u4e8e\u6821\u9a8c\u6ca1\u901a\u8fc7,\u53ef\u4ee5\u5728\u5806\u6808\u4e2d\u67e5\u770b<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251003183519.png\" alt=\"image.png\"><\/p>\n<p>flag: sun{S3cur1ty_thr0ugh_Obscur1ty_1s_B4D}<\/p>\n<h3>\u89e3\u6cd5\u4e8c<\/h3>\n<p>\u65e2\u7136\u6211\u4eec\u77e5\u9053key,\u5bc6\u6587,\u957f\u5ea6\u7f16\u7801\u5728\u6d88\u606f\u4e2d,\u6211\u4eec\u76f4\u63a5\u5199\u51fa\u89e3\u5bc6\u4ee3\u7801,\u89e3\u5bc6\u76f8\u5173\u7684\u6570\u636e\u5373\u53ef.<\/p>\n<pre><code class=\"language-python\">import struct, binascii\n\nS1 = [0xD,0x8,0x11,0xC,0xE,0x7,0x0,0x5,0x9,0x4,0xB,0x10,0x6,0x12,0xA,0x1,0x2,0x3,0xF,0x13] \nS2 = [\n  0xBA,0x79,0xCE,0x55,0x64,0x13,0x62,0x21,0xBF,0xCC,0x96,0x0F,0x68,0x95,0x2D,0x51,0x7A,0x59,0xF6,0x44,0xE5,0x43,0x3E,0xB3,0xA3,0x81,0x4F,0xA6,0x36,0xFB,0x6D,0xF8,\n  0xF7,0x1F,0x6B,0x42,0xA7,0xB7,0xBC,0x71,0x0D,0xB4,0xE0,0xB9,0x25,0x0A,0x28,0xA1,0x76,0x86,0x6C,0x27,0xD9,0x2A,0x6A,0x03,0xF1,0x72,0xDB,0x54,0x82,0x6F,0xBB,\n  0x1C,0x5A,0x38,0xD2,0xBE,0x09,0x9B,0x15,0xB8,0x8F,0x78,0x4C,0x34,0x67,0xD7,0xAB,0x75,0x45,0x87,0x9D,0x10,0xE8,0xEB,0x32,0x8D,0xC5,0x46,0x65,0x0B,0x35,0xBD,\n  0xEA,0x06,0xA5,0xDD,0xA4,0x5F,0x40,0x5D,0xFC,0x9A,0x5B,0xCB,0x89,0x91,0x5C,0xFE,0x66,0xFD,0xAA,0x37,0x02,0x12,0x98,0x6E,0x17,0xC9,0x50,0x20,0x39,0xC2,0xED,\n  0xE7,0xB2,0x74,0xE2,0xEF,0x16,0x5E,0x99,0x47,0xF5,0x1E,0x23,0x01,0x57,0xA0,0x3B,0x1B,0x2B,0xEE,0xC1,0x58,0x9E,0xA9,0xCA,0xFF,0xC4,0x7B,0x4B,0x8E,0x48,0xCD,\n  0x7C,0xC0,0x56,0xD0,0x33,0xC7,0x70,0x8B,0xE1,0x8C,0xC3,0x0E,0x1D,0x3D,0xDA,0xCF,0x11,0x73,0xEC,0xC6,0x92,0xB6,0x26,0x05,0xFA,0xF0,0xE6,0x0C,0x14,0x69,0x61,\n  0xC8,0x60,0x31,0x9C,0x22,0xAC,0x9F,0x4E,0x49,0x29,0x3F,0x85,0xF3,0x53,0xF9,0x63,0xDF,0xD3,0xF2,0x00,0x2E,0x18,0xD1,0xDE,0x8A,0x52,0x08,0xE9,0xA2,0xE4,0x3A,\n  0x83,0x7F,0x94,0xB5,0xD4,0xD5,0x77,0x07,0xDC,0x19,0x84,0xD8,0xAF,0xA8,0x93,0x7E,0xD6,0x2C,0xF4,0x41,0xB1,0x2F,0x7D,0x4D,0x97,0x1A,0x3C,0xB0,0x80,0x90,0x4A,\n  0xAE,0x24,0x88,0xAD,0x04,0x30,0xE3\n]\n\ndef derive_key(seed: int) -&gt; bytes:\n    key = bytearray(80)\n    x = seed &amp; 0xFFFFFFFF\n    # A) 20\u00d74B\uff1a\u5c0f\u7aef\u5199\u5165 + \u4f4e4\u4f4d\u51b3\u5b9a\u7684\u5faa\u73af\u5de6\u79fb\n    for i in range(20):\n        key[4*i:4*i+4] = x.to_bytes(4, 'little')\n        r = x &amp; 0xF\n        x = ((x &lt;&lt; r) | (x &gt;&gt; (32 - r))) &amp; 0xFFFFFFFF if r else x\n    # B) \u6309 S1 \u91cd\u6392 20 \u4e2a 4B \u69fd\n    for i in range(20):\n        j = S1[i]\n        for k in range(4):\n            a, b = 4*i + k, 4*j + k\n            key[a], key[b] = key[b], key[a]\n    # C) S2 \u66ff\u6362 + \u524d\u5411\u5f02\u6216\u53cd\u9988\n    prev = 0\n    for i in range(80):\n        key[i] = S2[key[i]] ^ prev\n        prev = key[i]\n    return bytes(key)\n\ndef rc4_crypt(key: bytes, data: bytes) -&gt; bytes:\n    # KSA\n    S = list(range(256)); j = 0; kl = len(key)\n    for i in range(256):\n        j = (j + S[i] + key[i % kl]) &amp; 0xFF\n        S[i], S[j] = S[j], S[i]\n    # PRGA\n    i = j = 0\n    out = bytearray(len(data))\n    for n in range(len(data)):\n        i = (i + 1) &amp; 0xFF\n        j = (j + S[i]) &amp; 0xFF\n        S[i], S[j] = S[j], S[i]\n        k = S[(S[i] + S[j]) &amp; 0xFF]\n        out[n] = data[n] ^ k\n    return bytes(out)\n\ndef decrypt_record(hexblob: str):\n    blob = bytes.fromhex(hexblob)\n    seed, length = struct.unpack('&lt;II', blob[:8])\n    key = derive_key(seed)\n    pt  = rc4_crypt(key, blob[8:8+length])\n    return seed, length, pt\n\nif __name__ == '__main__':\n    hexmsg = &quot;9b5fa5e44b000000f420fae91d6e90512b260b75da9a437afec536fb674f55f31d20817de08fac62f8e4ee1fb5e5e587924210d555a5bb2ed5e1c3efc6521b151c6cbd9e94119bd906e5557a30158758b815d6&quot;\n    seed, length, pt = decrypt_record(hexmsg)\n    print(f&quot;seed = 0x{seed:08X}, length = {length}&quot;)\n    print(&quot;plaintext (hex):&quot;, pt.hex())\n    try:\n        print(&quot;plaintext (utf-8):&quot;, pt.decode('utf-8'))\n    except UnicodeDecodeError:\n        print(&quot;plaintext (utf-8):&quot;, pt.decode('utf-8', errors='replace'))\n\noutput: \\x03\\x11topsecretengineer7Of course! It's: sun{S3cur1ty_thr0ugh_Obscur1ty_1s_B4D}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u66f4\u65b0\u4e2d&#8230; Pluto Chat \u7a0b\u5e8f\u5206\u6790 \u9996\u5148\u770b\u5230main\u51fd\u6570 void __fastcall _ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-42","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/42","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/comments?post=42"}],"version-history":[{"count":1,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":43,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/42\/revisions\/43"}],"wp:attachment":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}