{"id":3387,"date":"2025-04-22T20:27:53","date_gmt":"2025-04-22T11:27:53","guid":{"rendered":"https:\/\/h4ck.kr\/?p=3387"},"modified":"2025-05-06T14:38:55","modified_gmt":"2025-05-06T05:38:55","slug":"%ed%95%a8%ec%88%98-%ed%98%b8%ec%b6%9c%ec%8b%9c-%eb%a7%a4%ea%b0%9c%eb%b3%80%ec%88%98%ec%99%80-%eb%a6%ac%ed%84%b4%ea%b0%92-%ec%82%b4%ed%8e%b4%eb%b3%b4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/h4ck.kr\/?p=3387","title":{"rendered":"\ud568\uc218 \ud638\ucd9c\uc2dc \ub9e4\uac1c\ubcc0\uc218\uc640 \ub9ac\ud134\uac12 \uc0b4\ud3b4\ubcf4\uae30 (Linux)"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">add.c<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build: <code>gcc -fno-pie -no-pie -o add add.c<\/code><\/li>\n\n\n\n<li>Code<\/li>\n<\/ul>\n\n\n\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=\"\">#include &lt;stdio.h>\n\nint add(int a, int b) {\n    return a + b;\n}\n\nint main() {\n    printf(\"2 + 3 = %d\\n\", add(2, 3));\n    return 0;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">DynmaicRIO<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Thanks, \ud83e\udd54<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/DynamoRIO\/dynamorio\">https:\/\/github.com\/DynamoRIO\/dynamorio<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc815\uc801 \ubc14\uc774\ub108\ub9ac\uc5d0\ub3c4 \uc801\uc6a9\ud560 \uc218 \uc788\uc5b4 \uc88b\uc74c<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Environment: Ubuntu 20.04 LTS<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add func address: <strong><code>0x0000000000401cb5<\/code><\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@64a54bd8db27:~\/study\/DynamoRIO-Linux-11.3.0-1$ nm add | grep add\n...\n0000000000401cb5 T add\n...<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>test.c<\/li>\n<\/ul>\n\n\n\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=\"\">#include \"dr_api.h\"\n#include \"drwrap.h\"\n#include \"drsyms.h\"\n\n\/\/ \uc804\ucc98\ub9ac \ucf5c\ubc31\nstatic void pre(void *wrapcxt, DR_PARAM_OUT void **user_data) {\n    void *arg0 = drwrap_get_arg(wrapcxt, 0);\n    void *arg1 = drwrap_get_arg(wrapcxt, 1);\n    dr_fprintf(STDERR, \"Calling add func with arg0=%p, arg1: %p\\n\", arg0, arg1);\n}\n\n\/\/ \ud6c4\ucc98\ub9ac \ucf5c\ubc31\nstatic void post(void *wrapcxt, void *user_data) {\n    void *ret = drwrap_get_retval(wrapcxt);\n    dr_fprintf(STDERR, \"add func returned %p\\n\", ret);\n}\n\nstatic void event_exit(void) {\n    drwrap_exit();\n}\n\nstatic void module_load_event(void *drcontext, const module_data_t *mod, bool loaded) {\n    app_pc addr = (app_pc)0x000000000401cb5;\n    if (drwrap_wrap(addr, pre, post))\n        dr_printf(\"Wrapped add at %p\\n\", addr);\n}\n\nDR_EXPORT void dr_client_main(client_id_t id, int argc, const char *argv[]) {\n    drwrap_init();\n    drsym_init(0);\n    dr_register_exit_event(event_exit);\n    dr_register_module_load_event(module_load_event);\n}<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>build.sh<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@64a54bd8db27:~\/study\/DynamoRIO-Linux-11.3.0-1$ \ng++ -shared -fPIC -o test.so test.c -I .\/include -I.\/ext\/include -L .\/lib64 -L .\/lib64\/release -L .\/ext\/lib64\/release -DLINUX -DX86_64 -DUNIX -ldynamorio -ldrwrap -ldrsyms<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Result<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@64a54bd8db27:~\/study\/DynamoRIO-Linux-11.3.0-1$ \n.\/bin64\/drrun -c .\/test.so -- .\/add\nWrapped add at 0x0000000000401cb5\nWrapped add at 0x0000000000401cb5\nWrapped add at 0x0000000000401cb5\nWrapped add at 0x0000000000401cb5\nCalling add func with arg0=0x0000000000000002, arg1: 0x0000000000000003\nadd func returned 0x0000000000000005\n2 + 3 = 5<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Patchrex2<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/purseclab\/Patcherex2\">https:\/\/github.com\/purseclab\/Patcherex2<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubc14\uc774\ub108\ub9ac \ud328\uce58\ub97c \ud1b5\ud574 \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0b4\ud3b4\ubcfc \uc218 \uc788\uc74c.<\/li>\n\n\n\n<li>\ub2e8, (\uac70\uc758) \ud568\uc218 \ud504\ub864\ub85c\uadf8 \uc704\uc8fc\uc5d0\ub9cc \uc801\uc6a9 \uac00\ub2a5\ud55c \uac83 \uac19\uc74c. \ub9ac\ud134\uac12\uc740 \ubcf4\uae30 \ubd88\uac00\ub2a5\ud55c\ub4ef.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Environment: Ubuntu 22.04 LTS<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configure<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">sudo su \n\nwget -qO- https:\/\/apt.llvm.org\/llvm-snapshot.gpg.key | tee \/etc\/apt\/trusted.gpg.d\/apt.llvm.org.asc\necho \"deb http:\/\/apt.llvm.org\/jammy\/ llvm-toolchain-jammy-19 main\" | tee \/etc\/apt\/sources.list.d\/llvm.list\n\napt-get update &amp;&amp; apt-get install -y clang-19 lld-19\n\nexit;\n\npip3 install patcherex2\n\ngit clone <\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add func address: <strong><code>0x0000000000001149<\/code><\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@wh1te4ever-main:~\/Patcherex2\/examples\/insert_instruction_patch_c$ \nnm .\/add | grep add\n0000000000001149 T add\n\nubuntu@wh1te4ever-main:~\/Patcherex2\/examples\/insert_instruction_patch_c$ \nobjdump -d  .\/add\n\n0000000000001149 &lt;add>:\n    1149:\tf3 0f 1e fa          \tendbr64 \n    114d:\t55                   \tpush   %rbp\n    114e:\t48 89 e5             \tmov    %rsp,%rbp\n    1151:\t89 7d fc             \tmov    %edi,-0x4(%rbp)\n    1154:\t89 75 f8             \tmov    %esi,-0x8(%rbp)\n    1157:\t8b 55 fc             \tmov    -0x4(%rbp),%edx\n    115a:\t8b 45 f8             \tmov    -0x8(%rbp),%eax\n    115d:\t01 d0                \tadd    %edx,%eax\n    115f:\t5d                   \tpop    %rbp\n    1160:\tc3                   \tret <\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/patch.py\">patch.py<\/a><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from patcherex2 import *\nimport logging\n\nlogger = logging.getLogger(\"patcherex2.patches.instruction_patches\")\nlogger.setLevel(logging.INFO)\n\np = Patcherex(\"add\", target_opts={\"compiler\": \"clang19\"})\n\nc_forward_header = \"\"\"\n\/\/ This string will be inserted outside the micropatch function. It will be inserted before your code.\n\/\/ This is how you can define types and function forward declarations used by your C micropatch\n#include &lt;stdio.h>\n\"\"\"\n\n# The asm_header is inserted in the main body of the patch before the C code. This header is primarily\n# useful for gaining access to the stack pointer, which is a register that is unavailable in our C\n# code. In this example we have moved rsp to the r12 register, which is a register that is accessible.\n# This means that inside the C code we can access variables on the stack by using the r10 variable.\n# There is also an asm_footer\nasm_header = \"mov r12, rsp\"\n\n# We can access assembly registers directly by using their name, while still using high level C constructs\n# as well as intermediate variables. Note that you can use a return statement anywhere in your C micropatch\n# to jump back to the next instruction after the micropatch insertion point.\nc_str = \"\"\"\nprintf(\"add called, rsp: %p\\\\n\", (void *) r12);\nprintf(\"add called, rdi: 0x%llu, rsi: 0x%llu\\\\n\", rdi, rsi);\n\"\"\"\n\n# It is generally a good idea to mark some registers as scratch to give the compiler\n# breathing room for allocating registers to use for intermediate variables in your micropatch\n# All of the registers that we mark as scratch can be freely clobbered by the compiler\n# Note that you can still read from scratch registers stored in the variables. What the scratch\n# register denotation will indicate however is that the register can be re-used after the variable\n# is no longer live.\nc_scratch_regs = [\n    'r8', 'r9', 'r10', 'r11', 'r13', 'r14', 'r15'\n    'xmm0', 'xmm1', 'xmm2', 'xmm3', 'xmm4', 'xmm5', 'xmm6', 'xmm7', 'xmm9', 'xmm10', 'xmm11', 'xmm12', 'xmm13', 'xmm14', 'xmm15'\n]\n\n# By default floating point registers will have the 'float' type. We can use c_regs_sort to override\n# certain registers so they hold different types. In this example we denote that xmm8 is of type double\nc_regs_sort = [('xmm8', 'double')]\n\nconfig = InsertInstructionPatch.CConfig(\n    c_forward_header = c_forward_header,\n    scratch_regs=c_scratch_regs,\n    regs_sort=c_regs_sort,\n    asm_header=asm_header\n)\n\np.patches.append(InsertInstructionPatch(0x114d, c_str, language=\"C\", c_config=config))\np.apply_patches()\n\np.binfmt_tool.save_binary()<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Result<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@wh1te4ever-main:~\/Patcherex2\/examples\/insert_instruction_patch_c$ \npython3 patch.py\nINFO     | 2025-04-22 19:42:21,261 | patcherex2.patches.instruction_patches | InsertInstructionPatch generated C code:\n...\n\nubuntu@wh1te4ever-main:~\/Patcherex2\/examples\/insert_instruction_patch_c$ \n.\/add.patched \nadd called, rsp: 0x7ffc1cfc1ef8\nadd called, rdi: 0x2, rsi: 0x3\n2 + 3 = 5<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Dobby<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/jmpews\/Dobby\">https:\/\/github.com\/jmpews\/Dobby<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ubc14\uc774\ub108\ub9ac\uc5d0\uc11c \uc5b4\uc148\ube14\ub9ac\uc5b4 \uc2e4\ud589 \uc911\uc5d0 \ub808\uc9c0\uc2a4\ud130 \ud6c4\ud06c\ud560\ub54c \uc720\uc6a9<\/li>\n\n\n\n<li>\uc815\uc801 \ubc14\uc774\ub108\ub9ac \uacbd\uc6b0, <a href=\"https:\/\/github.com\/pfalcon\/foreign-dlopen\">https:\/\/github.com\/pfalcon\/foreign-dlopen<\/a> \ubcd1\ud589\ud574\uc11c \uc0ac\uc6a9\ud558\uba74 \uac00\ub2a5.<\/li>\n\n\n\n<li>Configure<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">git clone https:\/\/github.com\/jmpews\/Dobby.git\n\ncd Dobby\ngit checkout d353eea7594d1ac85db84065aeb4d1300d9f3248\n\nnano ~\/Dobby\/source\/MemoryAllocator\/NearMemoryAllocator.cc<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>MemBlock *NearMemoryAllocator::allocateNearBlockFromDefaultAllocator<\/code>,<\/strong><br>**<strong><code>MemBlock *NearMemoryAllocator::allocateNearBlockFromUnusedRegion<\/code><\/strong> \ud568\uc218\uc5d0 \uc788\ub294 \ucf54\ub4dc \uc218\uc815.<\/p>\n\n\n\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=\"\">min_valid_addr = pos - search_range;  \/\/ if pos &lt; search_range, and min_valid_addr will be a large value,this maybe a bug\nmax_valid_addr = pos + search_range;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \ub0b4\uc6a9 \ub2e4\uc74c\uc5d0 \uc544\ub798 \ub0b4\uc6a9 \ucd94\uac00<\/p>\n\n\n\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=\"\">min_valid_addr = pos >= search_range ? (pos - search_range) : 0;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc124\uce58<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">mkdir build_for_host &amp;&amp; cd build_for_host\ncmake ..\nmake -j8\nsudo cp libdobby.so \/usr\/local\/lib\nsudo ldconfig\nsudo cp ~\/Dobby\/include\/dobby.h \/usr\/local\/include<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>build.sh<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\ngcc -shared -fPIC -o hook.so hook.c -ldl -L. -ldobby<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>hook.c<\/li>\n\n\n\n<li>Add func address: <strong><code>0x0000000000401139<\/code><\/strong><\/li>\n<\/ul>\n\n\n\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=\"\">#define _GNU_SOURCE\n#include &lt;link.h>\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;stdint.h>\n#include &lt;string.h>\n#include &lt;signal.h>\n#include &lt;sys\/mman.h>\n#include &lt;dobby.h>\n\n\n\nvoid add_handler(void *address, DobbyRegisterContext *reg_ctx) {\n    uint64_t rdi = (uint64_t)(reg_ctx->general.regs.rdi);\n    uint64_t rsi = (uint64_t)(reg_ctx->general.regs.rsi);\n\n    printf(\"[hook.so] Called add_handler: rdi = 0x%lx, rsi = 0x%lx\\n\", rdi, rsi);\n}\n\n\n\n__attribute__((constructor)) \nvoid initialize() {\n    printf(\"[hook.so] Successfully Loaded!\\n\");\n\n    dobby_enable_near_branch_trampoline();\n    DobbyInstrument((void *)(0x0000000000401136), (dobby_instrument_callback_t)add_handler);\n\tdobby_disable_near_branch_trampoline();\n\n    \/\/ DobbyHook((void*)(0x7165e), (void*)hook_main, (void**)&amp;orig_main);\n\n}\n<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Result (hook.c)<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@64a54bd8db27:~\/study\/DynamoRIO-Linux-11.3.0-1$ LD_PRELOAD=.\/hook.so .\/add\n[hook.so] Successfully Loaded!\n[hook.so] Called add_handler: rdi = 0x2, rsi = 0x3\n2 + 3 = 5<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>hook2.c<\/li>\n<\/ul>\n\n\n\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=\"\">#define _GNU_SOURCE\n#include &lt;link.h>\n#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;stdint.h>\n#include &lt;string.h>\n#include &lt;signal.h>\n#include &lt;sys\/mman.h>\n#include &lt;dobby.h>\n\nstatic int (*orig_add)(int a, int b);\nstatic int hook_add(int a, int b) {\n    printf(\"[hook.so] hook_add a: %d, b: %d\\n\", a, b);\n    return orig_add(a, b);\n}\n\n\n__attribute__((constructor)) \nvoid initialize() {\n    printf(\"[hook.so] Successfully Loaded!\\n\");\n\n    DobbyHook((void*)(0x401136), (void*)hook_add, (void**)&amp;orig_add);\n}<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Result (hook2.c)<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"dracula\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ubuntu@64a54bd8db27:~\/study\/DynamoRIO-Linux-11.3.0-1$ LD_PRELOAD=.\/hook.so .\/add\n[hook.so] Successfully Loaded!\n[hook.so] hook_add a: 2, b: 3\n2 + 3 = 5<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>add.c DynmaicRIO Thanks, \ud83e\udd54 https:\/\/github.com\/DynamoRIO\/dynamorio Environment: Ubuntu 20.04 LTS Patchrex2 https:\/\/github.com\/purseclab\/Patcherex2 Environment: Ubuntu 22.04 LTS Dobby https:\/\/github.com\/jmpews\/Dobby MemBlock *NearMemoryAllocator::allocateNearBlockFromDefaultAllocator,**MemBlock *NearMemoryAllocator::allocateNearBlockFromUnusedRegion \ud568\uc218\uc5d0 \uc788\ub294 \ucf54\ub4dc \uc218\uc815. \uc704 \ub0b4\uc6a9 \ub2e4\uc74c\uc5d0 \uc544\ub798 \ub0b4\uc6a9 \ucd94\uac00 \uc124\uce58<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","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":[24],"class_list":["post-3387","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-reversing"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3387","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=3387"}],"version-history":[{"count":4,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3387\/revisions"}],"predecessor-version":[{"id":3419,"href":"https:\/\/h4ck.kr\/index.php?rest_route=\/wp\/v2\/posts\/3387\/revisions\/3419"}],"wp:attachment":[{"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/h4ck.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}