Category: Reading_note

《0day安全:软件漏洞分析技术》读书笔记

漏洞 功能性逻辑缺陷 影响软件的正常功能,例如,执行结果错误,图标显示错误等。 安全性逻辑缺陷 通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码。常见的漏洞包括软件中的缓冲区溢出漏洞,网站中的跨站脚本漏洞(xss),sql注入漏洞。 栈溢出漏洞 程序中没有对参数长度进行限制,导致数据在栈中溢出,覆盖掉ebp寄存器,函数返回地址等重要位置,这可能引发代码执行。 原理 在一个完整函数调用中,通常包含以下过程: 1.调用阶段:压入参数、函数返回地址、 2.执行阶段:保存现场,用esp指向栈顶,ebp指向栈底。进行一系列操作后,还原现场。ret返回。 3.获取结果:将eax或者保存在其他内存或寄存器中的结果取出。 在第二阶段,程序若是接受了过长的参数,则可能突破原有的界限。数据在栈中是向下增长的,那么就可能覆盖掉下方的函数返回地址。 第三章 开发shellcode的艺术。 shellcode这个专用术语来通称缓冲区溢出攻击中植入进程的代码。shellcode往往需要汇编语言编写,并转换成二进制机器码,其内容和长度还会受到很多苛刻限制,故开发和调试难度很高。 shellcode在内存中的地址是动态变化,简单的函数返回地址覆盖为固定值往往不能奏效。 在函数跳转到函数返回地址所设置的shellcode首部后,esp寄存器指向的是函数返回地址的后一位置。 在程序中搜索jmp esp/eax/ebx/esi (od插件OllyUni.dll),再填入该指令的地址到函数返回位置。预先布置好函数返回地址下面的shellcode内容,这样就可以利用“跳板”精确地跳回栈区。 缓冲区中,shellcode的组织方式有三种: 1. 静态地填充函数返回地址 2. jmp esp方式精确定位栈区 3. jmp esp方式跳入函数返回地址下方,再jmp esp-x,回到shellcode首部。 * 注意shellcode中push指令有破坏shellcode自身的风险,所以在有控制权后,要抬高栈顶。 在实际运用中,为了shellcode的通用性考虑,需要为Shellcode开发动态获取API函数地址的功能。 第五章 堆溢出利用 堆是由操作系统管理的内存,程序员用时需要向操作系统申请,使用后需要释放内存,并将指向堆内存的指针指向null。 在windows系统中,占用态的堆块被使用它的程序索引,堆表只索引所有空闲态的堆块。其中,最重要的堆表有两种:空闲双向链表Freelist(简称空表),和快速单向链表Lookaside(简称快表)。 管理堆内存的方式和具体的操作系统版本有很大关联,在分析时要格外注意。 空表初始化时的状态 只有空闲的大块,这个块被称作“尾块”。 Freelist[0] 位于堆偏移0x178处。 尾块位于0x688处(启动快表后这个位置将是快表)。 Freelist[0]指向“尾块” 空表中除了第一个元素,其余各项索引都指向自己,这意味着其余所有空闲链表中都设有空闲块。 占用态堆块结构和空闲态堆块结构的区别 结构基本一致,区别在于在空闲堆块内存在两个指针,分别指向上一个节点(Flink in freelist)和下一个节点(Blink in freelist)。 堆块的分配 堆块的大小包括了块首在内,即如果请求32字节,实际会分配的堆块为40字节:8字节块首+32字节块身。 堆块的单位是八字节,不足八字节的部分按照八字节分配。 […]

《汇编语言》读书笔记

第一章 基础知识 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令时一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算, 早期的程序设计均使用机器语言。程序员们将用0,1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔。然后再将程序通过纸带机或卡片机输入计算机进行运算。 汇编语言是直接在硬件之上工作的编程语言。 第十一章 标志寄存器 标志寄存器的第六位是zf零标志位。它记录相关指令执行后,其结果是否为0.如果结果为0,那么zf=1,如果结果不为0,那么zf = 0.

《白帽子讲web安全》读书笔记

