您的位置:首页 > 游戏 > 游戏 > 微商城平台排行榜前十名_建一个com网站要多少钱_杭州百度推广开户_网站优化和网站推广

微商城平台排行榜前十名_建一个com网站要多少钱_杭州百度推广开户_网站优化和网站推广

2025/2/12 2:35:01 来源:https://blog.csdn.net/2301_81841047/article/details/143500786  浏览:    关键词:微商城平台排行榜前十名_建一个com网站要多少钱_杭州百度推广开户_网站优化和网站推广
微商城平台排行榜前十名_建一个com网站要多少钱_杭州百度推广开户_网站优化和网站推广

ida的使用

一.ida的基本设置

1.目录结构

在IDA的安装根目录下有许多文件夹,各个文件夹存储不同的内容

    cfg:包含各种配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用户界面配置文件idatui.cfg,
    idc:包含IDA内置脚本语言IDC所需要的核心文件
    ids:包含一些符号文件
    loaders:包含用于识别和解析PE或者ELF
    plugins:附加的插件模块
    procs:包含处理器模块

2. 启动设置

(1).New(新建) :选择new将启动一个标准file open对话框来选择将要分析的文件。根据选择的文件,ida将显示外一个或多个对话框,再选择特定的文件分析选项。然后加载,分析并显示。
(2).Go(运行):go键终止加载程序,使IDA打开一个空白工作区域。可以将二进制文件直接拖入,或使用file菜单中的选项。IDA会利用已知扩展名的过滤器限制file对话框显示。请确保修改或清除该过滤器【如选择all files】,以便file对话框正确显示你想要打开的文件【在非windows系统中,可执行文件可能没有扩展名】。以这种方式打开文件时,IDA会尝试自动识别选定文件类型,需要注意loading对话框,看ida用哪个加载器处理。
(3).Pervious :使用previous可以打开“最近用过的文件”列表中的一个文件。“最近用过的文件”列表中包含IDA的windows注册表项的history子项中的值。默认长度为10,可以编辑idagui.cfg或idatui.cfg修改其值。

3.ida文件加载

(1)IDA会生成一个可能的文件类型列表,在顶部显示,它将显示最适合处理文件的加载器。

(2)Binary File(二进制文件) 是列表最后一个选项,会一直显示,是IDA加载无法识别文件的默认选项,提供最低级的加载方法。需要使用二进制加载器的情形包括:分析从网络数据包或日志文件中提取出来的rom镜像和破解程序负载。

(3)在processor type【处理器类型】下拉菜单中,可以指定在反汇编过程中使用的处理器模块【在ida的procs目录中】。多数情况下,ida将根据可执行文件头中读取信息,选择合适的处理器。

二.ida界面介绍

1.选项卡顶部 IDA 用不同的颜色区分可执行程序组成部分。下方对不同颜色
代表的部分进行说明。例如,灰色代表.data sectio【数据】,如果点击颜色
条灰色部分,下方的图形视图也会跳转到该部分中点击地址的位置。粉色部分是
External Symbol【外部符号】或者 idata section。
蓝色部分表示 code section【代码】中识别出的函数

2.在 IDA 界面底部有一个交互栏可以执行 Python 命令,能够帮助我们快速进行进制转换以及命令

三.ida快捷键记录

常用快捷键

   IDA中的快捷键都是和菜单栏的各个功能选项一一对应的,基本上你只要能在菜单栏上找到某个功能,也就能看到相应的快捷键,这里记录几个常用的:

a:将数据转换为字符串
f5:一键反汇编
esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转 ctrl+鼠标滚轮:能够调节流程视图的大小
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
g:直接跳转到某个地址
n:更改变量的名称
y:更改变量的类型
/:在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
;:在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u:undefine,取消定义函数、代码、数据的定义

四.操作概述

函数操作

    删除函数:函数窗口中选中函数后,按 Delete 键
    定义函数:在反汇编窗口选中对应行后,按P键
    修改函数参数:在函数窗口中选中并按 Ctrl+E 组合键,或在反汇编窗口的函数内部按 Alt+P 组合键

数据类型操作

    U 键:取消一个地方已有的数据
    D 键:让某一个位置变成数据
    C 键:让某一个位置变成指令
    A 键:会以该位置为起点定义一个以“\0”结尾的字符串类型
    * 键:此处定义为一个数组
    O 键:将此处定义为一个地址偏移

导航操作

    后退到上一位置:Esc
    前进到下一位置:Ctrl+Enter
    跳转到某一个特定位置:G,然后可以输入地址/已经定义的名称
    跳转到某一区段:Ctrl+S,然后选择区段即可

简要概括

ida.exe用于分析32位的可执行文件

ida64.exe用于分析64位的可执行文件

如何判断文件位数

1.kali linux系统终端的file命令

2.peid等查壳软件(还可以判断类型exe,elf)

