跳至主要内容

博文

熊猫烧香变种 spo0lsv.exe 病毒分析

http://ift.tt/2Erx4OJ [TOC] 0x0 样本信息&分析平台 1 样本信息 病毒名:spo0lsv.exe 大小: 30001 bytes 壳信息:FSG v2.0 MD5: 512301C535C88255C9A252FDF70B7A03 SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870 CRC32: E334747C 2 分析平台&使用工具 win7 x86 od IDA 0x1 主要病毒行为 更改可执行文件图标,内容等信息 强制关闭杀毒、任务管理器等软件 设置开机自启病毒 设置用户点击磁盘启动病毒 更改html,php等网络文件 0x2 脱壳 脱壳 首先通过PEID可以发现这个区段是不对的,通过查壳工具发现这个壳是FSG 2.0,这个壳是非常好脱的 病毒在0x004001D1 这个位置进行了IAT修复 0x0041012C是IAT表的地址,通过观察内存分布可以看出,这个壳把本来IAT中全0结束改为0x7FFFFFFF结束,这样ImportRec在修复的时候就遍历不到其他的导入表了,因此修改成了全0结尾 ImportRec 无法识别netapi.dll, 需要手动修复,或者使用x32dbg 修复 0x3 病毒分析 1 把自身拷贝到系统文件 在所有盘创建一个ini文件夹 写入一些自启的字符串 字符串的作用是使得打开改盘就自动运行病毒文件 更改这个文件属性为:只读,隐藏,并且为操作系统专用 更改exe文件属性, 更改XX:\setup.exe 为只读,隐藏属性,并且为操作系统专用 获取系统目录 2 添加注册表,设置开机自启 设置病毒开机自启 并且通过设置注册表中 SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL\CheckedValue 的值,强制设置不显示隐藏文件 3 删除共享磁盘文件 cmd.exe /c net share A$ /del /y cmd.exe /c net share admin$ /del /y cmd.exe /c net share ...

32位ARM汇编语言(四)数据处理指令

http://ift.tt/2Gwa4v5 基本指令介绍 数据传送指令 比较指令 cmp{条件}操作数1,操作数2 CMN{条件}操作数1,操作数2 TST{条件},操作数1,操作数2 TEQ{条件} 操作数1,操作数2 算数逻辑运算指令 ADD{条件}{S}目的寄存器,操作数1,操作数2 ADC{条件}{S}目的寄存器,操作数1,操作数2 RSB{条件}{S}目的寄存器,操作数1,操作数2 RSC{条件}{S}目的寄存器,操作数1,操作数2 AND{条件}{S}目的寄存器,操作数1,操作数2 EOR{条件}{S}目的寄存器,操作数1,操作数2 BIC{条件}{S}目的寄存器,操作数1,操作数2 基本指令介绍 数据传送指令 数据传送指令用于在寄存器和储存器中之间进行数据的双向传输 比如:MOV ,MVN 算数逻辑运算指令 完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中相应条件表示位 比如:ADD,ADC,SUB,SBC,RSB,RSC,AND,ORR,EOR,BIC 比较指令 不保存运算结果,只更新CPSR中相应的条件标志位 比如:CMP,CMN,TST,TEQ 数据传送指令 指令 描述 MOV{条件}{S}目的寄存器,操作数 数据传送指令 MVN{条件}{S}目的寄存器,操作数 数据取反传送指令 {S}选项决定指令的操作是否影响CPSR中条件标志位的值 MVN与MOV不同之处是在传送之前按位被取反 __asm__ ("mov ri,r0“); //将寄存器R0的值传送到寄存器R1 __asm__(”mov r1,r0,lsl#3"); //将寄存器R0的值左移3位后传到R1 __asm__(“mov pc,lr"); //将寄存器lr的值传送到pc,常用于子程序返回 __asm__("mvn r0,#0”); // 将立即数0 取反传送到寄存器R0中,完成后R0=-1 比较指令 指令 描述 CMP{条件}操作数1,操作数2 比较指令 CMN{条件}操作数1,操作数2 比较反值指令 TST{条件...

32位ARM汇编语言(二)ARM 汇编语言特点

