{"id":348,"date":"2023-02-22T02:49:08","date_gmt":"2023-02-22T10:49:08","guid":{"rendered":"http:\/\/bitas.net.cn\/?page_id=348"},"modified":"2023-02-22T02:49:15","modified_gmt":"2023-02-22T10:49:15","slug":"188-2","status":"publish","type":"page","link":"http:\/\/bitas.net.cn\/index.php\/sourcecode\/188-2\/","title":{"rendered":"188 \u8c03\u8bd5\u5668\u7684\u6700\u5c0f\u5b9e\u73b0"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">pic_dbg.c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;sys\/ptrace.h>\n#include &lt;unistd.h>\n#include &lt;sys\/types.h>\n#include &lt;sys\/wait.h>\n#include &lt;sys\/user.h>\n#include &lt;sys\/reg.h>\n\nvoid print_user_regs(struct user_regs_struct *puregs)\n{\n\tif (puregs) {\n\t\tprintf(\"-- user regs --\\n\");\n\t\t\/\/printf(\"   r15: %lld\\n\", puregs->r15);\n\t\t\/\/printf(\"   r14: %lld\\n\", puregs->r14);\n\t\t\/\/printf(\"   r13: %lld\\n\", puregs->r13);\n\t\t\/\/printf(\"   r12: %lld\\n\", puregs->r12);\n\t\tprintf(\"   rbp: %p\\n\", (void *)puregs->rbp);\n\t\t\/\/printf(\"   rbx: %lld\\n\", puregs->rbx);\n\t\t\/\/printf(\"   r11: %lld\\n\", puregs->r11);\n\t\t\/\/printf(\"   r10: %lld\\n\", puregs->r10);\n\t\t\/\/printf(\"   r9: %lld\\n\", puregs->r9); \n\t\t\/\/printf(\"   r8: %lld\\n\", puregs->r8); \n\t\tprintf(\"   rax: %lld\\n\", puregs->rax);\n\t\t\/\/printf(\"   rcx: %lld\\n\", puregs->rcx);\n\t\t\/\/printf(\"   rdx: %lld\\n\", puregs->rdx);\n\t\tprintf(\"   rsi: %lld\\n\", puregs->rsi);\n\t\tprintf(\"   rdi: %lld\\n\", puregs->rdi);\n\t\tprintf(\"   orig_rax: %lld\\n\", puregs->orig_rax);\n\t\tprintf(\"   rip: %p\\n\", (void *)puregs->rip);\n\t\t\/\/printf(\"   cs: %lld\\n\", puregs->cs); \n\t\t\/\/printf(\"   eflags: %p\\n\", (void *)puregs->eflags);\n\t\tprintf(\"   rsp: %p\\n\", (void *)puregs->rsp);\n\t\t\/\/printf(\"   ss: %lld\\n\", puregs->ss); \n\t\t\/\/printf(\"   fs_base: %p\\n\", (void *)puregs->fs_base);\n\t\t\/\/printf(\"   gs_base: %p\\n\", (void *)puregs->gs_base);\n\t\t\/\/printf(\"   ds: %lld\\n\", puregs->ds); \n\t\t\/\/printf(\"   es: %lld\\n\", puregs->es); \n\t\t\/\/printf(\"   fs: %lld\\n\", puregs->fs); \n\t\t\/\/printf(\"   gs: %lld\\n\", puregs->gs); \n\t\tprintf(\"-- ---- ---- --\\n\\n\");\n\t}\n}\n\nvoid print_user(struct user *pu)\n{\n\tif (pu) {\n\t\tprint_user_regs(&amp;pu->regs);\n\t\t\/\/ u_fpvalid\n\t\t\/\/ i387\n\t\tprintf(\"u_tsize: %lld\\n\", pu->u_tsize);\n\t\tprintf(\"u_dsize: %lld\\n\", pu->u_dsize);\n\t\tprintf(\"u_ssize: %lld\\n\", pu->u_ssize);\n\t\tprintf(\"start_code: %lld\\n\", pu->start_code);\n\t\tprintf(\"start_stack: %lld\\n\", pu->start_stack);\n\t\tprintf(\"u_tsize: %lld\\n\", pu->signal);\n\t\t\/\/ reserved\n\t\t\/\/ u_ar0\n\t\t\/\/ __u_ar0_word\n\t\t\/\/ u_fpstate\n\t\t\/\/ __u_fpstate_word\n\t\tprintf(\"u_comm: %s\\n\", pu->u_comm);\n\t\tfor (int i = 0;\n\t\t\ti &lt; sizeof(pu->u_debugreg)\/sizeof(pu->u_debugreg&#91;0]); i++)\n\t\t\tprintf(\"u_debugreg&#91;%i]: %lld\\n\", i, pu->u_debugreg&#91;i]);\n\t}\n}\n\nint main(int argc, char *argv&#91;])\n{\n\tpid_t cpid, w;\n\tint status;\n\tstruct user_regs_struct uregs;\n\n\tcpid = fork();\n\tif (cpid == -1) {\n\t\tperror(\"fork\");\n\t\texit(EXIT_FAILURE);\n\t}\n\n\tif (cpid == 0) {            \/* Code executed by child *\/\n\t\tprintf(\"Child PID is %ld\\n\", (long) getpid());\n\t\tptrace(PTRACE_TRACEME, 0, NULL, NULL);\n\n\t\tchar *newargv&#91;] = { NULL, NULL, NULL, NULL };\n\t\tchar *newenviron&#91;] = { NULL };\n\n\t\tif (argc &lt; 2) {\n\t\t\tfprintf(stderr, \"Usage: %s &lt;file-to-exec> &#91;args]\\n\", argv&#91;0]);\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\t\n\t\tnewargv&#91;0] = argv&#91;1];\n\t\tif (argv&#91;2])\n\t\t\tnewargv&#91;1] = argv&#91;2];\n\t\tif (argv&#91;3])\n\t\t\tnewargv&#91;2] = argv&#91;3];\n\n\t\texecve(argv&#91;1], newargv, newenviron);\n\t\tperror(\"execve\");   \/* execve() returns only on error *\/\n\t\texit(EXIT_FAILURE);\n\t} else {                    \/* Code executed by parent *\/\n\t\tptrace(PTRACE_SEIZE, cpid, NULL,\n\t\t\tPTRACE_O_EXITKILL | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEEXIT);\n\n#ifdef ADVERTISED_DISPLAY\n\t\tsystem(\"sleep 2; clear\");\n\t\tfor (int i = 0; i &lt; 15; i++) {\n\t\t\tputchar('=');\n\t\t\tfflush(stdout);\n\t\t\tsleep(1);\n\t\t}\n\t\tputs(\">\");\n\t\tfflush(stdout);\n\t\tsleep(2);\n\t\tsystem(\"clear\");\n#endif\n\n\t\t\/*\n\t\t * wait for SIGTRAP(by execve)\n\t\t *\/\n\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\tif (w == -1) {\n\t\t\tperror(\"waitpid\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tif (WIFSTOPPED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\tputs(\">> \u7cfb\u7edf\u8c03\u7528execve\");\n#endif\n\t\t\tprintf(\"stopped by signal %d\\n\", WSTOPSIG(status));\n\t\t\tprintf(\"herein, successful calls to execve\\n\");\n\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\tprint_user_regs(&amp;uregs);\n\t\t\tptrace(PTRACE_CONT, cpid, NULL, NULL);\n\t\t} else {\n\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n#ifdef ADVERTISED_DISPLAY\n\t\tsystem(\"sleep 2; clear\");\n#endif\n\n\t\t\/*\n\t\t * wait for SIGTRAP(by asm int3 immediately after {)\n\t\t *\/\n\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\tif (w == -1) {\n\t\t\tperror(\"waitpid\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tif (WIFSTOPPED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\tputs(\">> \u8fdb\u5165sum\u51fd\u6570\");\n#endif\n\t\t\tprintf(\"stopped by signal %d\\n\", WSTOPSIG(status));\n\t\t\tprintf(\"herein, immediately after {\\n\");\n\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\tprint_user_regs(&amp;uregs);\n\t\t} else {\n\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n#ifdef ADVERTISED_DISPLAY\n\t\tsystem(\"sleep 2; clear\");\n#endif\n\n\t\t\/*\n\t\t * single step to next int3\n\t\t *\/\n\t\tfor (int i = 0; i &lt; 5; i++) {\n\t\t\tptrace(PTRACE_SINGLESTEP, cpid, NULL, NULL);\n\t\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\t\tif (w == -1) {\n\t\t\t\tperror(\"waitpid\");\n\t\t\t\texit(EXIT_FAILURE);\n\t\t\t}\n\t\t\tif (WIFSTOPPED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\t\tprintf(\">> \u5355\u6b65\u6267\u884c - %d\\n\", i+1);\n#endif\n\t\t\t\tprintf(\"stopped by signal %d\\n\", WSTOPSIG(status));\n\t\t\t\tprintf(\"herein, single-step %d\\n\", i+1);\n\t\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\t\tprint_user_regs(&amp;uregs);\n\t\t\t} else {\n\t\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\t\texit(EXIT_FAILURE);\n\t\t\t}\n#ifdef ADVERTISED_DISPLAY\n\t\t\tsystem(\"sleep 2; clear\");\n#endif\n\t\t}\n\n\t\t\/*\n\t\t * wait for SIGTRAP(by asm int3 immediately precede })\n\t\t *\/\n\t\tptrace(PTRACE_SINGLESTEP, cpid, NULL, NULL);\n\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\tif (w == -1) {\n\t\t\tperror(\"waitpid\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tif (WIFSTOPPED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\tputs(\">> \u79bb\u5f00sum\u51fd\u6570\");\n#endif\n\t\t\tprintf(\"stopped by signal %d\\n\", WSTOPSIG(status));\n\t\t\tprintf(\"herein, immediately precede }\\n\");\n\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\tprint_user_regs(&amp;uregs);\n\t\t\tptrace(PTRACE_CONT, cpid, NULL, NULL);\n\t\t} else {\n\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n#ifdef ADVERTISED_DISPLAY\n\t\tsystem(\"sleep 2; clear\");\n#endif\n\n\t\t\/*\n\t\t * wait for SIGTRAP(by exit_group syscall)\n\t\t *\/\n\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\tif (w == -1) {\n\t\t\tperror(\"waitpid\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tif (WIFSTOPPED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\tputs(\">> \u7cfb\u7edf\u8c03\u7528exit_group\");\n#endif\n\t\t\tprintf(\"stopped by signal %d\\n\", WSTOPSIG(status));\n\t\t\tprintf(\"herein, exit_group syscall\\n\");\n\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\tprint_user_regs(&amp;uregs);\n\t\t\tptrace(PTRACE_CONT, cpid, NULL, NULL);\n\t\t} else {\n\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n#ifdef ADVERTISED_DISPLAY\n\t\tsystem(\"sleep 2; clear\");\n#endif\n\n\t\t\/*\n\t\t * wait for ending of debugee\n\t\t *\/\n\t\tw = waitpid(cpid, &amp;status, WUNTRACED | WCONTINUED);\n\t\tif (w == -1) {\n\t\t\tperror(\"waitpid\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\t\tif (WIFEXITED(status)) {\n#ifdef ADVERTISED_DISPLAY\n\t\t\tputs(\">> \u88ab\u8c03\u8bd5\u7a0b\u5e8f\u5373\u5c06\u7ec8\u6b62\");\n#endif\n\t\t\tprintf(\"exited, status=%d\\n\", WEXITSTATUS(status));\n\t\t\tprintf(\"herein, ending of debugee\\n\");\n\t\t\tptrace(PTRACE_GETREGS, cpid, NULL, &amp;uregs);\n\t\t\tprint_user_regs(&amp;uregs);\n\t\t} else {\n\t\t\tprintf(\"unexpected result, quit\\n\");\n\t\t\texit(EXIT_FAILURE);\n\t\t}\n\n\t\texit(EXIT_SUCCESS);\n\t}\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">prog.c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;assert.h>\n#include \"sum.h\"\n\nint main(int argc, char *argv&#91;])\n{\n\tint op1 = 0, op2 = 0, res = 0;\n\n\tif (argc > 2)\n\t\top2 = atoi(argv&#91;2]);\n\tif (argc > 1)\n\t\top1 = atoi(argv&#91;1]);\n\n\tres = sum(op1, op2);\n\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">sum.c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"sum.h\"\n\nint sum(int op1, int op2)\n{\n__asm__(\"int3\");\n\tint sum = 0;\n\tsum = op1 + op2;\n__asm__(\"int3\");\n\treturn sum;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">sum.h<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef LTTC_SUM_H_\n#define LTTC_SUM_H_\n\nextern int sum(int op1, int op2);\n\n#endif<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>pic_dbg.c prog.c sum.c sum.h<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":127,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-348","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/pages\/348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/comments?post=348"}],"version-history":[{"count":1,"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/pages\/348\/revisions"}],"predecessor-version":[{"id":349,"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/pages\/348\/revisions\/349"}],"up":[{"embeddable":true,"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/pages\/127"}],"wp:attachment":[{"href":"http:\/\/bitas.net.cn\/index.php\/wp-json\/wp\/v2\/media?parent=348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}