白帽子讲web安全 内容提要 全书分为四大篇共18章,读者可以通过浏览目录以进一步了解各篇章的内容。在有的章节末尾,还附上了笔者曾经写过的一些博客文章,可以作为延伸阅读以及本书正文的补充。 第一章 我的安全世界观是全书的纲领。在此篇中先回顾了安全的历史了,然后阐述了笔者对于安全的看法与态度,并提出了一些思考问题的方式以及做事的方法。理解了本篇,就能明白全书中所涉及的解决方案在抰择时的取舍。 第二章 客户端脚本安全就当前比较流行的客户端脚本攻击进行了深入阐述。当网站的安全做到一定程度后,黑客可能难以再找到类似注入攻击,脚本执行等高风险的漏洞,从而可能将注意力转移到客户端脚本攻击上。 第三章 服务器端应用安全就常见的服务端应用安全问题进行了阐述。这些问题往往能引起非常严重的后果,在网站的安全建设之初需要优先解决这些问题,避免留下任何隐患。 第四章 互联网公司安全运营提出了一个大安全运营的思想。安全是一个持续的过程,最终仍然要由安全工程师来保证结果。 第一章 我的安全世界观 安全三要素 机密性 要求保护数据内容不能泄露,加密是实现机密性伊奥求的常见手段。 完整性 完整性则要求保护数据内容是完整的,没有被纂改的,常见的保证一致性的技术手段是数字签名。 可用性 要求保护资源是“随需而得”。 安全守则 Secure by default 最小权限原则 纵深防御原则 数据与代码分离原则 不可预测性原则 第二章 浏览器安全 在网页中插入一段恶意代码,利用浏览器漏洞执行恶意代码的攻击方式,被称为“挂马”。 第三章 跨站脚本攻击(XSS) 反射型xss 反射型xss只是简单的把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型xss也叫做“非持久型xss”。 存储型xss 存储型xss会把用户输入的数据“存储”在服务器端,具有很强的稳定性。 xss 第四章 跨站点请求伪造 CSRF(Cross Site Request Forgery)是一种常见的web攻击,很多开发者对它很陌生,CSRF也是web安全中最容易被忽略的一种攻击方式。甚至很多安全工程师都不太理解它的利用条件与危害。伊尼茨不予重视。但CSRF在某种时候却能够产生强大的破坏性。 浏览器所持有的Cookie分为两种,一种是“Sesion Cookie”,又称“临时 Cookie”;另一种是“Third-party cookie”,也被称为“本地Cookie”。 “Third-party cookie”是服务器在“Set-Cookie”时指定了Expire时间,只有到Expire时间后Cookie才会失效,所以这种Cookie会保持在本地;而Sesion Cookie保存在浏览器进程的内存空间中;而“Third-party Cookie”则保存在本地。 主流浏览器,存在拦截在<img>,<script>,<link>等标签中发送第三方Cookie的行动。 第七章 注入攻击 […]

《IDA pro权威指南》 读书笔记

