反汇编

20169217 2016-2017-2 《网络攻防实践》免杀技术学习总结

微笑、不失礼 提交于 2020-03-20 05:14:18
1.基础问题回答 (1)杀软是如何检测出恶意代码的? 恶意代码与其检测是一个猫捉老鼠的游戏,单从检测的角度来说。反恶意代码的脚步总是落后于恶意代码的发展,是被动的.目前基于主机的恶意代码检测方法主要有反恶意代码软件、完整性校验法以及手动检测,基于网络的检测方法主要有基于神经网络”、基于模糊识别“等方法,本文主要讨论基于主机的检测。 恶意代码分析方法 静态分析方法 是指在不执行二进制程序的条件下进行分析,如反汇编分析,源代码分析,二进制统计分析,反编译等,属于逆向工程分析方法。 (1)静态反汇编分析,是指分析人员借助调试器来对而已代码样本进行反汇编出来的程序清单上根据汇编指令码和提示信息着手分析。 (2)静态源代码分析,在拥有二进制程序的源代码的前提下,通过分析源代码来理解程序的功能、流程、逻辑判定以及程序的企图等。 (3)反编译分析,是指经过优化的机器代码恢复到源代码形式,再对源代码进行程序执行流程的分析。 动态分析方法 是指恶意代码执行的情况下利用程序调试工具对恶意代码实施跟踪和观察,确定恶意代码的工作过程对静态分析结果进行验证。 (1)系统调用行为分析方法 正常行为分析常被应用于异常检测之中,是指对程序的正常行为轮廓进行分析和表示,为程序建立一个安全行为库,当被监测程序的实际行为与其安全行为库中的正常行为不一致或存在一定差异时,即认为该程序中有一个异常行为,存在潜在的恶意性。

2019-2020-2 网络对抗技术 20175211 Exp1+ 逆向进阶(x64 shellcode制作及利用)

放肆的年华 提交于 2020-03-12 03:32:26
x64与x86的区别 64位系统中,不再使用 int 0x80 来进行系统调用,取而代之的是 syscall 指令 x64的栈不支持push64位的立即数,必须先把常量放到寄存器里再push x64的CPU的地址为64位,但实际上只支持48位的虚拟地址空间供软件使用。虚拟地址的高16位在用户模式下总是被设置为 0000 ,而在内核模式下全置为 FFFF x64中当你指定一个大于 0x00007fffffffffff 的地址时会抛出一个异常。那也就意味着 0x4141414141414141 会抛出异常而 0x0000414141414141 是安全的 shellcode制作 流程 先使用C这样的高级语言编写程序 反汇编以获取汇编指令 提取出机器码 编写C程序 我们使用 execve() 函数来调用 /bin/sh ,先了解一下这个函数 execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。execve()用来执行第一参数字符串所代表的文件路径,第二个参数是利用指针数组来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。从图中可以,如果通过C语言调用execve来返回shell的话,首先需要引入相应的头文件,然后在主函数中调用系统调用函数execve;同时传入三个参数。 由此编写出如下代码

windows搭建gcc开发环境(msys2) objdump

こ雲淡風輕ζ 提交于 2020-03-11 18:18:36
前言 可能你并不太了解msys2,但是作为一个程序员,你一定知道mingw,而msys2就集成了mingw,同时msys2还有一些其他的特性,例如包管理器等。 msys2可以在windows下搭建一个完美的类linux环境,包括bash、vim、gcc、make等工具都可以通过包管理器来添加和卸载 msys2的包管理器是使用的pacman,用过archlinux的应该都知道pacman了。 我们现在的目标是要集成make+gcc+gdb的一条编译工具 安装 下载地址: msys2 如果是exe,直接双击安装,如果是zip,直接解压到安装的地方即可。然后双击msys2.exe运行 [图片上传失败...(image-295493-1523187370956)] 给 MSYS2 添加中科大的源 使用过archlinux的应该会知道,pacman在安装的时候,如果源没有设置好,下载是很慢的。 需要修改的文件是: 1. \etc\pacman.d\mirrorlist.mingw32 2. \etc\pacman.d\mirrorlist.mingw64 3. \etc\pacman.d\mirrorlist.msys 简单的说 msys64\etc\pacman.d 目录下有三个文件。 mirrorlist.msys mirrorlist.mingw64 mirrorlist

Linux移植日记 day1