3.或者最直接的方法用ida.exe打开64位的程序会报错(但是ida.64可以正常打开32位的程序,但是反编译得不到伪代码)

1.函数列表窗口:列举所有已经被IDA识别的函数

2.IDA-View窗口:汇编代码窗口,空格键切换图形模式和文本模式,Tab和F5键切换到伪代码窗口

3.Pseudocode窗口:伪代码窗口,在伪代码位置按下Tab键可以切换到对应的汇编窗口

4.字符串窗口:列举程序代码所有引用到的字符串常量

a.shift + F12打开字符串窗口

b.Ctrl + F 可以弹出底部搜索小窗口(大部分窗口均可实现该功能)

5.其他窗口:HEX View,Exports,Imports ,Structures

6.菜单项View菜单可以找到IDA绝大部分窗口的入口

知识点:

1.壳的概念

    在计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。

2.加壳的概念

    通过数学运算,将可执行程序文件或动态链接库文件的编码进行改变, 以达到缩小文件体积或加密程序编码的目的。

    例如:黑客使用病毒加壳,主要是对使用的木马等恶意程序进行保护,从而避免它们被杀毒软件查杀; 程序作者想对程序资源压缩、注册保护的目的,在计算机软件里也有一段专门负责保护软件不被非法修改或反编译的壳; 有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名,即为了保护软件不被破解,通常都是采用加壳来进行保护......

    常见的壳有压缩壳、密码壳、加密壳。

 3.脱壳的概念

    对应加壳的概念来说,是指除掉程序的保护(壳),修改程序资源。

    脱壳的两种方法: 硬脱壳和动态脱壳

    (1) 硬脱壳。

                这是指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。

    (2) 动态脱壳。

                由于加壳的程序运行时必须还原成原始形态,即加壳程序会在运行时自行脱壳, 抓取(Dump)内存中的镜像,再重构成标准的执行文件。

查壳软件推荐

peid和die(有中文版,功能较为强大)

部分ida较为特征的实操

题目一 main()函数的查找

运行T1.exe,因为C语言的特性,直接点击会导致闪退,所以这里,拉到终端执行(注意不能有一些乱码或者中文)

可见这个程序要我们输入flag,但是我们本身的目的不就是为了得到flag吗??????这就是RE

拖进ida里面分析看看,老规矩,先查壳和判断位数

无壳,拖到idax64.exe里面分析

因为由上面的分析可知,这个程序是由C语言编写的,所以这里的思路还是选择去找main主调函数,看看有没有关键信息

筛选函数看看这几个主调函数有没有什么有关信息

反汇编看看

 很简单的代码审计,这里的456502可以判断就是c语言的printf()函数,4554EF则是输入函数sacnf()加上一个条件判断

 这样就好看了很多,结合代码,实际上真正的flag也就已经找到了,验证一下

如果不是这个字符串则会显示

        在代码定位时,如果main函数也找不到怎么办呢,因为在该案例中,有“Hi CTFer,Input your flag”等字符串,我们可以搜索这些字段,来找到引用这些字符串的代码。因为引用这些字符串的代码一定在main函数或者离main函数不远。右键jump可以跳转到相应代码,

注:sub+编号的形式函数是ida定义的函数。

思路总结:运行程序->收集字符串->寻找字符串引用代码->生成伪代码->修复匿名函数->分析程序逻辑->得到flag

题目二:简单加密

还是先找main()函数

看到了相关信息,很简单的自增比对

尝试写修改脚本

得到flag

题目三

查找一下,是有异或加密算法,加密对比数据在Str2里面

查找

 编写解密脚本

验证

题目四

这里就直接展示分析结果了

可以看见这里的加密过程就是先异或,再base64编码,所以这里选择的解密脚本思路就是先解密,再解异或