《IDA pro权威指南》 内容提要 本书共分为六部分,首先介绍了反汇编与逆向工程的基本信息和IDA pro的背景知识,接着讨论了IDA pro的基本用法和高级用法,然后讲解了其高扩展性及其在安全领域的实际应用,最后介绍了IDA的内置调试器。 本书适合IT领域的所有安全工作者阅读。 第四章 IDA入门 LDB文件 通常人们说的IDA数据库,指的是IDB文件。是由IDA分析文件时产生的:.id0,.id1,.nam和.til这四个文件压缩而成的。 IDA一旦为某个可执行文件创建数据库,它就不用访问可执行文件,除非希望使用IDA的集成调试器调试可执行文件本身。 在分析一个恶意软件样本时,只需在分析人员之间传递相关数据库,而不必传递可执行的恶意文件本身。 第七章 反汇编操作 IDA提供的一项最强大的功能能够帮助你轻松操作反汇编代码,在其中添加新的信息或重新格式化一个代码清单,以满足你的特殊要求。 基本代码转换 将数据转换为代码 代码转换为数据 指定一个指令序列为函数 更改现有函数的起始或结束地址 更改指令操作数的显示格式 无论你出于什么原因希望对汇编代码重新格式化,这个过程都相当简单。在重新格式化之前,首先删除其当前的格式。右击你希望取消的项目,在结果上下文菜单中选择Undefine,即可取消函数、代码、或者数据的定义。取消定义将会得到未分类的字节。我们几乎可以以任何方式重新对它们进行格式化。 基本数据转换 指定数据大小 处理字符串 指定数组 在单击数据可快速选择需要转换的类型,或者在Edit菜单中选择具体的操作。 第九章 交叉引用与绘图功能 ida有两种基本的交叉引用,代码交叉引用和数据交叉引用,代码交叉引用都与一种方向表示法有关,所有的交叉引用都是在一个地址引用另一个地址。 代码交叉引用 代码交叉引用用于表示一条指令将控制权转交给另一条指令。在ida中,指令转交控制权的方式叫做流(flow)。ida有三种基本流:普通流、跳转流和调用流。 数据交叉引用 数据交叉引用用于跟踪二进制文件访问数据的方式。 读取交叉引用 读取交叉引用用于表示访问的是某个内存位置的内容。 写入交叉引用 写入交叉引用指示了修改变量内容的程序位置。写入交叉引用使用后缀w。 (*)一般而言,以一个程序指令字节为目标的写入交叉引用表示这是一段自修改代码。 偏移量交叉引用 偏移量交叉引用,它表示引用的某个位置的地址。 交叉引用列表 双击交叉引用地址,反汇编窗口将跳转到交叉引用的源位置。查看某个位置的交叉引用完整列表,将光标放在一个或多个交叉引用的目标地址上,并选择View->Open Subviews->Cross References,即可打开指定位置的交叉引用完整列表。(热键Ctrl+x) Hex-Rays 中的交叉引用列表 在伪c代码界面,将光标放在感兴趣的目标上,右击选择Jump to xref即可。 函数调用 有一种交叉引用列表专门处理函数调用,选择View->Open Subviews->Function calls即可打开该窗口。上半部分显示调用当前函数的位置。下半部分显示了当前函数做出的全部调用。 […]

《Android 软件安全与逆向分析》读书笔记

第二章 如何分析android 程序 ApkTool是跨平台的反编译工具,可以生成smali格式的反汇编代码、重新编译生成apk文件并签名。   第三章 进入 Android Dalvik虚拟机 Dalvik虚拟机是android的核心组件,拥有一套完整的指令系统,专有的dex可执行文件格式,执行更快。Dalvik指令是Dalvik虚拟机为自己专门设计的一套指令集,并且制定了自己的指令格式与调用规范。   smali语言是Dalvik虚拟机的寄存器语言,与传统的汇编语言类似,但是有一套自己的类型、方法、与字段表示方法。Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器(所有操作都基于寄存器来完成)的。   smali文件可以通过backsmali和smali这两种第三方库jar与dex文件互相转换。   第四章 android 可执行文件 DEX是Dalvik虚拟机专用的可执行文件格式。  

《第一行代码 Android》 读书笔记

第一章 开始启程,你的第一行android代码 Android是目前世界上市场占有率最高的移动操作系统。 系统架构 1.linux 内核层 Android系统基于linux2.6内核。这一层为Android设备的各种硬件提供了底层驱动。 2.系统 运行库层 这一层通过一些 C/C++ 库为Android系统提供了主要的特性支持。 3.应用框架层 主要提供了各种API。 4.应用层 所有应用程序属于这层。 四大组件 活动 (Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Content Provider)。   编译环境 Android stdio是google推出的一个集成开发环境。是自动化程度较高的一款IDE,对于硬盘空间有一定要求,最好在安装前在系统盘预留10-20G的空闲空间。   logcat是便于用户调试的日志工具,Android stdio中集成了这个工具,只需要写下log调试代码,运行程序时相关记录就会输出在日志窗口。 AVD manager 是管理虚拟移动设备的工具。可以构造任意的安卓模拟器,在配置较低的机器上运行流畅度不高,存在兼容性问题导致无法持久稳定运行。 第二章 先从看得到的入手 探究活动 活动(Activity)是一种可以包含用户界面的组件,主语用于与用户交互。是应用界面与响应用户互动的消息函数的集合。任何活动必须先要在AndroidManifest.xml文件中注册才可以生效。   活动的状态 1.运行状态 当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是出于运行状态的活动,因为这会带来非常差的用户体验。 2.暂停状态 当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态时。 3.停止状态 当一个活动不再处于栈顶位置,且完全不可见时,就进入了停止状态。当其他地方需要内存时,处于停止状态的活动有可能会被系统回收。 4.销毁状态 当一个活动从返回栈中弹出后就变成了销毁状态。   活动的启动模式 1.standard 默认模式,按照标准的返回栈运作。 2.single top 当启动新活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会创建新的活动实例。 3.single task 活动在整个返回栈中只有一份实例。 […]