大城市里の小女人 提交于 2020-03-11 10:04:54
基础条件回顾: 完成了一个带有段寄存器的基于MIPS的多周期CPU,现有u-boot代码以及差分测试框架,以成功运行u-boot为目标 实用工具积累: 2020-3-6: mips - linux - gnu - objdump - d u - boot | less ——定位u-boot运行结果出错的pc、instr 交叉编译的话需要用对应的编译器,比如:aarch64-linux-gnu-objdump -d build/kernel8.elf 因为本机使用的是mips和linux-gnu的交叉编译器,所以需要使用这样的命令才能反汇编。 -d 参数表示反汇编需要执行指令的section(-D 表示反汇编全部section) | 在linux中称为管道,可以把上一条命令的结果作为下一条命令的参数,在此处就是将反汇编的文件作为了less的参数 less 命令可以随意浏览文件, 在查看之前不会加载整个文件,进入文件后可以/something 搜索指定内容somthing & 表示任务在后台执行 && 表示前一条命令执行成功时,才执行后一条命令 | 表示管道,上一条命令的输出,作为下一条命令参数 || 表示上一条命令执行失败后,才执行下一条命令 2020-3-10 Error : bfc00500: 40087801 mfc0 t0,$15,1 $pc : 0xbfc0051c $hi

汇编实验报告五

大城市里の小女人 提交于 2020-03-07 08:54:10
(5) 一开始写的是两个循环的,结果发现C段里面没相加结果,反汇编发现,第二个循环部分的代码并没有执行,怎么改都不行,数量不多,就换成了直接一个一个入栈,结果那部分代码也不执行,我弄了一个多小时也找不出问题ORZ 后来又换了一种方法,才可以。 不可行1号:(mov ax,4c00h int21h 后来发现了,改了也不行) 不可行2号: 不可行3号: …… 可行的: (6) 1.感觉无论是什么段,都是我们自己定义的,本质就是一个内存空间,然后我们给他定义一个功能,就像ax寄存器一样,我们可以赋值可以通过它赋值给别的段。 2.8086 汇编中,逻辑段实际分配的空间是16 字节的整数倍。通过反汇编就可以看出每个段占了多少空间。就能知道各个段之间相差几。 3.如果不指名start入口,程序会顺序(从上至下)执行,如果是数据段,本来用来处理的数据会被当做指令代码,可能会影响原本code段指令对数据的处理,从而导致了错误的结果。 来源: https://www.cnblogs.com/zxy666/p/10201198.html

基本反汇编算法

♀尐吖头ヾ 提交于 2020-03-07 08:38:17
在机器码中 数据与代码都是相同的二进制数字,你无法判断那些数据是代码 那些数据是数据 反汇编文件都有自己的文件格式,window下的pe文件,liunx下的eldf文件,这些类型文件含有一种机制就可以用来确定文件中包含的代码和代码入口点,通常表现为层级文件头的形式 线性扫描反汇编 确定反汇编指令位置的方式:一条指令结束,另一条指令开示的地方 确定起始位置最为困难:扫描被程序文件标注为代码的节所包含的全部的机器指令,线性扫描完整个代码段 线性扫描并不会识别分支等非线性指令来了解程序的控制流 优点:完全覆盖程序的所有代码段 缺点:无法考虑到代码中混杂的数据 递归下降反汇编 强调控制流的概念:控制流根据一条指令是否被另一条指令引用来决定是否对其进行反汇编 根据指令对指针过的影响来分类: 顺序流:将执行权传递给紧随其后的下一条指令 条件分支:条件真假影响执行路径,若不跳装则以线性模式执行指令,并以线性模式扫描下一条汇编指令,但是在静态环境中是无返判断条件判的结果,因此递归下降会同时反汇编这两条指令,并将分支目标指令的地址添加到稍后才进行反汇编的地址列表,推迟它的反汇编过程 无条件分支:执行权传给一条指令,但这条指令可以在任何位置,然后也没啥理由反汇编紧跟在无条件分支后面的指令 函数调用指令: 来源: https://www.cnblogs.com/Alex3O/p/12432454

我也要学iOS逆向工程--函数