http://ift.tt/2FpIH4w 两种不同风格的ARM指令 特点1:LDR/STR结构 特点2:8中寻址方式 特点3:指令后缀 特点4:条件执行后缀 特点5:多级指令流水线 两种不同风格的ARM指令 ARM 官方的ARM汇编指令:指令一般用大写,Windows中IDE开发环境常用,如 LDR RO,[R1] GNU风格的ARM汇编:指令一般用小写字母,linux中常用,如: ldr r0,[r1] 特点1:LDR/STR结构 ARM 采用RISC(Reduced Instruction Set Computer 中文:精简指令计算机)结构,cpu本身不能直接读取内存,需要先将内存中的内容加载到cpu中的通用寄存器中,而后才能被cpu处理 ldr(load register)指令将内存内容加载入通用寄存器 str(store register)指令将寄存器内容存入内存空间中 ldr/str组合用来实现ARM cpu和内存的数据交互 特点2:8中寻址方式 寻址方式 示例 寄存器寻址 mov r1,r2 立即寻址 mov r0,#0xff00 寄存器移位寻址 mov r0,r1,lsl#3 寄存器间接寻址 ldr r1,[r2] 基址变址寻址 ldr r1,[r2,#4] 多寄存器寻址 ldmia r1!,{r2-r7,r12} 堆栈寻址 stmfd sp!,{r2-r7,lr} 相对寻址 beq sign 特点3:指令后缀 虽然ARM的汇编指令不是很多,但是通常可以在指令后面跟上后缀,变成不同的指令,常用的指令有: 常用指令后缀 解释 B(byte) 功能不变,操作长度变为8位 H(half word) 功能不变,长度变为16位 S(signed) 功能不变,操作数变为有符号(如ldrsh,ldrsb) S(S标志) 功能不练,影响CPSR标志位,如(mov 和movs,movs r0,#0) 特点4:条件执行后缀 条件码 助记符 助记符全拼 说明 检测条件 0000 EQ equal 等于0 Z=1 0001 NE not equal...

32位ARM汇编语言(一)寄存器介绍

http://ift.tt/2EiY3sg ARM 基本约定 ARM处理器工作模式(7种) ARM寄存器 Abort Mode FIQ Mode IRQ Mode SVC Mode Undef Mode User Mode 小结 ARM 基本约定 Byte:8 bits Halfword: 16bits Word:32 bits 大部分的ARM core提供: - ARM 指令集(32-bit)(中断处理,需要32位) - Thumb指令集(16-bit)(最先推出的,每个指令16位) - Thumb2 指令集(16&32bit)(ARMv7时退出,混合指令) - ARM Thumb 互相可以转换 ARM处理器工作模式(7种) 7种工作模式: Mode 解释 User 非特权模式,大部分任务执行在这种模式 FIQ 当一个高优先级(fast)中断产生时将会进入这种模式(ARM的FIQ Signal被触发所产生的异常) IRQ 当一个低优先级(normal)中断产生时将会进入这种模式(ARM的IRQ Signal被触发所产生的异常 ) Supervisor 当复位或软中断指令执行时将会进入这种模式 Abort 当存取异常时将会进入这种模式(也就是读取内存异常) Undef 当执行未定义指令时进入这种模式 System 使用和User模式相同寄存器集的特权模式 注意: 1:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式) 2:Privilege中除Sys模式外,其余5种为异常模式 3:各种模式的切换,可以是普通程序员通过代码主动切换(通过写cpsr寄存器);也可以是CPU在某些情况下自动切换 4:各种模式下权限和可以访问的寄存器不同 ARM寄存器 ARM 寄存器一共有37个32位寄存器 其中,30个为”通用“寄存器,r1-r14 未分组的寄存器:r1-r7,只有一个寄存器 分组的寄存器: r8-r14:有多个同名寄存器 r8-r12:两个 r13-r14:6个 r13(sp),R14(lr) 一个固定的程序计数器:pc(又称r15),也...

安卓CTF cake.apk解题

http://ift.tt/2DENrGZ 题目基本信息 大小: 1685975 bytes 修改时间: 2018年1月25日, 12:03:47 MD5: EBA6C33907783F8D24313AF3C1329598 SHA1: DD6821B9F91282325C87FD51220896168AAA3935 CRC32: A1CF79DC cake.apk解压密码: nvai 安装运行画面 很明显这是一道解密题,二话不说开始分析吧 分析 拖到安卓killer中,注册文件没有发现有什么特别的 只知道主模块是 .M 在主模块中的 onCreate 函数中,发现 实在 a 这个了类中有点击事件的监听器,那么进去看 onClick 函数倒地做了什么 整个a函数是非常简单的,就一个点击相应函数,这里比较关注的是 check 函数,实在主类中,进去查看一下 大体的逻辑是,先通过getkey,获取一个字符串保存到str1中,本来getkey返回的字符串是这样的 但是注意了,这里是方法的名称是 getKey 但是 str1= get□ey 非常的具有迷惑力 实例返回的字符串应该是这个 从图片上也可以看到,对数组进行了赋值,赋值完之后的数组为 int tem[16] = { 0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42 }; 紧接着就是对字符串进行校对,可以看到整个程序中没有返回值,如果发生了错误,都会调到自定义的错误 localException1 进行处理 通过观察可以得知数组中每个元素和字符串的关系为 密码[i]^str[i%8]=整型数组[i] 因此写过控制台程序进行输出 计算解密 int tem[16] = { 0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42 }; char temchar[] = "bobdylan"; for (int i = 0; i < 16; i++) { char c = tem[i] ^ temchar[(i % 8)]; printf("%c...