《C++反汇编与逆向分析技术揭秘》读书笔记

第一章  准备工作 第二章 基本数据类型的表现形式 小尾方式 小尾方式存放的是以字节为单位,按照数据类型长度,低数据位排放在内存的低端,高数据排放在内存的高端,如0x12345678将会存储为 78 56 34 12,相应的,在其他计算机体系中也有“大尾方式”,其数据和“小尾方式”相反,高数据位存放在内存的高端。   补码 补码的规则是用0减去这个数的绝对值,也可以简单表达为对这个数值取反+1.   浮点数 用于存储实数的类型,又可以分为单精度浮点型(float)和双精度浮点型(double)。在处理浮点类型时,有专门的浮点寄存器,和专用的浮点汇编指令。   指针的概念有两点较为关键: 1.指针本质是存储地址的变量。 2.指针自身的加减法与指针指向的变量类型相关。   引用类型也可以认为是C++通过追加规则,对指针的封装减少不安全操作的可能。   函数 函数一般用来实现某一专门运算目的而特别编写的,具有通用性的代码块。从汇编角度来说,通常完整的函数调用过程可以被解释成: 1.调用阶段:压入参数、函数返回地址、 2.执行阶段:保存现场,用esp指向栈顶,ebp指向栈底。进行一系列操作后,还原现场。ret返回。 3.获取结果:将eax或者保存在其他内存或寄存器中的结果取出。   其中,为了平衡堆栈,以及确认参数的平衡者,参数的传递方式,有了函数的调用约定。   第七章 变量在内存中的位置和访问方式 变量是指一段内存块,有起始地址,占用内存空间的大小,还有计算机以何种形式读写变量中的数据。 全局变量特征 – 所在地址为数据区,生命周期与所在模块一致。 – 使用立即数简介访问。 局部变量特征 – 所在地址为栈区,生命周期与所在的函数作用域一致。 – 使用ebp或esp访问。 全局静态变量和全局变量类似,只是全局静态变量只能在本文件内使用。全局静态变量等价于编译器限制外部源码文件访问的全局变量。 系统为局部静态变量设置一个标志,标志占一个字节。以此判断局部静态变量是否已经被初始化。 在c/c++中,使用malloc与new实现堆空间的申请,返回的数据便是申请的堆空间地址。 第九章 结构体和类 This 指针,是指向类变量的自身的指针。 编译器在成员函数中隐藏了This指针,调用类的成员函数时,会传入类变量的首地址。 thiscall 方式要点分析: lea […]

《C++ Primer》读书笔记