隐身守侯 提交于 2020-03-05 23:00:38
  大家好,这篇我开始学习函数了.先学 C 函数,然后再 OC 的吧.OC 应该复杂点的吧. 然后看看汇编情况哦! 学习函数呢,肯定要弄清楚几个事情. 1.跳转地址. 2.返回地址 3.参数 4.函数获取参数 5.返回值和如何返回 6.扫尾 我们开始了哦!1个个的突破!唉,这个学习笔记是一边学一边写,不知道到底能不能边写边突破呢.小马过河,试试吧.呵呵. 1.跳转地址 .因为xcode默认反汇编的时候,并没有显示出机器码,所以这里,我们要用一个命令去显示:disassemble -fmb 我们发现这样子呢就可以看到机器码了.然后,bl就是call了哦.bl后面的0x18dc4就是具体的函数代码地址了.这里,我们要从机器码中学习下跳转地址是如何计算的.我们知道在x86中是这样计算的: call指令的地址 +call指令的长度- 偏移量 = 跳转地址.课是这里我卡住了. 0x18dfe: 0xf7ffffe1 bl 0x18dc4 ; Add at main.m:13 我刚才忙乎了会,实在是没想出来算法.这里,我先做个记号.我们先学习下面的内容. 2.返回地址 我们从代码中可以看到bl(call)指令后的返回地址是 0x18e02 .我们脑子里首先浮现是x86平台,返回地址是存放在ESP寄存器中的.通过 ESP 寄存器的地址取内容就是返回地址.但是我们现在在 IOS 中.IOS

基于虚拟机的软件保护技术

别说谁变了你拦得住时间么 提交于 2020-03-01 01:44:35
本文并不打算对vmprotect或其它某款软件安全套件进行深入讨论,而着眼于研究基于虚拟机的软件保护技术的起源、思想和实现。 现有软件保护技术概述 传统的软件保护技术,根据针对对象不同,可分为反静态调试和反动态调试两大类。反静态调试主要针对对象为反汇编器。反汇编器通过面向特定平台的反汇编引擎(如PC平台即为X86反汇编引擎),将编译器生成的二进制文件还原成汇编代码,有经验的逆向工程师可以据此还原出算法等核心运算机制。反静态调试主要是通过特定区段加密等方式,将核心信息保护起来,只在运行期才通过解密等算法动态还原,阻碍反汇编器静态地将二进制文件还原成汇编码。 反动态调试主要针对对象为调试器,由于经过静态加密的二进制码最终必须解密才能执行,因此通过Ollydbg等动态调试器仍然可以加以查看,反动态调试通过检测调试器和屏蔽调试端口等各种反调试技术阻止逆向工程师通过调试器跟踪软件进程的运行情况,使得软件的运行时状况始终保持处于黑盒状态。 被动型软件保护概念上述两种保护方案均采取主动出击的策略,意图“御敌于国之外”,中心思想是一个“挡字”,阻止逆向工程是窥视软件内部机理,但盾与矛的对抗总是无休止的,并没有任何一种主动型软件保护手段能真正彻底阻断逆向工程,因此另一种“以人为本”的被动型软件保护技术开始走向斗争舞台的中央。 被动型软件保护手段基于一个假设

IDA使用初探-1.启动IDA

拜拜、爱过 提交于 2020-02-29 07:10:22
在传统的软件开发模型中,通过编译器、汇编器和链接器中的一个或几个创建可执行程序。为了回溯编程过程(对程序进行逆向工程),使用各种工具撤销汇编和编译过程,这些工具就叫做反汇编器和反编译器。反汇编器撤销汇编过程,可以得到汇编语言形式的输出结果;反编译器则以汇编语言甚至是机器语言作为输入,将高级语言结果输出。 但是反编译有几点困难至今还没有完美解决:编译过程造成损失;编译属于多对多操作;反编译非常依赖语言和库。 反汇编 算法 :线性扫描(linear sweep)和递归下降(recursive descent)两种主要的反汇编算法。 线性扫描:反汇编从第一个代码段的第一个字节开始,以线性模式扫描整个代码段,逐条反汇编每条指令,直到遍历全部字节。此方法对于长度固定的指令集(MIPS)反汇编会更加容易,因为可以方便的的定位到随后的指令。缺点就是无法正确的将嵌在代码中的数据分离出。 递归下降:根据一条指令是否被另一条指令引用来决定是否对其进行反汇编。 交互式反汇编器专业版,常常称其为IDA Pro,属于递归下降反汇编器。上周看书有一些心得,在这里一篇篇分享一下。 1.为了准备逆向用的实例,先用VC生成一个release版的Hello World。 1 #include <windows.h> 2 INT WINAPI WinMain(HINSTANCE hInstance, 3

反汇编学习

让人想犯罪 __ 提交于 2020-02-29 07:06:48
(转: http://www.kuqin.com/assemble/20071122/2492.html ) 汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)   ============================   x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.    在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:   1. 通用寄存器:   EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)      这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数.