{"id":3137,"date":"2017-01-11T16:59:13","date_gmt":"2017-01-11T08:59:13","guid":{"rendered":"http:\/\/ixyzero.com\/blog\/?p=3137"},"modified":"2017-01-11T16:59:13","modified_gmt":"2017-01-11T08:59:13","slug":"linux%e7%9a%84ld_preload%e7%9b%b8%e5%85%b3%e7%9f%a5%e8%af%86%e5%ad%a6%e4%b9%a0","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/3137.html","title":{"rendered":"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60"},"content":{"rendered":"<p>=Start=<\/p>\n<h4 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-\u7f18\u7531\uff1a\">\u7f18\u7531\uff1a<\/h4>\n<p>\u4e00\u63d0\u8d77LD_PRELOAD\u5c31\u4f1a\u8ba9\u6211\u60f3\u8d77\u4e4b\u524d\u72af\u7684\u4e00\u4e2a\u9519\u8bef\u2014\u2014\u76f4\u63a5\u66ff\u6362\u7cfb\u7edf\u7684glibc\u52a8\u6001\u94fe\u63a5\u5e93\u5bfc\u81f4\u7cfb\u7edf\u65e0\u6cd5\u6b63\u5e38\u767b\u5f55\u3002\u5728\u90a3\u4e2a\u65f6\u5019\u624d\u5f00\u59cb\u8ba4\u8bc6\u4ee5\u53ca\u4e86\u89e3LD_PRELOAD\u8fd8\u6709\u5b83\u8eab\u540e\u7684\u76f8\u5173Linux\u5e95\u5c42\u77e5\u8bc6\u3002<\/p>\n<h4 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-\u6b63\u6587\uff1a\">\u6b63\u6587\uff1a<\/h4>\n<h5 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-\u53c2\u8003\u89e3\u7b54\uff1a\">\u53c2\u8003\u89e3\u7b54\uff1a<\/h5>\n<h6 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-0.\u9884\u5907\u77e5\u8bc6\">0.\u9884\u5907\u77e5\u8bc6<\/h6>\n<p>\u7f16\u8f91\u2014\u2014\uff08\u9884\u7f16\u8bd1\uff09\u7f16\u8bd1\uff08\u6c47\u7f16\uff09\u2014\u2014\u94fe\u63a5\u2014\u2014\u8fd0\u884c<\/p>\n<p>\u9759\u6001\u94fe\u63a5\uff1a\u5728\u94fe\u63a5\u9636\u6bb5\uff0c\u4f1a\u5c06\u6c47\u7f16\u751f\u6210\u7684\u76ee\u6807\u6587\u4ef6.o\u4e0e\u5f15\u7528\u5230\u7684\u5e93\u4e00\u8d77\u94fe\u63a5\u6253\u5305\u5230\u53ef\u6267\u884c\u6587\u4ef6\u4e2d\u3002\u56e0\u6b64\u5bf9\u5e94\u7684\u94fe\u63a5\u65b9\u5f0f\u79f0\u4e3a\u9759\u6001\u94fe\u63a5\u3002<\/p>\n<p>\u52a8\u6001\u94fe\u63a5\uff1a\u5728\u9759\u6001\u60c5\u51b5\u4e0b\uff0c\u5b83\u628a\u5e93\u76f4\u63a5\u52a0\u8f7d\u5230\u7a0b\u5e8f\u91cc\uff0c\u800c\u5728\u52a8\u6001\u94fe\u63a5\u7684\u65f6\u5019\uff0c\u5b83\u53ea\u662f\u4fdd\u7559\u63a5\u53e3\uff0c\u5c06\u52a8\u6001\u5e93\u4e0e\u7a0b\u5e8f\u4ee3\u7801\u72ec\u7acb\u3002<\/p>\n<h6 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-1.\u4ec0\u4e48\u662fLD_PRELOAD\uff1f\">1.\u4ec0\u4e48\u662fLD_PRELOAD\uff1f<\/h6>\n<p>\u5728UNIX\u7684\u52a8\u6001\u94fe\u63a5\u5e93\u7684\u4e16\u754c\u4e2d\uff0cLD_PRELOAD\u5c31\u662f\u8fd9\u6837\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u5b83\u53ef\u4ee5\u5f71\u54cd\u7a0b\u5e8f\u7684\u8fd0\u884c\u65f6\u7684\u94fe\u63a5\uff08Runtime linker\uff09\uff0c\u5b83\u5141\u8bb8\u4f60\u5b9a\u4e49\u5728\u7a0b\u5e8f\u8fd0\u884c\u524d\u4f18\u5148\u52a0\u8f7d\u7684\u52a8\u6001\u94fe\u63a5\u5e93\u3002<\/p>\n<p>\u6211\u4eec\u77e5\u9053\uff0cLinux\u7684\u7528\u7684\u90fd\u662fglibc\uff0c\u6709\u4e00\u4e2a\u53eblibc.so.6\u7684\u6587\u4ef6\uff0c\u8fd9\u662f\u51e0\u4e4e\u6240\u6709Linux\u4e0b\u547d\u4ee4\u7684\u52a8\u6001\u94fe\u63a5\u4e2d\uff0c\u5176\u4e2d\u6709\u6807\u51c6C\u7684\u5404\u79cd\u51fd\u6570\u3002\u5bf9\u4e8eGCC\u800c\u8a00\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u6240\u7f16\u8bd1\u7684\u7a0b\u5e8f\u4e2d\u5bf9\u6807\u51c6C\u51fd\u6570\u7684\u94fe\u63a5\uff0c\u90fd\u662f\u901a\u8fc7\u52a8\u6001\u94fe\u63a5\u65b9\u5f0f\u6765\u94fe\u63a5libc.so.6\u8fd9\u4e2a\u51fd\u6570\u5e93\u7684\u3002<\/p>\n<p>loader\u5728\u8fdb\u884c\u52a8\u6001\u94fe\u63a5\u7684\u65f6\u5019\uff0c\u4f1a\u5c06\u6709\u76f8\u540c\u7b26\u53f7\u540d\u7684\u7b26\u53f7\u8986\u76d6\u6210LD_PRELOAD\u6307\u5b9a\u7684so\u6587\u4ef6\u4e2d\u7684\u7b26\u53f7\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u53ef\u4ee5\u7528\u6211\u4eec\u81ea\u5df1\u7684so\u5e93\u4e2d\u7684\u51fd\u6570\u66ff\u6362\u539f\u6765\u5e93\u91cc\u6709\u7684\u51fd\u6570\uff0c\u4ece\u800c\u8fbe\u5230hook\u7684\u76ee\u7684\u3002\u8fd9\u548cWindows\u4e0b\u901a\u8fc7\u4fee\u6539import table\u6765hook API\u5f88\u7c7b\u4f3c\u3002\u76f8\u6bd4\u8f83\u4e4b\u4e0b\uff0cLD_PRELOAD\u66f4\u65b9\u4fbf\u4e86\uff0c\u90fd\u4e0d\u7528\u81ea\u5df1\u5199\u4ee3\u7801\u4e86\uff0c\u7cfb\u7edf\u7684loader\u4f1a\u5e2e\u6211\u4eec\u641e\u5b9a\u3002\u4f46\u662fLD_PRELOAD\u6709\u4e2a\u9650\u5236\uff1a\u53ea\u80fdhook\u52a8\u6001\u94fe\u63a5\u7684\u5e93\uff0c\u5bf9\u9759\u6001\u94fe\u63a5\u7684\u5e93\u65e0\u6548\uff0c\u56e0\u4e3a\u9759\u6001\u94fe\u63a5\u7684\u4ee3\u7801\u90fd\u5199\u5230\u53ef\u6267\u884c\u6587\u4ef6\u91cc\u4e86\u561b\uff0c\u6ca1\u6709\u5751\u8ba9\u4f60\u586b\u3002<\/p>\n<h6 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-2.\u5b83\u80fd\u8d77\u5230\u4ec0\u4e48\u4f5c\u7528\uff1f\">2.\u5b83\u80fd\u8d77\u5230\u4ec0\u4e48\u4f5c\u7528\uff1f<\/h6>\n<p>\u5b83\u7684\u4e3b\u8981\u529f\u80fd\u5c31\u662f\u7528\u6765\u6709\u9009\u62e9\u6027\u7684\u8f7d\u5165\u4e0d\u540c\u52a8\u6001\u94fe\u63a5\u5e93\u4e2d\u7684\u76f8\u540c\u51fd\u6570\u3002\u901a\u8fc7\u8fd9\u4e2a\u73af\u5883\u53d8\u91cf\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4e3b\u7a0b\u5e8f\u548c\u5176\u52a8\u6001\u94fe\u63a5\u5e93\u7684\u4e2d\u95f4\u52a0\u8f7d\u522b\u7684\u52a8\u6001\u94fe\u63a5\u5e93\uff0c\u751a\u81f3\u8986\u76d6\u6b63\u5e38\u7684\u51fd\u6570\u5e93\u3002\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u53ef\u4ee5\u4ee5\u6b64\u529f\u80fd\u6765\u4f7f\u7528\u81ea\u5df1\u7684\u6216\u662f\u66f4\u597d\u7684\u51fd\u6570\uff08\u65e0\u9700\u522b\u4eba\u7684\u6e90\u7801\uff09\uff0c\u800c\u53e6\u4e00\u65b9\u9762\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4ee5\u5411\u522b\u4eba\u7684\u7a0b\u5e8f\u6ce8\u5165\u6076\u610f\u7a0b\u5e8f\uff0c\u4ece\u800c\u8fbe\u5230\u90a3\u4e0d\u53ef\u544a\u4eba\u7684\u7f6a\u6076\u7684\u76ee\u7684\u3002<\/p>\n<h6 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-3.\u8be5\u5982\u4f55\u4f7f\u7528\u5b83\uff1f\">3.\u8be5\u5982\u4f55\u4f7f\u7528\u5b83\uff1f<\/h6>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeHeader panelHeader pdl\"><b>main.c<\/b><\/div>\n<div class=\"codeContent panelContent pdl\">\n<div id=\"highlighter_299599\" class=\"syntaxhighlighter sh-confluence nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">#include &lt;stdio.h&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">#include &lt;string.h&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">int<\/code>\u00a0<code class=\"java plain\">main(<\/code><code class=\"java keyword\">int<\/code>\u00a0<code class=\"java plain\">argc,\u00a0<\/code><code class=\"java keyword\">char<\/code>\u00a0<code class=\"java plain\">*argv[])<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">if<\/code><code class=\"java plain\">( strcmp(argv[<\/code><code class=\"java value\">1<\/code><code class=\"java plain\">],\u00a0<\/code><code class=\"java string\">\"test\"<\/code><code class=\"java plain\">) )<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">printf(<\/code><code class=\"java string\">\"Incorrect password\\n\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">else<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">printf(<\/code><code class=\"java string\">\"Correct password\\n\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">return<\/code>\u00a0<code class=\"java value\">0<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>&amp;<\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeHeader panelHeader pdl\"><b>hook.c<\/b><\/div>\n<div class=\"codeContent panelContent pdl\">\n<div id=\"highlighter_255064\" class=\"syntaxhighlighter sh-confluence nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">#include &lt;stdio.h&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">#include &lt;string.h&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java plain\">#include &lt;dlfcn.h&gt;<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">typedef\u00a0<\/code><code class=\"java keyword\">int<\/code><code class=\"java plain\">(*STRCMP)(<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code><code class=\"java plain\">*,\u00a0<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code><code class=\"java plain\">*);<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java keyword\">int<\/code>\u00a0<code class=\"java plain\">strcmp(<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code>\u00a0<code class=\"java plain\">*s1,\u00a0<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code>\u00a0<code class=\"java plain\">*s2)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">static<\/code>\u00a0<code class=\"java keyword\">void<\/code>\u00a0<code class=\"java plain\">*handle = NULL;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">static<\/code>\u00a0<code class=\"java plain\">STRCMP old_strcmp = NULL;<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">if<\/code><code class=\"java plain\">( !handle )<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">handle = dlopen(<\/code><code class=\"java string\">\"libc.so.6\"<\/code><code class=\"java plain\">, RTLD_LAZY);<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">old_strcmp = (STRCMP)dlsym(handle,\u00a0<\/code><code class=\"java string\">\"strcmp\"<\/code><code class=\"java plain\">);<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">}<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">printf(<\/code><code class=\"java string\">\"hack function invoked. s1=&lt;%s&gt; s2=&lt;%s&gt;\\n\"<\/code><code class=\"java plain\">, s1, s2);<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">return<\/code>\u00a0<code class=\"java plain\">old_strcmp(s1, s2);<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>\u56e0\u4e3ahook\u7684\u76ee\u6807\u662fstrcmp\uff0c\u6240\u4ee5typedef\u4e86\u4e00\u4e2aSTRCMP\u51fd\u6570\u6307\u9488\u3002\u7531\u4e8ehook\u7684\u76ee\u7684\u662f\u8981\u63a7\u5236\u51fd\u6570\u884c\u4e3a\uff0c\u6240\u4ee5\u9700\u8981\u4ece\u539f\u5e93libc.so.6\u4e2d\u62ff\u5230\u201c\u6b63\u7248\u201dstrcmp\u6307\u9488\uff0c\u4fdd\u5b58\u6210old_strcmp\u4ee5\u5907\u8c03\u7528\u3002<\/p>\n<p>&amp;<\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<div id=\"highlighter_902313\" class=\"syntaxhighlighter sh-confluence nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">$ gcc -o test main.c<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">$ gcc -fPIC -shared -o hook.so hook.c -ldl<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">$ LD_PRELOAD=.\/hook.so .\/test\u00a0<\/code><code class=\"java value\">123<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">hack function invoked. s1=&lt;<\/code><code class=\"java value\">123<\/code><code class=\"java plain\">&gt; s2=&lt;test&gt;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">Incorrect password<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">$ LD_PRELOAD=.\/hook.so .\/test test<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">hack function invoked. s1=&lt;test&gt; s2=&lt;test&gt;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">Correct password<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>\u5176\u4e2d\u6709\u4e00\u70b9\u4e0d\u7406\u89e3\u7684\u662f\uff0cdlopen\u6253\u5f00libc.so.6\u80fd\u62ff\u5230\u201c\u6b63\u7248\u201dstrcmp\u5730\u5740\uff0c\u6253\u5f00libc.so\u5c31\u662fhook\u540e\u7684\u5730\u5740\u3002\u7167\u7406\u8bf4libc.so\u4e0d\u662flibc.so.6\u7684\u4e00\u4e2a\u8f6f\u94fe\u5417\uff1f\u4e3a\u4ec0\u4e48\u7ed3\u679c\u4f1a\u4e0d\u4e00\u6837\u5462\uff1f<\/p>\n<p>&amp;<\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeHeader panelHeader pdl\"><b>hook2.c<\/b><\/div>\n<div class=\"codeContent panelContent pdl\">\n<div id=\"highlighter_723830\" class=\"syntaxhighlighter sh-confluence nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">#include &lt;stdio.h&gt;<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">#include &lt;string.h&gt;<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"java spaces\">\u00a0<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java keyword\">int<\/code>\u00a0<code class=\"java plain\">strcmp(<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code>\u00a0<code class=\"java plain\">*s1,\u00a0<\/code><code class=\"java keyword\">const<\/code>\u00a0<code class=\"java keyword\">char<\/code>\u00a0<code class=\"java plain\">*s2)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java plain\">printf(<\/code><code class=\"java string\">\"hack function invoked. s1=&lt;%s&gt; s2=&lt;%s&gt;\\n\"<\/code><code class=\"java plain\">, s1, s2);<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java comments\">\/* \u6c38\u8fdc\u8fd4\u56de0\uff0c\u8868\u793a\u4e24\u4e2a\u5b57\u7b26\u4e32\u76f8\u7b49 *\/<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"java keyword\">return<\/code>\u00a0<code class=\"java value\">0<\/code><code class=\"java plain\">;<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>&amp;<\/p>\n<div class=\"code panel pdl conf-macro output-block\" data-hasbody=\"true\" data-macro-name=\"code\">\n<div class=\"codeContent panelContent pdl\">\n<div id=\"highlighter_476128\" class=\"syntaxhighlighter sh-confluence nogutter java\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\" title=\"Hint: double-click to select code\">\n<div class=\"line number1 index0 alt2\"><code class=\"java plain\">$ gcc -o test main.c<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"java plain\">$ gcc -fPIC -shared -o hook2.so hook2.c -ldl<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"java plain\">$ .\/test\u00a0<\/code><code class=\"java value\">123<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"java plain\">hack function invoked. s1=&lt;<\/code><code class=\"java value\">123<\/code><code class=\"java plain\">&gt; s2=&lt;test&gt;<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"java plain\">Correct password<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"java plain\">$ LD_PRELOAD=.\/hook2.so .\/test test<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"java plain\">hack function invoked. s1=&lt;test&gt; s2=&lt;test&gt;<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"java plain\">Correct password<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<h6 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-4.\u603b\u7ed3\">4.\u603b\u7ed3<\/h6>\n<p>\u5728\u6211\u4eec\u7f16\u7a0b\u65f6\uff0c\u6211\u4eec\u8981\u968f\u65f6\u8b66\u60d5\u7740LD_PRELOAD\u3002<\/p>\n<p><strong>\u5982\u4f55\u907f\u514d<\/strong><\/p>\n<p>\u4e0d\u53ef\u5426\u8ba4\uff0cLD_PRELOAD\u662f\u4e00\u4e2a\u5f88\u96be\u7f20\u7684\u95ee\u9898\u3002\u76ee\u524d\u6765\u8bf4\uff0c\u8981\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u53ea\u80fd\u60f3\u65b9\u8bbe\u6cd5\u8ba9LD_PRELOAD\u5931\u6548\u3002\u76ee\u524d\u800c\u8a00\uff0c\u6709\u4ee5\u4e0b\u9762\u4e24\u79cd\u65b9\u6cd5\u53ef\u4ee5\u8ba9LD_PRELOAD\u5931\u6548\u3002<\/p>\n<p>1\uff09\u901a\u8fc7\u9759\u6001\u94fe\u63a5\u3002\u4f7f\u7528gcc\u7684-static\u53c2\u6570\u53ef\u4ee5\u628a<a class=\"external-link\" href=\"http:\/\/libc.so\/\" target=\"_blank\" rel=\"nofollow\">libc.so<\/a>.6\u9759\u6001\u94fe\u5165\u6267\u884c\u7a0b\u5e8f\u4e2d\u3002\u4f46\u8fd9\u4e5f\u5c31\u610f\u5473\u7740\u4f60\u7684\u7a0b\u5e8f\u4e0d\u518d\u652f\u6301\u52a8\u6001\u94fe\u63a5\u3002<\/p>\n<p>2\uff09\u901a\u8fc7\u8bbe\u7f6e\u6267\u884c\u6587\u4ef6\u7684setgid \/ setuid\u6807\u5fd7\u3002\u5728\u6709SUID\u6743\u9650\u7684\u6267\u884c\u6587\u4ef6\uff0c\u7cfb\u7edf\u4f1a\u5ffd\u7565LD_PRELOAD\u73af\u5883\u53d8\u91cf\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5982\u679c\u4f60\u6709\u4ee5root\u65b9\u5f0f\u8fd0\u884c\u7684\u7a0b\u5e8f\uff0c\u6700\u597d\u8bbe\u7f6e\u4e0aSUID\u6743\u9650\u3002\uff08\u5982\uff1achmod 4755 daemon\uff09<\/p>\n<p>\u5728\u4e00\u4e9bUNIX\u7248\u672c\u4e0a\uff0c\u5982\u679c\u4f60\u60f3\u8981\u4f7f\u7528LD_PRELOAD\u73af\u5883\u53d8\u91cf\uff0c\u4f60\u9700\u8981\u6709root\u6743\u9650\u3002\u4f46\u4e0d\u7ba1\u600e\u4e48\u8bf4\uff0c\u8fd9\u4e9b\u4e2a\u65b9\u6cd5\u76ee\u524d\u6765\u770b\u5e76\u4e0d\u662f\u4e00\u4e2a\u5f7b\u5e95\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u53ea\u662f\u4e00\u4e2aWorkaround\u7684\u65b9\u6cd5\uff0c\u662f\u4e00\u79cd\u56e0\u564e\u5e9f\u98df\u7684\u505a\u6cd5\uff0c\u4e3a\u4e86\u5b89\u5168\uff0c\u53ea\u80fd\u7981\u7528\u3002<\/p>\n<h5 id=\"Linux\u7684LD_PRELOAD\u76f8\u5173\u77e5\u8bc6\u5b66\u4e60-\u53c2\u8003\u94fe\u63a5\uff1a\">\u53c2\u8003\u94fe\u63a5\uff1a<\/h5>\n<ul>\n<li>C++\u9759\u6001\u5e93\u4e0e\u52a8\u6001\u5e93 #\u5168\u9762\u7ec6\u81f4<br \/>\n<a class=\"external-link\" href=\"http:\/\/www.cnblogs.com\/skynet\/p\/3372855.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/www.cnblogs.com\/skynet\/p\/3372855.html<\/a><\/li>\n<li>\u4e3a\u4ec0\u4e48\u6211\u53cd\u5bf9\u666e\u904d\u5730\u9759\u6001\u94fe\u63a5\uff1f #\u633a\u597d\u7684<br \/>\n<a class=\"external-link\" href=\"https:\/\/blog.lilydjwg.me\/2015\/5\/11\/why-i-m-against-static-linking.92218.html\" target=\"_blank\" rel=\"nofollow\">https:\/\/blog.lilydjwg.me\/2015\/5\/11\/why-i-m-against-static-linking.92218.html<\/a><\/li>\n<li>\u4f55\u65f6\u4f7f\u7528\u52a8\u6001\u94fe\u63a5\u548c\u9759\u6001\u94fe\u63a5<br \/>\n<a class=\"external-link\" href=\"https:\/\/www.ibm.com\/support\/knowledgecenter\/zh\/ssw_aix_71\/com.ibm.aix.performance\/when_dyn_linking_static_linking.htm\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.ibm.com\/support\/knowledgecenter\/zh\/ssw_aix_71\/com.ibm.aix.performance\/when_dyn_linking_static_linking.htm<\/a><\/li>\n<li>\u9759\u6001\u94fe\u63a5\u4e0e\u52a8\u6001\u94fe\u63a5\u7684\u533a\u522b<br \/>\n<a class=\"external-link\" href=\"http:\/\/www.cnblogs.com\/kex1n\/archive\/2011\/09\/06\/2168435.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/www.cnblogs.com\/kex1n\/archive\/2011\/09\/06\/2168435.html<\/a><\/li>\n<li>Linux\u4e0b\u9759\u6001\u94fe\u63a5\u5e93\u4e0e\u52a8\u6001\u94fe\u63a5\u5e93\u7684\u533a\u522b<br \/>\n<a class=\"external-link\" href=\"http:\/\/blog.csdn.net\/rich_baba\/article\/details\/6138110\" target=\"_blank\" rel=\"nofollow\">http:\/\/blog.csdn.net\/rich_baba\/article\/details\/6138110<\/a><\/li>\n<\/ul>\n<p>==<\/p>\n<ul>\n<li>\u8b66\u60d5UNIX\u4e0b\u7684LD_PRELOAD\u73af\u5883\u53d8\u91cf #\u6700\u4e3a\u5168\u9762\u7ec6\u81f4<br \/>\n<a class=\"external-link\" href=\"http:\/\/blog.csdn.net\/haoel\/article\/details\/1602108\" target=\"_blank\" rel=\"nofollow\">http:\/\/blog.csdn.net\/haoel\/article\/details\/1602108<\/a><br \/>\n<a class=\"external-link\" href=\"http:\/\/man7.org\/linux\/man-pages\/man8\/ld.so.8.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/man7.org\/linux\/man-pages\/man8\/ld.so.8.html<\/a><br \/>\n<a class=\"external-link\" href=\"http:\/\/tldp.org\/HOWTO\/Program-Library-HOWTO\/shared-libraries.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/tldp.org\/HOWTO\/Program-Library-HOWTO\/shared-libraries.html<\/a><\/li>\n<li>\u5728Linux\u7cfb\u7edf\u4e2d\u5982\u4f55\u5c01\u88c5\u4e00\u4e2a\u7cfb\u7edf\u8c03\u7528(libc\u7684\u51fd\u6570)<br \/>\n<a class=\"external-link\" href=\"http:\/\/samanbarghi.com\/blog\/2014\/09\/05\/how-to-wrap-a-system-call-libc-function-in-linux\/\" target=\"_blank\" rel=\"nofollow\">http:\/\/samanbarghi.com\/blog\/2014\/09\/05\/how-to-wrap-a-system-call-libc-function-in-linux\/<\/a><\/li>\n<li>\u5229\u7528LD_PRELOAD\u8fdb\u884chook<br \/>\n<a class=\"external-link\" href=\"http:\/\/hbprotoss.github.io\/posts\/li-yong-ld_preloadjin-xing-hook.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/hbprotoss.github.io\/posts\/li-yong-ld_preloadjin-xing-hook.html<\/a><\/li>\n<li>LD_PRELOAD\u7684\u90a3\u4e9b\u4e8b<br \/>\n<a class=\"external-link\" href=\"https:\/\/www.zzsec.org\/2013\/04\/something-about-ld_preload\/\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.zzsec.org\/2013\/04\/something-about-ld_preload\/<\/a><\/li>\n<li>LD_PRELOAD\u7684\u5077\u6881\u6362\u67f1\u4e4b\u80fd<br \/>\n<a class=\"external-link\" href=\"http:\/\/www.cnblogs.com\/net66\/p\/5609026.html\" target=\"_blank\" rel=\"nofollow\">http:\/\/www.cnblogs.com\/net66\/p\/5609026.html<\/a><\/li>\n<li>What is the LD_PRELOAD trick? #\u5355\u4e2a\u66ff\u6362\u7528LD_PRELOAD\uff0c\u6279\u91cf\u66ff\u6362\u7528LD_LIBRARY_PATH<br \/>\n<a class=\"external-link\" href=\"http:\/\/stackoverflow.com\/questions\/426230\/what-is-the-ld-preload-trick\" target=\"_blank\" rel=\"nofollow\">http:\/\/stackoverflow.com\/questions\/426230\/what-is-the-ld-preload-trick<\/a><\/li>\n<li>LD_PRELOAD<br \/>\n<a class=\"external-link\" href=\"http:\/\/0cx.cc\/linux_ld_preload.jspx\" target=\"_blank\" rel=\"nofollow\">http:\/\/0cx.cc\/linux_ld_preload.jspx<\/a><\/li>\n<li>\u5728Linux\u7cfb\u7edf\u4e0a\u6709\u4ec0\u4e48\u529e\u6cd5\u53ef\u4ee5\u9650\u5236LD_PRELOAD \u548c LD_LIBRARY_PATH\u8fd9\u4e24\u4e2a\u53d8\u91cf\u7684\u4f7f\u7528\u4e48\uff1f<br \/>\n<a class=\"external-link\" href=\"http:\/\/security.stackexchange.com\/questions\/63599\/is-there-any-way-to-block-ld-preload-and-ld-library-path-on-linux\" target=\"_blank\" rel=\"nofollow\">http:\/\/security.stackexchange.com\/questions\/63599\/is-there-any-way-to-block-ld-preload-and-ld-library-path-on-linux<\/a><\/li>\n<\/ul>\n<p>=END=<\/p>\n","protected":false},"excerpt":{"rendered":"<p>=Start= \u7f18\u7531\uff1a \u4e00\u63d0\u8d77LD_PRELOAD\u5c31\u4f1a\u8ba9\u6211\u60f3\u8d77\u4e4b\u524d\u72af\u7684\u4e00\u4e2a\u9519\u8bef\u2014\u2014\u76f4\u63a5\u66ff\u6362\u7cfb\u7edf\u7684glibc\u52a8\u6001 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,11,7,25],"tags":[727,574,30],"class_list":["post-3137","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-linux","category-programing","category-security","tag-dlsym","tag-ld_preload","tag-linux"],"views":10289,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/3137","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/comments?post=3137"}],"version-history":[{"count":0,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/3137\/revisions"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=3137"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=3137"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=3137"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}