说明 这里只讨论 x86 架构。
Before the kernel MBR and BIOS 传统的操作系统都是通过 MBR 分区格式和 BIOS 来启动。简单来讲:
当计算机系统上电开机或者按了机箱上的复位按钮;此时 80x86 结构的 CPU 将自动进入实模式。
CPU会自动把代码段寄存器 CS
设置为0xF000,其段基地址则被设置为 0xFFFF0000,段长度设置为 64KB。而 IP 被设置为 0xFFF0,因此此时 CPU 代码指针指向 0xFFFFFFF0 处,即 4G 空间最后一个 64K 的最后 16 字节处;
这里正是系统 ROM BIOS 存放的位置。并且 BIOS 会在这里存放一条跳转指令 JMP 跳转到 BIOS 代码中 64KB 范围内的某一条指令开始执行。这部分官方内容可以在 Intel 手册的 11.1.1 章节看到:
阅读此文
目前主力机是一台 macbookpro,搭载 apple silicon 芯片,需要运行 x86 的虚拟机。
安装 QEMU 使用 brew 安装(官方推荐):
创建磁盘 qcow2
是 linux 世界中使用最广的一种磁盘格式(虽然我们是在 macos 上,但是 QEMU 起源于 linux 平台),我们选择该格式作为我们虚拟磁盘的格式。然后linux_hd.qcow2
是虚拟磁盘文件名,自己更改。最后就是磁盘大小,小 linux 系统设置成 20G 即可。
1 qemu-img create -f qcow2 linux_hd.qcow2 20G
阅读此文
某相安全平台加密,除Main类外,其他class文件均被加密,熵值非常高
除jar外,还有一个.so
文件。在启动时,需要指定-agentpath:./.so
命令行参数。由于未确定其加固方案(比如xjar ),于是手动逆向其流程。
基本启动流程 jvm在指定-agentpath:./.so
后,会先加载此so文件,然后运行此入口函数:
1 JNIEXPORT jint JNICALL Agent_OnLoad (JavaVM *vm,char *options,void *reserved)
参考:Java Agent机制 · 攻击Java Web应用-[Java Web安全] 容易推测,jvm会先通过此入口函数进行初始化,包括实现一个Loader,其在运行时会对Class文件进行解密。
阅读此文
AWD(Attack With Defense,攻防兼备)是一个非常有意思的模式,你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说,攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人得分,以防扣分。 这种模式非常激烈,赛前准备要非常充分,手上要有充足的防守方案和 EXP 攻击脚本,而且参赛越多,积累的经验就越多,获胜的希望就越大。
常见形式 常见的形式是这样: 每个队伍拥有四台服务器。其中三台服务器运行了一个Web服务,即网站服务。剩余一台(通常被称为Pwn服务器)运行一个网络服务,通常是一个在后台运行的二进制程序,通过TCP的某个端口对外提供服务。并且,每个队伍拥有的四台服务器都是一样的。 在三台Web服务器中,比赛主办方会在每个主机上预置一个或多个后门/漏洞。同样的,在剩下的一台服务器上的二进制程序里也会被预置二进制漏洞(跟Pwn题一样)。
比赛方法 在开始比赛前,通常会有一段时间(一般是30分钟)的加固时间。选手们要在这段时间内备份网站、安装防火墙、加固服务器,以防后续比赛时间被对手打穿。另外,队伍需要分工明确,在其他队友加固服务器的同时,另外的队友应该将备份的服务器文件下载,然后对其进行代码审计和漏洞挖掘(Web手)、逆向与二进制漏洞分析(Pwn手)。在发现漏洞后,及时对自身网站进行漏洞修补与加固。 比赛开始后分为两种情况,一种是主办方给出所有队伍服务器的IP地址,另一种情况是给一个网段,对手的服务器IP需要通过扫描等方法进行发现。 比赛将分为很多轮(一般可能是10分钟)。每轮开始,在每台服务器的某个地方(一般是根目录)会放置一个flag文件(每个队伍每台主机都不一样)。选手们需要通过挖掘到的漏洞编写漏洞利用代码(Exp),然后对其他队伍的服务器进行攻击并最终获取shell执行权限(getshell)或者通过文件读漏洞来读取对手服务器根目录下的flag文件,并向比赛平台提交flag。当攻击方成功攻击对手服务器并提交flag后,攻击方将获得一定的分数,同时防守方将丢失一定的分数(一般来讲,同一台机器被攻击会被扣除固定分数,而所有对这台服务器攻击成功的队伍将平分这些分数)。 在攻击的同时,也要注意自身服务器的防护。当自己的服务器被对手攻击提交flag后,队伍将被扣分。并且要防止服务器不要被破坏,因为每轮(一般是结束时)比赛时比赛平台会对所有队伍的服务器进行check,即检查服务是否正常运转。若出现服务被对手或自己破坏以至于无法提供正常服务的情况,平台将对其队伍进行扣分,同时其他队伍获得相应的加分。 每轮结束后将开始新一轮,此时所有flag文件将刷新,以开始新一轮的攻击和得分。若队伍发现自己服务器服务被破坏,此时可以刷新服务器回到初始状态。否则在比赛途中手动进行刷新服务器操作将导致扣分。 一般的比赛平台为了让比赛保持激烈的状态,会开放自动提交flag的API。即可以通过脚本更加方便地向比赛平台提交flag。
通用技巧 Web漏洞扫描可以使用例如D盾这样的工具,可以快速发现明显的Web后门。代码审计可以用Seay或者Fortify这样的工具。 一般AWD比赛禁止联网,所以队友间文件共享和通信可以使用FeiQ这样的内网通讯工具来进行。 当网站文件被修改,例如被植入木马的情况下,我们可以使用DiffMerge、Beyond Compare这样的工具来对比源文件进行检查。
阅读此文
官网angr (不够详细,想要用来做一些事情还是要看angr的代码,至少得看python实现的接口)
开始 Project angr从加载二进制文件到Project
中开始。从此以后的object基本上都围绕它展开。
1 proj = angr.Project('/binary_file' )
项目基本属性:
1 2 3 proj.arch proj.entry proj.filename
阅读此文
一般是在Unix-Like系统上安装pyenv,windows好像用的比较少
为什么放弃pyenv 这本质上是一个python管理软件,如果你想使用类似虚拟空间的东西,不建议使用这个,依然会造成混乱。
另外在windows上pyenv好像会让第三方调用python的工具出现权限问题,例如idapython。暂不确定是否有关。
删除pyenv 把安装过程反过来就行了。删除~/.pyenv路径,删除环境变量,就ok了
阅读此文
本章回顾人们对UNIX标准化做出的努力与影响,并说明标准化工作中对每种实现必须定义的各种限制。
UNIX标准化 ISO C ANSI即American National Standards Institute,美国国家标准学会,它是International Organization for Standardization即国际标准化组织ISO中代表美国的成员。IEC是国际电子技术委员会International Electrotechnical Commission的缩写。 ISO C标准:由ISO/IEC中的专门工作组维护和开发,该工作组简称WG14。此标准是为了C的可移植性。它定义了C的语法和语义和标准库。如今所有UNIX系统都提供C标准中定义的库函数,所以此标准库非常重要。 restrict关键字:告诉编译器那些指针引用可以优化,添加自ISO/IEC 9899:1999。
IEEE POSIX POSIX(Portable Operating System Interface,可以指操作系统接口)标准族最初由IEEE(Institute of Electrical and Electronics Engineers,电气和电子工程师学会)制订。现在由Austin Group开放工作组维护。 POSIX 1003.1操作系统接口标准,它定义了符合此标准的操作系统必须提供的各种服务。 同时所有标准中的例程都被称为函数
而不会区别系统调用和库函数。 POSIX.1:指的是IEEE正式出版的1003.1标准。后面又发了很多1003.1的更新。
Single UNIX Specification
阅读此文
本章对一些术语进行简要说明并给出实例。
文件和目录 stat和fstat函数返回包含所有文件属性的一个信息结构。第四章将详细说明文件的各种属性。 目录项的逻辑视图与实际上的磁盘存放方式是不同的。UNIX文件系统大多数实现并不在目录项中存放属性,这是权衡于硬连接带来的一些问题。第四章将讨论。
文件名 只有斜线和空字符不能出现在文件名中。斜线用来分割路径名,空字符终止一个路径名。opendir
函数与readdir
函数,包含于dirent.h
中,并且包含对dirent
结构的定义。 opendir函数返回只想DIR结构的指针。将指针传送给readdir函数,使用循环读取每个目录项,返回指向dirent结构的指针,如果没有了则返回null指针。此目录项顺序非首字母排序。
工作目录 working directory,或current working directory。进程可以使用chdir函数更改工作目录。 登陆时cwd设置为起始目录home directory。该目录从口令文件(通常是/etc/passwd)中相应用户的登录项中取得。
阅读此文