{"id":618,"date":"2023-07-10T06:06:18","date_gmt":"2023-07-09T21:06:18","guid":{"rendered":"https:\/\/h4ck.kr\/?p=618"},"modified":"2024-05-22T16:58:52","modified_gmt":"2024-05-22T07:58:52","slug":"%ec%bb%a4%eb%84%90-%eb%a9%94%eb%aa%a8%eb%a6%ac%eb%a5%bc-%ed%8c%a8%ec%b9%98%ed%95%98%ec%97%ac-ios-%ec%95%88%ed%8b%b0%eb%94%94%eb%b2%84%ea%b9%85-%ec%9a%b0%ed%9a%8c","status":"publish","type":"post","link":"https:\/\/h4ck.kr\/?p=618","title":{"rendered":"\ucee4\ub110 \uba54\ubaa8\ub9ac\ub97c \ud328\uce58\ud558\uc5ec iOS \uc548\ud2f0\ub514\ubc84\uae45 \uc6b0\ud68c"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. ptrace<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ucf54\ub4dc<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void svc80_anti_debug(void) {\n#if defined __arm64__\n    __asm __volatile(\"mov x0, #26\");\n    __asm __volatile(\"mov x1, #31\");\n    __asm __volatile(\"mov x2, #0\");\n    __asm __volatile(\"mov x3, #0\");\n    __asm __volatile(\"mov x16, #0\");\n    __asm __volatile(\"svc #0x80\");\n#endif\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\uc791\ub3d9 \uc6d0\ub9ac<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">int ptrace(struct proc *p, struct ptrace_args *uap, int32_t *retval)\n{\n    ...\n    if (uap->req == PT_DENY_ATTACH) {\n\t\tif (ISSET(p->p_lflag, P_LTRACED)) {\n\t\t\tproc_unlock(p);\n\t\t\tKERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_FRCEXIT) | DBG_FUNC_NONE,\n\t\t\t    p->p_pid, W_EXITCODE(ENOTSUP, 0), 4, 0, 0);\n\t\t\texit1(p, W_EXITCODE(ENOTSUP, 0), retval);\n\n\t\t\tthread_exception_return();\n\t\t\t\/* NOTREACHED *\/\n\t\t}\n\t\tSET(p->p_lflag, P_LNOATTACH);\n\t\tproc_unlock(p);\n\n\t\treturn 0;\n\t}\n    ...\n    if (uap->req == PT_ATTACH) {\n        int             err;\n        ...\n        \/* not allowed to attach, proper error code returned by kauth_authorize_process *\/\n\t\tif (ISSET(t->p_lflag, P_LNOATTACH)) {\n\t\t\tpsignal(p, SIGSEGV);\n\t\t}\n        ...\n    }\n    ...\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>proc \uad6c\uc870\uccb4\uc758 p_lflag\uc5d0 P_LTRACED\uac00 \uc138\ud2b8\ub418\uc5b4\uc788\uc73c\uba74, ENOTSUP(-45)\uc640 \ud568\uaed8 \ub514\ubc84\uadf8\ud560\ub824\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\uc2dc\ucf1c\ubc84\ub9b0\ub2e4. (\ub514\ubc84\uae45 \uc911\uc5d0 ptrace \ud568\uc218\uac00 \uc218\ud589\ub41c \uacbd\uc6b0)<\/p>\n\n\n\n<p>P_LNOATTACH\uac00 \uc138\ud2b8\ub418\uc5b4 \uc788\uc744 \uacbd\uc6b0\uc5d0\ub294, \ub514\ubc84\uadf8\ud560\ub824\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\uc2dc\ud0a4\uc9c0\ub294 \uc54a\uc9c0\ub9cc<br>SIGSEGV \uc2dc\uadf8\ub110\uacfc \ud568\uaed8 \ub514\ubc84\uac70 \ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\uc2dc\ucf1c\ubc84\ub9b0\ub2e4. (ptrace \ud568\uc218\uac00 \uc218\ud589\ub41c \ud6c4\uc5d0 \ub514\ubc84\uadf8\ub97c \uc2dc\ub3c4\ud560 \uacbd\uc6b0)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reference<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/mach_process.c#L133\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/mach_process.c#L133<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/errno.h#L146\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/errno.h#L146<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/mach_process.c#L308\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/mach_process.c#L308<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. sysctl<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ucf54\ub4dc<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">static bool AmIBeingDebugged(void)\n    \/\/ Returns true if the current process is being debugged (either\n    \/\/ running under the debugger or has a debugger attached post facto).\n{\n    int                 junk;\n    int                 mib[4];\n    struct kinfo_proc   info;\n    size_t              size;\n\n    \/\/ Initialize the flags so that, if sysctl fails for some bizarre\n    \/\/ reason, we get a predictable result.\n\n    info.kp_proc.p_flag = 0;\n\n    \/\/ Initialize mib, which tells sysctl the info we want, in this case\n    \/\/ we're looking for information about a specific process ID.\n\n    mib[0] = CTL_KERN;\n    mib[1] = KERN_PROC;\n    mib[2] = KERN_PROC_PID;\n    mib[3] = getpid();\n\n    \/\/ Call sysctl.\n\n    size = sizeof(info);\n    junk = sysctl(mib, sizeof(mib) \/ sizeof(*mib), &amp;info, &amp;size, NULL, 0);\n    assert(junk == 0);\n\n    \/\/ We're being debugged if the P_TRACED flag is set.\n\n    return ( (info.kp_proc.p_flag &amp; P_TRACED) != 0 );\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\uc791\ub3d9 \uc6d0\ub9ac<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">STATIC void\nfill_user64_externproc(proc_t p, struct user64_extern_proc *__restrict exp)\n{\n    ...\n    if (p->p_lflag &amp; P_LTRACED) {\n\t\texp->p_flag |= P_TRACED;\n\t}\n    ...\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>proc \uad6c\uc870\uccb4\uc758 p_lflag\uc5d0 P_LTRACED\uac00 \uc138\ud2b8\ub418\uc5b4\uc788\uc73c\uba74,<br> \ub9c8\ucc2c\uac00\uc9c0\ub85c extern_proc \uad6c\uc870\uccb4\uc758 p_lflag\uc5d0 P_TRACED\uac00 \uc138\ud2b8\ub41c\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reference<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/kern_sysctl.c#L1079\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/kern_sysctl.c#L1079<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. getppid<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ucf54\ub4dc<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">if(getppid() != 1) {\n    return YES;    \/\/detected debugger;\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>\ubd80\ubaa8 pid\uac00 launchd \ud504\ub85c\uc138\uc2a4\uc778\uc9c0 \ud655\uc778\ud55c\ub2e4.<\/p>\n\n\n\n<p>launchd \ud504\ub85c\uc138\uc2a4\uc758 pid\ub294 \ud56d\uc0c1 1\uc774\ubbc0\ub85c, <br>1\uc774 \uc544\ub2cc \uacbd\uc6b0 \ub514\ubc84\uac70\uac00 \ud0d0\uc9c0\ub41c\uac78\ub85c \ud310\ub2e8\ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc791\ub3d9 \uc6d0\ub9ac<\/h3>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">int getppid(proc_t p, __unused struct getppid_args *uap, int32_t *retval)\n{\n\t*retval = p->p_ppid;\n\treturn 0;\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>proc \uad6c\uc870\uccb4\uc758 p_ppid \uac12\uc744 \ubc18\ud658\uc2dc\ud0a8\ub2e4.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reference<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/proc_internal.h#L463\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/proc_internal.h#L463<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/kern_prot.c#L189\">https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/kern_prot.c#L189<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Bypass!<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">uint64_t getProc(pid_t pid) {\n    \/\/  https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/proc_internal.h#L193\n    \/\/  https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/sys\/queue.h#L470\n    \n    uint64_t proc = kread64(kernproc);\n    \n    while (true) {\n        if(kread32(proc + 0x68\/*PROC_P_PID_OFF*\/) == pid) {\n            return proc;\n        }\n        proc = kread64(proc + 0x8\/*PROC_P_LIST_LE_PREV_OFF*\/);\n    }\n    \n    return 0;\n}\n\n\/\/https:\/\/stackoverflow.com\/questions\/49506579\/how-to-find-the-pid-of-any-process-in-mac-osx-c\nint find_pids(const char *name)\n{\n\tint ret = -1;\n    pid_t pids[2048];\n    int bytes = proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids));\n    int n_proc = bytes \/ sizeof(pids[0]);\n    for (int i = 0; i &lt; n_proc; i++) {\n        struct proc_bsdinfo proc;\n        int st = proc_pidinfo(pids[i], PROC_PIDTBSDINFO, 0,\n                             &amp;proc, PROC_PIDTBSDINFO_SIZE);\n        if (st == PROC_PIDTBSDINFO_SIZE) {\n            if (strcmp(name, proc.pbi_name) == 0) {\n                \/* Process PID *\/\n                \/\/ printf(\"%d [%s] [%s]\\n\", pids[i], proc.pbi_comm, proc.pbi_name);     \n\t\t\t\treturn pids[i];           \n            }\n        }       \n    }\n\treturn ret;\n}\n\n#define P_LNOATTACH     0x00001000 \n#define P_LTRACED       0x00000400\n\n#define ISSET(t, f)     ((t) &amp; (f))\n#define CLR(t, f)       (t) &amp;= ~(f)\n#define SET(t, f)       (t) |= (f)\n\nint main(int argc, char *argv[], char *envp[]) {\n\t@autoreleasepool {\n\t\tlibjb = dlopen(\"\/var\/jb\/basebin\/libjailbreak.dylib\", RTLD_NOW);\n\n\t\tif(dimentio_init(0, NULL, NULL) != KERN_SUCCESS) {\n    \t\tprintf(\"failed dimentio_init!\\n\");\n\t\t\treturn 1;\n  \t\t}\n\n\t\tif(kbase == 0) {\n\t\t\tprintf(\"failed get_kbase\\n\");\n\t\t\treturn 1;\n\t\t}\n\n\t\tuint64_t kslide = kbase - 0xFFFFFFF007004000;\n\t\tprintf(\"[i] kbase: 0x%llx, kslide: 0x%llx\\n\", kbase, kslide);\n\t\tprintf(\"[i] kread64 from base: 0x%llx\\n\", kread64(kbase));\n\n\t\tint ptracetest_pid = find_pids(\"ptracetest\");\n\t\tprintf(\"[i] ptracetest pid: %d\\n\", ptracetest_pid);\n\t\tif(ptracetest_pid == -1) {\n\t\t\tprintf(\"Not running ptracetest.\\n\");\n\t\t\treturn 1;\n\t\t}\n\n\t\tuint64_t ptracetest_proc = getProc(ptracetest_pid);\n\t\tprintf(\"[i] ptracetest proc: 0x%llx\\n\", ptracetest_proc);\n\t\t\n\t\t\/\/ https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/mach_process.c#L133\n\t\tuint64_t ptracetest_lflag = ptracetest_proc + 0x1c0\/*lflagoffset*\/;\n\t\tunsigned int lflagvalue = kread32(ptracetest_lflag);\n\t\tprintf(\"[i] ptracetest proc->p_lflag: 0x%x\\n\", lflagvalue);\n\n\t\tif(ISSET(lflagvalue, P_LNOATTACH))\n        {\n            printf(\"[+] P_LNOATTACH has been set, clearing...\\n\");\n            CLR(lflagvalue, P_LNOATTACH);\n        \tkwrite32(ptracetest_lflag, lflagvalue);\n\t\t\tprintf(\"[+] P_LNOATTACH now unset.\\n\");\n\n\t\t\tlflagvalue = kread32(ptracetest_lflag);\n\t\t\tprintf(\"[+] ptracetest proc->p_lflag: 0x%x\\n\", lflagvalue);\n        }\n\n\t\t\/\/ https:\/\/github.com\/apple\/darwin-xnu\/blob\/main\/bsd\/kern\/kern_sysctl.c#L1079\n\t\tif(argc == 2 &amp;&amp; strcmp(argv[1], \"notrace\") == 0){\n\t\t\tif(ISSET(lflagvalue, P_LTRACED))\n        \t{\n            \tprintf(\"[+] P_LTRACED has been set, clearing...\\n\");\n            \tCLR(lflagvalue, P_LTRACED);\n        \t\tkwrite32(ptracetest_lflag, lflagvalue);\n\t\t\t\tprintf(\"[+] P_LTRACED now unset.\\n\");\n\n\t\t\t\tlflagvalue = kread32(ptracetest_lflag);\n\t\t\t\tprintf(\"[+] ptracetest proc->p_lflag: 0x%x\\n\", lflagvalue);\n        \t}\n\t\t}\n\t\t\n\t\tif(argc == 2 &amp;&amp; strcmp(argv[1], \"trace\") == 0) {\n\t\t\tif(!ISSET(lflagvalue, P_LTRACED))\n        \t{\n            \tprintf(\"[+] P_LTRACED has NOT been set, setting...\\n\");\n            \tSET(lflagvalue, P_LTRACED);\n        \t\tkwrite32(ptracetest_lflag, lflagvalue);\n\t\t\t\tprintf(\"[+] P_LTRACED now set.\\n\");\n\n\t\t\t\tlflagvalue = kread32(ptracetest_lflag);\n\t\t\t\tprintf(\"[+] ptracetest proc->p_lflag: 0x%x\\n\", lflagvalue);\n        \t}\n\t\t}\n\n\t\tuint64_t ptracetest_ppid = ptracetest_proc + 0x20;\n\t\tunsigned int ppidvalue = kread32(ptracetest_ppid);\n\t\tprintf(\"[i] ptracetest proc->p_ppid: %d\\n\", ppidvalue);\n\t\tif(ppidvalue != 1) {\n\t\t\tprintf(\"[+] Patching proc->p_ppid to 1...\\n\");\n\t\t\tkwrite32(ptracetest_ppid, 1);\n\n\t\t\tppidvalue = kread32(ptracetest_ppid);\n\t\t\tprintf(\"[+] ptracetest proc->p_ppid: %d\\n\", ppidvalue);\n\t\t}\n\n\t\tdlclose(libjb);\n\n\t\treturn 0;\n\t}\n}<\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>\uac04\ub2e8\ud558\uac8c \uadf8\ub0e5 proc \uad6c\uc870\uccb4\uc758 p_lflag\uc5d0 \uc138\ud2b8\ub41c P_LNOATTACH, P_LTRACED\ub97c \uc9c0\uc6b0\uace0<br>p_ppid \uac12\uc744 1\ub85c \ub36e\uc5b4\uc50c\uc6b0\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Demo<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">\ud14c\uc2a4\ud2b8 \ud658\uacbd<\/h4>\n\n\n\n<p>iPhone SE (2nd generation) \/ iOS 15.0.2 \/ Dopamine<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1442\" style=\"aspect-ratio: 1990 \/ 1442;\" width=\"1990\" controls src=\"https:\/\/h4ck.kr\/wp-content\/uploads\/2023\/07\/anti-debug_bypass.mov\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>1. ptrace \ucf54\ub4dc \uc791\ub3d9 \uc6d0\ub9ac proc \uad6c\uc870\uccb4\uc758 p_lflag\uc5d0 P_LTRACED\uac00 \uc138\ud2b8\ub418\uc5b4\uc788\uc73c\uba74, ENOTSUP(-45)\uc640 \ud568\uaed8 \ub514\ubc84\uadf8\ud560\ub824\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\uc2dc\ucf1c\ubc84\ub9b0\ub2e4. (\ub514\ubc84\uae45 \uc911\uc5d0 ptrace \ud568\uc218\uac00 \uc218\ud589\ub41c \uacbd\uc6b0) P_LNOATTACH\uac00 \uc138\ud2b8\ub418\uc5b4 \uc788\uc744 \uacbd\uc6b0\uc5d0\ub294, \ub514\ubc84\uadf8\ud560\ub824\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\uc2dc\ud0a4\uc9c0\ub294 \uc54a\uc9c0\ub9ccSIGSEGV \uc2dc\uadf8\ub110\uacfc&hellip;&nbsp;<a href=\"https:\/\/h4ck.kr\/?p=618\" rel=\"bookmark\">\ub354 \ubcf4\uae30 &raquo;<span class=\"screen-reader-text\">\ucee4\ub110 \uba54\ubaa8\ub9ac\ub97c \ud328\uce58\ud558\uc5ec iOS \uc548\ud2f0\ub514\ubc84\uae45 \uc6b0\ud68c<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[11,12],"class_list":["post-618","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-ios","tag-ios-kernel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=618"}],"version-history":[{"count":5,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/618\/revisions"}],"predecessor-version":[{"id":625,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/618\/revisions\/625"}],"wp:attachment":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}