fmcd\IRWOCEHRG[OYS[Uh

 跑出了内容

验证成功

题目五:变异码表base

和上面不同的就是,正常的base码表跑出来异或是错的

逻辑:异或->base64->比较字符串

跟踪sub_455A94,找到sub_45A3F0函数

定位跟踪off_529000,其存放一个字符串地址的偏移量,继续跟踪

这里面存放的就是变异码表,修改以后,按上面的脚本跑就可以了

题目六:动态调试

        这里主要是记录ida,所以还是先选择用ida来动态调试,因为平时还是使用onllydbg多一点,既然这里涉及到了ida的动调,那还是先介绍一下关于ida动调的一些知识点

首先从本地动态调试开始

加载目标文件

万年第一步,使用ida打开目标文件,然后点击菜单项中的“Debugger”

修改好以后,选项改为本地调试,然后就可以进入调试阶段,本题中的动态调试知识点就到这里

        在关键判断函数处下断点以后,程序就会在判断的地方停住,然后就可以通过这个判断去找正确的答案。

补充知识点(断点,是指在程序执行过程中的一个休息点,而对于一个陌生的程序来说,断点的设置,能让我们对程序中的变量变化有一个更直观的理解)

(补充:ida还支持另一种调试方式,即将目标文件附加到一个正在运行的进程上,以调试某些无法独立运行的文件,如果想以这种方式进行调试,则在选好调试器后点击“Attach to process”后即可选择附加进程

调试命令
ida快捷键功能
F7单步步进
F8单步步过
F9继续运行程序
F4运行到光标所在行
Ctrl + F7直到该函数返回时才停止
Ctrl + F2终止一个正在运行的进程
F2设置断点

调试以后,在ida-view里面可以找到相关的内容,放置就可见flag的值

这里实际上已经可以看到flag的值,但是复制不了,所以还是追踪地址

将16进制的值转换为字符串以后 ,可见flag的所有地址,用快捷键A,将字符串整理起来得到了flag

这里如果直接用静态调试的方法去找str1的地址,直接去找是找不到的

判断

补充:

ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。

题目七:IDA动态调试解RC4

        动态调试解算法最主要的目的是,当遇到一些加密和解密算法一致的情况(异或,RC4)时,我们可以直接省略掉写脚本的过程,直接使用题目本身的加密算法去解密,这样一来,既减少了写脚本这个工作量,也不容易出错

        和之前一样的是,进来以后还是照常去找main主函数,找到以后可以发现,变量V7被赋予的字节很多,总共是44个字节

全部源码

int __cdecl main_0(int argc, const char **argv, const char **envp)
{int j; // [esp+31Ch] [ebp-69Ch]int i; // [esp+328h] [ebp-690h]int input_len; // [esp+334h] [ebp-684h]char v7[55]; // [esp+340h] [ebp-678h]char v8; // [esp+377h] [ebp-641h]unsigned int index; // [esp+380h] [ebp-638h]int v10; // [esp+38Ch] [ebp-62Ch]char input[520]; // [esp+398h] [ebp-620h] BYREFchar v12[264]; // [esp+5A0h] [ebp-418h] BYREFchar v13[264]; // [esp+6A8h] [ebp-310h] BYREFchar v14[516]; // [esp+7B0h] [ebp-208h] BYREF__CheckForDebuggerJustMyCode(&unk_10CC00F);j__memset(v14, 0, 0x200u);j__memset(v13, 0, 0x100u);j__memset(v12, 0, 0x100u);j__memset(input, 0, 0x200u);v10 = 0;index = 0;v7[0] = -28;v7[1] = 21;v7[2] = -60;v7[3] = -19;v7[4] = -90;v7[5] = 47;v7[6] = 86;v7[7] = 16;v7[8] = -69;v7[9] = 19;v7[10] = -21;v7[11] = -83;v7[12] = 117;v7[13] = 86;v7[14] = -57;v7[15] = -69;v7[16] = -69;v7[17] = -23;v7[18] = -71;v7[19] = -52;v7[20] = 2;v7[21] = 58;v7[22] = 80;v7[23] = -97;v7[24] = 54;v7[25] = -112;v7[26] = 105;v7[27] = -66;v7[28] = 124;v7[29] = 66;v7[30] = 68;v7[31] = -54;v7[32] = -58;v7[33] = -44;v7[34] = 36;v7[35] = 92;v7[36] = -46;v7[37] = -71;v7[38] = 36;v7[39] = -63;v7[40] = 24;v7[41] = -109;v7[42] = -77;v7[43] = -22;sub_105F057(v14);printf("Welcome!! give me your flag:\n");do{v8 = j_j_j___fgetchar();if ( v8 == '\n' )break;input[index++] = v8;}while ( (int)index < 44 );if ( index >= 0x200 )j____report_rangecheckfailure();input[index] = 0;input_len = j__strlen(input);sub_105CEFB((int)v13, (int)v14, input_len);for ( i = 0; i < 256; ++i )v12[i] = v13[i];sub_105D5B8(v13, input, input_len);for ( j = 0; j < 44; ++j ){if ( v7[j] == input[j] )++v10;}if ( v10 == 44 )printf("Yes, u right!\n");elseprintf("no no no\n");sub_105D0CC("pause");return 0;
}

 

        通过判断,我们可以修改出输入和输出函数的位置。(这里我的ida是比较新的版本,所以可以直接判断出输入函数是什么,但是当无法直接判断时,可以通过在输出函数和加密函数上下断点,然后动调,来判断输入点的位置,在这里也判断了getchar函数的下面一个函数就是数据的加密函数

这里和之前有一个不同的地方是,实际上,这里的动调是有障碍的,因为程序本身存在反调试

这里使用附加的调试来绕过反调试

这里选择在这里下断点,即在数据加密函数之前,这样,输入的值就不会随着加密函数而改变,同时,也方便我们查看

可以在input(这里的input就是之前的v变量,为了方便理解和分析,所以做出了修改)里面查看到相应的数值

追踪可得对应的地址

既然能存入,则证明反调试成功了。那么现在在尝试按照V7变量的大小,来构建一个44字符的字符串(因为实际上,在代码中可知,代码会验证长度是否为44才会输出“you are right”),看看加密后的结果是什么,即通过V7去判断输入的正确的flag

但是,这里同样要注意的一点是,要判断到底这个代码是否存在我们一开始说的那种特性,即加密和解密的方式沿用的同一套代码

所以选择在加密函数(  sub_105D5B8(v13, input, input_len);)这里下断点

调试

通过调试可知,输入数据停的位置,以及追踪变量可知数据存储的地址是00D5F218

这时,再通过单步调试来让加密函数执行,来看看加密以后的结果是什么

还是追踪相同的地址,即00D5F218,快捷键是G,可以直接检索要查找的地址

可以看到地址所对应的已经改变

可以得到加密后的数据

867D0B0A0C741F7E0F7D8D0F2954980D0E0B0B895B620F0C58902B0D1E431A940C8A2532800F619508930E0A

这里需要注意的是,提取出的数据是16进制的,但是我们输入的值是ascill码值,所以在转换时要注意格式

将V7的数据导入

转换

得到了flag

补充知识点(较为常见的基本加密算法)

RC4加密

简介

        RC4是一种对称加密算法,在现在的技术支持前提下,当密钥(可变范围1-256字节,8-2048比特)长度为128比特时,用暴力破解密钥不太可行,所以可见RC4的密钥范围仍然能在今后抵御暴力破解的攻击。可见

RC4原理以及Python实现_rc4中的s盒的内容是固定的么-CSDN博客

异或加密

        介绍一下异或的运算:

        数学运算符为XOR(exclusive OR),在计算机中通常用"^"的符号表示(在英文模式下,按住shift键+键盘上方的数字6)

在二进制中:

1 XOR 0=1

0 XOR 1=1

1 XOR 1=0

0 XOR 0=0

可以看出若两个数相同取0,不同取1。

例:

运算11001 ^ 01011=10010

用其他进制表示的数做异或运算时,则应先将他们化为二进制的数,再做运算。(不足的位在前边填0补齐)

例:

计算6^3=110^011=101

*******************************************************

异或运算具有可逆性。

即:若a^b=c,则有b^c=a (a,b,c分别表示0或1)

逆向工程基础(异或)_异或逆向-CSDN博客

base加密算法

     这里以base64为例子

    base64编码原理:

    数据分组

    Base64 将输入的字节数据按照每 3 个字节一组进行划分。因为 3 个字节共有 24 位,而 Base64 编码是用 6 位来表示一个编码单元。这样,3 个字节正好可以划分为 4 个编码单元(24÷6 = 4)。

    编码转换

    将每个字节转换为二进制表示。例如,一个字节的值是 65(对应字符 ‘A’),它的二进制表示是 01000001。对于一组 3 个字节,就有 24 位二进制数据
    把这 24 位二进制数据按 6 位一组进行划分。对于前面的例子,就得到 4 组 6 位的二进制数据。
    然后将这 6 位二进制数据转换为十进制。这些十进制值的范围是 0 - 63。
    根据 Base64 编码表,将十进制值对应的字符作为编码后的结果。Base64 编码表包含 64 个字符,包括大写字母 A - Z、小写字母 a - z、数字 0 - 9 以及两个特殊字符 “+” 和 “/”。

    补位操作

    如果输入的字节数据长度不是 3 的倍数,那么需要进行补位。
    如果最后剩下 1 个字节,那么这个字节会被转换为 2 个 Base64 编码单元。在这 2 个单元后会补上 2 个 “=” 字符,表示补位。
    如果最后剩下 2 个字节,那么这 2 个字节会被转换为 3 个 Base64 编码单元,后面补上 1 个 “=” 字符。

reverse逆向算法之base64和RC4_base64"和 rc4-CSDN博客

Tea算法

简介

        TEA是Tiny Encryption Algorithm的缩写,以加密速度快,实现简单著称。REA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮(可以改变),TEA系列算法中均使用了一个DELTA常熟,但DELTA的值对算法并无什么影响,只是为了避免不良的取值,推荐DELTA的值取为黄金分割数与232的乘积,取整后的十六进制值为0x9e3779B9(也可以改变),用于保证每一轮的加密都不相同。为解决TEA算法密钥表攻击的问题,TEA算法先后经历了几次改进,从XTEA到BLOCKTEA,直至最新的XXTEA。

TEA加密算法与逆向方法简析 - Moominn - 博客园

        这段时间re学的也比较杂,先专门写一期用ida的总结,后续再接着写各种比赛的复现。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com