bin
二进制安全相关
Elwood Ying
这个作者很懒,什么都没留下…
展开
-
漏洞挖掘的艺术-面向源码的静态漏洞挖掘
0x00软件漏洞的挖掘一直是热门的方向,安全从业者们从一开始的手工挖洞,到后来编写自己的工具实现自动化的漏洞挖掘,再到随着近年来AI的蓬勃发展,开始使用深度学习等技术辅助漏洞挖掘,乃至更进一步使用相关技术实现自动化攻防,如DARPA的CGC大赛等。技术日新月异,让人眼花缭乱,本系列文章希望通过介绍典型的代表性工作(侧重于安全学术界的Big4,即四大顶会上发表的成果),来帮助各位师傅们厘清脉络和相关技术,为之后的学术发展或职业发展给出指引,能找到可以深入挖掘发展的方向。0x01按照传统的分类方法,可以分原创 2020-09-18 22:59:42 · 1614 阅读 · 1 评论 -
漏洞挖掘的艺术-面向二进制的静态漏洞挖掘
0x00本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍与分析。面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构化信息,面临着值集分析(vaule-set analysis,VSA)与控制流恢复不精确的问题,但是二进制程序相对于源码而言更容易获得,所以这方面的研究工作一直都有新的研究动态,并且会在0x02部分介绍目前流程的两种技术。在进一步分析之前,我们首先来具体解释前文提出的两个问题。0x011.1值集分析是一种结合数值分析和指针分析的静态分析算法。VSA是一种基于抽象原创 2020-09-18 22:57:13 · 2099 阅读 · 1 评论 -
漏洞挖掘的艺术-动态漏洞挖掘
0x00本文是本系列的第三篇。本文将会介绍动态漏洞挖掘技术,本文的组织结构如下,首先介绍相关典型技术,如模糊测试、符号执行等并给出典型工具介绍,然后介绍相关技术存在的问题,如路径爆炸等,之后会用近期的顶会论文举例来了解的最新的学术界研究动态。0x011.1模糊测试模糊测试是一种基于缺陷注入的自动软件测试技术,它使用大量半有效的数据作为应用程序的输入,以程序是否出现异常作为标志,来发现应用程序中可能存在的安全漏洞。所谓半有效的数据是指对应用程序来说,测试用例的必要标识部分和大部分数据是有效的,这样待测原创 2020-09-18 22:54:02 · 3299 阅读 · 0 评论 -
Exploit-Exercise之Protostar-net&final
0x00Exploit-Exercise一共有5个镜像可供练习,如下所示本系列文章将会介绍第二个镜像Protostar的通关经验。Protostar涉及栈溢出、堆溢出、格式化字符串漏洞、网络编程、及综合性漏洞。本文将介绍net,final部分。关于环境准备,在官网https://exploit-exercises.lains.space/protostar/下载即可。下载后得到iso镜像,使用vmware安装。然后使用user/user即可登录查看ip知道ip后可以在kali中ssh连上原创 2020-08-15 15:31:30 · 864 阅读 · 0 评论 -
Exploit-Exercise之Protostar-stack
0x00Protostar涉及栈溢出、堆溢出、格式化字符串漏洞、网络编程、及综合性漏洞。本文将介绍stack部分。关于环境准备,在官网https://exploit-exercises.lains.space/protostar/下载即可。下载后得到iso镜像,使用vmware安装。然后使用user/user即可登录查看ip知道ip后可以在kali中ssh连上输入user即可机器上所有需要分析的程序都在如下路径0x0来看第一关stack0源码如下这题很简单,就是在if里判断mo原创 2020-07-20 22:35:15 · 1413 阅读 · 1 评论 -
Exploit-Exercise之Protostar-heap
0x00Protostar涉及栈溢出、堆溢出、格式化字符串漏洞、网络编程、及综合性漏洞。本文将介绍heap部分。关于环境准备,在官网https://exploit-exercises.lains.space/protostar/下载即可。下载后得到iso镜像,使用vmware安装。然后使用user/user即可登录查看ip知道ip后可以在kali中ssh连上输入user即可机器上所有需要分析的程序都在如下路径0x01第一关heap0这里可以看到存在缓冲区溢出的地方在d->n原创 2020-07-20 22:29:31 · 758 阅读 · 0 评论 -
Exploit-Exercise之Protostar-format
0x00Protostar涉及栈溢出、堆溢出、格式化字符串漏洞、网络编程、及综合性漏洞。本文将介绍format部分。关于环境准备,在官网https://exploit-exercises.lains.space/protostar/下载即可。下载后得到iso镜像,使用vmware安装。然后使用user/user即可登录查看ip知道ip后可以在kali中ssh连上输入user即可机器上所有需要分析的程序都在如下路径0x01第一关,fotmat0我们的目标是控制target为0xde原创 2020-07-20 22:24:54 · 372 阅读 · 0 评论 -
从零开始学习恶意软件聚类可视化
0x00前言本文章数据集来自Mandiant对某APT组织样本的整理,分析结果仅做学习探讨之用。0x01在本文开始之前,我们首先要明白为什么要做恶意样本的聚类分析。针对APT活动而言,我们需要知道一点,单纯的被动防御是没有胜算的,必须要学会主动防御。什么是主动防御呢?由于APT攻击的特性,总是一点点进行渗透,不会一下子造成大动静,我们要做的就是从其前期的攻击行为中归纳出攻击者的特征、行为,才能帮助我们可以进行更好的防御。而对恶意软件的聚类分析,就是其中不可或缺的一环。通过聚类,我们可以知道哪些恶意软件原创 2020-06-19 22:38:55 · 1012 阅读 · 0 评论 -
pwnable.krToddlr’s Bottle题解5
0x16memcpy源码在http://pwnable.kr/bin/memcpy.c直接编译可能会报错,根据报错提示是因为缺少相应的头文件因为编译选项-m32:编译出来的是32位程序,既可以在32位操作系统运行,又可以在64位操作系统运行。这就需要multilib,它可以支持在64位机器上生成32位和64位的文件。如图所示解决即可:apt-get install gcc-multilib接下来就可以了测试运行没有拿到flag关键点:程序打印10轮在2的各次幂,要求用户依次输入10原创 2020-06-19 22:34:56 · 747 阅读 · 0 评论 -
pwnable.krToddlr’s Bottle题解4
0x12登录后看源码通读程序,逻辑是这样子的:输入6个字符,与程序由/dev/urandom随机产生的6个字符对比,通过上图第二个红框的检验,则match自加1,双重for循环结束后如果match=6则打印flag这里的漏洞在于检验的双重for循环实现时出了问题。该程序实现的逻辑实际上是对于每个lotto[i]会和输入的每个字符去比较,如果命中则加1那么我们可以考虑输入的6个字符相同,如果有一个命中,则全部命中。字符的取值范围知道是在ascii 1-45之间,又我们能输入的只有asci中的可原创 2020-06-19 22:32:55 · 555 阅读 · 0 评论 -
pwnable.krToddlr’s Bottle题解3
0x08题目给的提示是和运算符优先级有关登录后直接看源码mistake@pwnable:~$ lsflag mistake mistake.c passwordmistake@pwnable:~$ cat mistake.c#include <stdio.h>#include <fcntl.h>#define PW_LEN 10#define XORKEY 1void xor(char* s, int len){int i;for(i=0; i<原创 2020-06-19 22:30:02 · 612 阅读 · 0 评论 -
pwnable.krToddlr’s Bottle题解2
0x04flag看题目描述似乎是一个和脱壳相关的逆向题目按照给出的地址先下载过来file看看是个可执行文件执行之emm什么都看不出来,又没有源码那载入gdb吧emmm,没有符号表,无法反汇编哦,对了,根据题目的提示这是加了壳的,所以先脱壳这是什么壳呢?Strings看看upx的这里简单介绍下upx:UPX是一个著名的压缩壳,主要功能是压缩PE文件(比如exe,dll等文件),有时候也可能被病毒用于免杀.壳upx是一种保护程序。一般是EXE文件的一种外保护措施,主要用途原创 2020-06-19 20:45:52 · 821 阅读 · 0 评论 -
pwnable.krToddlr’s Bottle题解1
0x01前言:这一系列文章为pwnable.krToddlr’s Bottle的全部题解,其中有三道题目相对而言稍难或者说比较经典,单独成篇,其他题目的题解放在一起发出来。0x02fdSsh连接看一下目录我们需要执行flag,或者查看flag的内容看题目的提示就知道这题和文件描述符有关看看源码在代码中我们可以看到要通过strcmp()比较后会输出查看strcmp的用法可知,strcmp()中,若参数s1和s2字符串相同则返回0,s1大于s2则返回大于0的值,s1小于s2则返回小于原创 2020-06-19 20:41:10 · 739 阅读 · 0 评论 -
pwnable.kr题解之uaf
前言:这道题目反应了uaf的基本原理,pwn入门必做的题目,如果这一块了解的不够透彻,直接去打现在涉及各种奇技淫巧的pwn,肯定会被绕晕掉。所以为了照顾萌新(其实是我自己菜)把这道题目单独拿出来写一下。这是一道uaf的题目,把二进制文件拉到本地来研究在分析前,先简单说一下c++的虚函数和uaf的前置知识在c++中,如果类中有虚函数,那么这个类就会有一个虚函数表的指针vfptr,而子类会继承。uaf的原理:在释放内存后未将指向原内存的指针置为null,use after free的意思就是在释原创 2020-06-19 20:38:02 · 607 阅读 · 0 评论 -
pwnable.kr题解之input
0x01前言:这关其实和pwn关系不大,主要考察的都是linux下一些函数的操作,考察linux的基本功。涉及到的知识点包括一些经典的函数原型、IO重定向、文件描述符、管道、环境变量、socket编程、符号链接等。这里顺便真心安利一本书,《UNIX环境高级编程》,简称APUE书里介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在此基础上结合函数原型介绍了多个应用示例,如果这本书原创 2020-06-19 20:36:25 · 592 阅读 · 0 评论 -
pwnalb.kr之unlink
前言:这道题目应该是pwnable.kr上Toddler’s Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析。登录看看源程序程序中有几点要注意的地方:1.定义的OBJ结构体中一个指针4字节,buf[]数组8字节2.Unlink()的过程其实就是双向链表中摘下中间那一块的过程3.主函数中malloc了三个结构体,并通过指针连成了双向链表A<->B<->C4.打印出A的栈地址,堆地址,这两个地址这里记做stack,hep,待会儿在分析中会用到原创 2020-06-19 20:30:00 · 330 阅读 · 0 评论 -
pwnable.kr-cmd1 writeup
看看源码在main中可以看到我们输入的参数可以通过调用system执行但是在传给system执行前,输入的内容会被filter处理而filter过滤了tmp,flag,sh这些关键字而且还有一点需要注意的是,我们绕过filter之后,还得注意main中的putenv,它将PATH环境变量设置为了乱七八糟的东西PATH决定了shell将到哪些目录中寻找命令或程序,PATH的值...原创 2020-02-05 17:24:04 · 275 阅读 · 0 评论 -
ARM exploit编写四
我们先了解内存布局有关知识。每次我们启动一个程序,都会为该程序保留一个内存区域。然后这个区域被分成多个区域。然后这些区域被分成更多的区域(segment),但是我们将坚持总体概述。所以,我们感兴趣的部分是:程序镜像,堆,栈。在下图中,我们可以看到这些部分在进程内存中是如何布局的一般表示。用于指定存储区域的地址只是为了举例,因为它们会因环境而异,尤其是在使用ASLR时。程序镜像区域基本上保存...原创 2020-02-03 14:53:53 · 233 阅读 · 0 评论 -
ARM exploit编写三
上一个实验中我们已经介绍了reverse shell(反向shell)的原理,再回顾一下在reverse shell的场景下,内网的机器会主动连接到外网的几次上,比如作为攻击者,我们会在系统上开放一个监听端口,等待来自目标主机的弹回的连接。同样,还是先看看C语言是怎么实现的。完整代码在reverse.c中第一步是确定必要的系统函数,其参数和系统调用号。 看看给出的C代码,我们可以看到我们...原创 2020-02-03 14:50:46 · 254 阅读 · 0 评论 -
ARM exploit编写二
学习如何编写实现bind shell和reverse shell的shellcode。首先我们要理解一些技术细节。先来看看什么是bind shell以及它是如何工作的。通过bind shell你可以在目标机器上打开一个通信端口或者监听器。监听器会等待到来的连接,你连上去后,监听器会接收连接然后给你弹回一个shell.(其实就是我们所说的正向连接)在看看Revese shell,通过reve...原创 2020-02-03 14:48:40 · 311 阅读 · 0 评论 -
ARM exploit编写一
我们先ssh连接上之前已经使用qemu搭建好的arm环境。本系列实验用到的工具包括:gdb-调试器gef-gdb插件gcc-gnu编译器套件as-汇编器ld-链接器strace-跟踪系统调用objdump-检查反汇编中的空字节objcopy-从ELF二进制文件中提取初始shellcode在开始写shellcode之前,需要知道一些基础的准则,比如:shellcode应该紧...原创 2020-02-03 14:45:56 · 454 阅读 · 0 评论 -
ARM汇编学习六
我们知道函数利用堆栈来保存局部变量,保存寄存器状态等。为了让所有事物有序运行,函数使用栈帧,即堆栈中的一片本地化内存区域,专用于特定的函数。栈帧是在函数的prologue中创建的。将帧指针(FP)设置到堆栈帧的底部,然后为栈帧分配的堆栈缓存会被开辟。栈帧(从它的底部开始)通常包含返回地址(之前的LR)、之前的帧指针、需要保存的任何寄存器、函数参数(如果函数允许大于4)、局部变量等。虽然堆栈帧的实际...原创 2020-02-03 13:09:00 · 572 阅读 · 0 评论 -
ARM汇编学习五
接下来我们看看b.bx.blxb分支指令 简单地跳向一个函数bl分支连接指令 将(PC+4)保存到LR中并跳转到函数BX(分支切换指令)和BLX(分支连接切换指令)a) 和B/BL+交换指令集相同( ARM <-> Thumb )b) 需要用寄存器作为第一操作数:BX/BLX+具体的寄存器BX/BLX用来从ARM指令集切换到Thumb指令集我们看一个实例.text...原创 2020-02-03 13:05:33 · 458 阅读 · 0 评论 -
ARM汇编学习四
接下来学习条件指令。当特定条件满足时,借助条件指令, 通过跳转(分支)或执行某些特定指令来控制程序的流动方向。相关条件被描述为CPSR寄存器中的特定位的状态,这些位根据指令计算后的结果实时改变。比如,如果我们比较两个数并且他们相等,就将零标志位置位 (Z=1) ,因为在系统底层发生了a-b=0。在这个例子里两个数是相等的,但如果第一个数字比第二个大,会得出大于结论。而相反的情况下得出小于结论。当...原创 2020-02-03 13:01:37 · 1771 阅读 · 0 评论 -
ARM汇编学习三
有时,一次性加载(或存储)多个值更有效率。因此,我们需要使用LDM(载入多个值)和STM(存储多个值)。这些指令基于起始地址的不同,有不同的形式。下面是我们将在本节中将会使用的代码。我们将一步一步地完成每一个指令.代码在test5.s中.dataarray_buff:.word 0x00000000 /* array_buff[0] /.word 0x0000000...原创 2020-02-03 12:58:17 · 810 阅读 · 0 评论 -
ARM汇编学习二
我们来学习内存指令:加载和存储ARM使用载入-存储模型来访问内存,意味着只有加载/存储(LDR和STR)指令才可以访问内存。在X86中,大多数指令允许直接操作内存中的数据,而在ARM中,在操作数据之前,必须把数据从内存移动到寄存器中。这意味着在ARM下,若要 增加特定内存地址里的32位的数值,将需要用到三种类型的指令(载入、增加和存储):首先将特定地址里的数值加载到寄存器中,然后在寄存器中增加它...原创 2020-02-03 12:54:10 · 1231 阅读 · 0 评论 -
ARM汇编学习一
关于ARM架构ARM架构,过去称作高级精简指令集机器(英语:Advanced RISC Machine,更早称作Acorn精简指令集机器,Acorn RISC Machine),是一个精简指令集(RISC)处理器架构家族,其广泛地使用在许多嵌入式系统设计。由于节能的特点,其在其他领域上也有很多作为。ARM处理器非常适用于移动通信领域,匹配其主要设计目标为低成本、高性能、低耗电的特性。另一方面,...原创 2020-01-30 12:21:52 · 2333 阅读 · 0 评论 -
unicorn教程三
题目给了下列的shellcode\xe8\xff\xff\xff\xff\xc0\x5d\x6a\x05\x5b\x29\xdd\x83\xc5\x4e\x89\xe9\x6a\x02\x03\x0c\x24\x5b\x31\xd2\x66\xba\x12\x00\x8b\x39\xc1\xe7\x10\xc1\xef\x10\x81\xe9\xfe\xff\xff\xff\x8b\x45\x0...原创 2020-01-30 12:17:38 · 2233 阅读 · 1 评论 -
unicorn教程二
来看看第一道题目下载过来后先使用file查看一下是64位可执行文件尝试运行,如下图所示我们可以注意到,它会计算并打印我们的Flag,但这个过程非常缓慢,并且Flag的计算过程会随着字节的增多变得越来越慢。从其最开始的输出可以看到flag为hxp{F这就意味着,我们需要对程序进行优化,以尽快得到Flag。在IDA Pro的帮助下,我们可以将代码反编译成像C语言一样的伪代码。使用I...原创 2020-01-30 12:14:52 · 2724 阅读 · 1 评论 -
unicorn教程一
http://www.unicorn-engine.org/docs/tutorial.html先来了解下什么是unicorn引擎。。Unicorn 是一个轻量级, 多平台, 多架构的 CPU 模拟器框架. 我们可以更好地关注 CPU 操作, 忽略机器设备的差异. 想象一下, 我们可以将其应用于这些情景: 比如我们单纯只是需要模拟代码的执行而非需要一个真的 CPU 去完成那些操作, 又或者想要...原创 2020-01-30 12:06:45 · 13862 阅读 · 1 评论 -
pwntools实战CTFpwn题
Pwntools安装,一条命令就能搞定pip install --upgrade pwntools安装完毕后在python环境下只需使用from pwn import *即可导入这会将大量的功能导入到全局命名空间,然后我们就可以直接使用单一的函数进行汇编、反汇编、pack,unpack等操作。常用的模块有下面几个:asm : 汇编与反汇编,支持x86/x64/arm/mips/pow...原创 2020-01-30 12:02:47 · 2689 阅读 · 0 评论