“完美的程序设计语言”,听起来很好,但代价是语言变得越来越复杂。语言的复杂性导致学习难度增加,学习周期变长。   在实践中,不必全面地使用C++语言的各种特性,而应根据工程项目的实际情况。灵活取舍。通常只鼓励使用C++语言的一个子集就足够了。一个值得学习和参考的例子是Google发布的Google C++ Style Guide.   C++是一门静态类型语言,它的类型检查发生在编译时。而Python、smalltalk语言等在程序运行时检查数据类型。   C++11是2011年,C++标准委员会发布了ISO标准的一个重要修订版。此修订版是C++进化过程中的最新一步。延续了前几个版本对编程效率的强调。   新标准的主要目标是: · 使语言更为统一,更易于教学。 · 使标准库更简单,安全、使用更高效。 · 使编写高效率的抽象和库变得更简单。   C++11 特性: lambda 表达式 lambda表达式可以简单的认为是匿名函数,为了增加代码耦合性而设计的,简短的函数。与普通函数不同,lambda可能定义在函数内部。一个lambda表达式具有如下形式: [capture list](parameter list) -> return type { function body } 一个语法正确 的lambda表达式必须包含捕获列表和函数体。 列表初始化。是由花括号的形式来初始化变量。重要特点,如果初始值有丢失信息的风险,将会报错。 nullptr 是一种特殊类型的字面值,代表空指针。 auto 类型,由初始值自动推断变量类型。 decltype 从表达式类型推断变量类型。 range_for 简易版for循环,用于遍历某种容器。形式如下 for temp_val : list pass. 智能指针,shared_ptr 和 unique_ptr,unique_ptr独占指向的对象。shared_ptr 允许多个指针真指向同一对象,当没有指针指向对象时,将自动释放占用的内存。 ============ […]

《Wireshark数据包分析实战》读书笔记

第一章 数据包分析技术与网络基础 数据包分析,通常也被称为数据包嗅探或协议分析,指的是捕获和解析网络上在线传输数据的过程。   第二章 监听网络线路 略   第三章 Wireshark入门 略   第四章 玩转捕获数据包 wireshark实际抓包中,可通过过滤器的方式达到专注于手头的数据包的目标。   第五章 Wireshark高级特性 略 第六章 通用底层网络协议 略 第七章 常见高层网络协议 略 第八章 基础的现实世界场景 略   第九章 让网络不再卡 TCP重传,重传数据包是TCP最基本的错误恢复特性之一,它被设计用来对付数据包丢失。   TCP重复确认和快速重传 初始序号是握手过程中交换的最重要信息之一。一旦设置好连接两端的ISN。接下来传输的每一个数据包都将按照数据载荷的大小增长序号。 接收数据的序号 + 接收数据的字节数 = 发出的确认号 第十章 安全领域的数据包分析 略 第十一章 无线网络数据包分析 略

《图解tcp/ip》读书笔记

第一章 网络基础知识 OSI参考模型 应用层 为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登录(虚拟终端)等协议。 表示层 将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。 会话层 负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。   传输层 起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。   网络层 将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主要负责寻址和路由选择。   数据链路层 负责物理层面上互连的、节点之间的通信传输。例如与一个以太网相连的2个节点之间的通信。   物理层 负责0,1比特流与电压的高低,光的闪灭之间的互换。   计算机网络 计算机网络根据其规模可分为WAN(Wide Area Network,广域网)和LAN(Local Area Network,局域网)。 计算机网络最初的目的是连接一个个独立的计算机,使它们组成一个更强的计算环境。   协议 协议就是计算机与计算机之间通过网络实现通信时事先达成的一种“约定”。这种“约定”使哪些由不同厂商的设备、不同的CPU以及不同的操作系统组成的计算机之间,只要遵守相同的协议就可以实现通信。   网络通信方式 1.电路交换 2.分组交换 为解决电路交换中独占整个电路的问题,人们让连接到通信电路的计算机将所要发送的数据分成多个数据包,按照一定的顺序排列之后分别发送,这就是分组交换。   在分组交换中,由分组交换机(路由器)连接通信线路。分组交换的大致处理过程是:发送端计算机将数据分组发送给路由器。路由器收到这些分组数据以后,缓存到自己的缓冲区。然后再转发给目标计算机。因此,分组交换也有另一个名称:蓄积交换。   网络通信方式又可以按接收端数量分为:单播、多播、广播、任播。   mac地址 mac地址由设备的制造厂商针对每块网卡进行分别指定,人们可以通过制造商识别号。制造商内部产品编号以及产品通用编号确保mac地址的唯一性。   构成网路的要素 网卡 任何一台计算机连接网络时,必须要使用网卡。   中继器 是在OSI模型的第一层–物理层面上延长网络的设备。   网桥/二层交换机 网桥是在OSI模型的第二层–数据链路层上连接两个网络的设备。   […]