黑客赚钱的路子有多野,CTF逆向入门指南

《CTF特训营》学习总结——Reverse:逆向分析概述 一、逆向分析的主要方法 逆向分析主要是将二进制机器码进行反汇编得到汇编代码,在汇编代码的基础上,进行功能分析。经过反编译生成的汇编代码中缺失了源代码中的符号、数据结构等信息 ............ 阅读详情

1、背景

在CTF比赛中, CTF逆向题目除了需要分析程序工作原理, 还要根据分析结果进一步求出FLAG。逆向在解题赛制中单独占一类题型, 同时也是PWN题的前置技能。在攻防赛制中常与PWN题结合。CTF逆向主要涉及到逆向分析和破解技巧,这也要求有较强的反汇编、反编译、加解密的功底。

CTF中的逆向题目一般常见考点

1、常见算法与数据结构。

2、各种排序算法, 树, 图等数据结构。

3、识别加密算法与哈希算法代码特征,识别算法中魔改的部分。

4、代码混淆, 代码虚拟化, 修改代码流程, 反调试等。

5、软件加密壳是软件保护技术的集中应用。

CTF逆向题目两大主题:暴力破解、算法分析破解

1、暴力破解:通过修改汇编代码而跳过程序内部校验部分,从而改变程序的正常逻辑,最后满足题目要求来获取flag。这就考验在逆向分析样本时候,对样本验证代码定位能力。

2、算法破解:这主要需要分析样本中的加密部分的汇编代码,将其加密算法进行还原,并根据分析结果写出对于的解密程序,最后算出flag。这就考验了对样本分析过程中的耐心和扎实的逆向能力和一定的代码开发能力。

逆向解题常见技巧

1、逆向分析与功能猜测结合, 通过逆向分析进行缩小猜测范围, 猜测为逆向指出方向, 逆向再验证猜测的思路。

2、结合样本中汇编代码上下文与整体程序功能, 关注程序中给出的文字提示信息。

3、实际比赛的逆向题目多数是为出题而出题, 有目的性强, 功能结 构单一, 无关代码少等特点。

4、遇到程序代码量极大时, 可以先判断是否引用了较多的开源的代码, 而程序的主逻辑相对简单。

2、逆向基础

CTF逆向常用工具

Ollydbg、IDA、PCHunter、Exeinfo PE(PeTool)、CFF Explore、exeScope、ApiMonitorTrial、winhex。

CTF逆向需涉及知识点

汇编知识:window下的X86和X64; android下的ARM和ARM64。

文件结构:windox下的PE文件; android下的dex文件和ELF文件。

反调试技术: window和android下的调试和反调试对抗技术。

加壳和脱壳:PE的加壳和脱壳、 ELF和dex的加壳和脱壳。

开发能力:C、C++、python等语言的开发能力。

CTF样本逆向解题流程

1、突破保护:

获得样本程序时先用ExeInfoPePE工具进行查看程序属于哪平台下的,例如windows X86/X64、android、linux等,是否采用代码保护措施,例如:代码混淆、保护壳、各种反调试等,如果有那么在进行分析样本之前,需要先过掉样本混淆、脱壳、反反调试等技术来去除或绕过这些保护措施。

2、定位关键代码:

我们需要将目标软件进行反汇编,然后结合IDA和OD快速定位到关键代码(例如验证函数、关键字符串信息、程序导入表)。

3、动静结合:

我们找到程序的关键代码之后,就要对其进行详细的逆向分析。如果程序在IDA中F5可以生成伪代码,那么我们就先根据伪代码进行静态分析,然后模糊不清的地方可以结合ollydbg工具进行动态调试,观察来验证自己的猜想。

4、破解验证算法:

通过详细逆向分析完,程序的关键代码(例如:验证算法)之后,接着就要根据分析出的结果,进行暴力破解或者进行算法解密代码的编写以此来获取或生成flag。

CTF中常见的验证算法

1、 直接比较验证:

密钥一般没有经过加密,直接跟内置程序中的key进行比较(也就是硬编码方式比较),此类题型比较简单。

2、加密比较验证:

密钥一般会进行如异或、base64、MD5、RC4等形式的加密,此类题型需要识别出其加密方式,然后再根据其算法特点还原出相应的key值,现实CTF比赛中可能出现密钥用不同加密算法分段加密或嵌套验证等多种加密组合起来的方式,也需要去深入识别分辨。

3、 逆向自定义实现的算法:

这类题目就需要去逆向题目作者自己编写实现的算法了,这样的算法难度相对比较难,在逆向过程中需要识别出其是算法问题题目,然后分析出其每个函数代表什么操作来进一步解题,需要逆向算法的题目一般都比较难,需要理清算法实现思路,跟踪自己输入的数据使用算法进行了哪些处理,最后变成了什么和什么比较,需要有一定的耐心和细心,建议多加练习。

4、其他类型的加密题目:

实在解不出来的,也可以尝试是否可以绕过或暴力破解穷举等方式。

定位关键代码的方法

1、顺序跟踪法:

如果拿到的样本程序相对较小,代码量不多且主函数入口好找,即可使用顺序跟踪法,从程序主函数入口顺序跟踪,一步步分析完整的程序执行过程,基本就能知道程序的验证部分了,至于各个类型程序主函数的查找方法大家可以自行百度,这里还需要分清楚程序入口点和main函数的区别,大家一般需要找main函数,但也不全是找main函数,如果遇到了MFC的程序大家还需要根据具体情况具体分析,如果有条件大家也可以编码实现相应程序,然后反汇编来进行练习查找程序的主函数,这个需要平时多练习、多积累、多总结。

2、 字符串查找:

如果给定的样本程序没有做混淆处理,而且还有比较明显的字符串信息提示,那么就可以根据程序运行的提示,使用字符串查找功能查找程序所提示字符串的方式来反向查找其被引用的地址。例如IDA中shift+F12的字符串窗口,OD中查找->所有参考文本字串,字符串搜索的优先级很高,很多情况下对我们解题很有奇效,所以拿到程序后可以优先字符串查找尝试。

3、系统函数断点:

如果程序非常大而且也没有啥字符串提示信息可以利用,那么我们就可以猜测根据样本程序所使用的函数来定位关键验证代码,这需要掌握C语言或C++语言还有windows核心编程的知识,熟悉一些通用函数具有的功能,例如:程序出现了一个弹窗,那么程序就有可能调用了MessageBox这个函数,如果程序出现了输出,那么程序就有可能调用了printf这个函数等等,所以可以通过程序所表现出的状态来下相应的函数断点,然后栈回溯反向查找其引用位置,进而找到关键代码。

3、汇编基础

(以下知识点只起到抛砖引玉的作用)

X86汇编

32位CPU有16个寄存器,32位寄存器存放的是4个字节的数据,它们名称分别为:

4个数据寄存器(EAX、EBX、ECX和EDX);

2个变址和指针寄存器(ESI和EDI);

2个指针寄存器(ESP和EBP);

6个段寄存器(ES、CS、SS、DS、FS和GS);

1个指令指针寄存器(EIP);

1个标志寄存器(EFlags)。

X64汇编

64位CPU有16个通用寄存器,寄存器存放8个字节数据,它们名称分别为:

rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp

r8,r9,r10,r11,r12,r13,r14,r15

32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值。

64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用。

rax 作为函数返回值使用。

rsp 栈指针寄存器,指向栈顶

rdi,rsi,rdx,rcx,r8,r9 用作函数参数,依次对应第1参数,第2参数。。。

rbx,rbp,r12,r13,r14,r15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。

r10,r11 用作数据存储,遵循调用者使用规则,简单说就是使用之前要先保存原值。

通用汇编知识
在这里插入图片描述
在这里插入图片描述
函数(Call)的3种调用约定:_cdecl,_stdcall、_fastcall

_cdecl:是C语言的默认的函数调用方法,所有参数从右到左依次入栈,这些参数由调用者去清除。堆栈恢复常用指令add,esp,x ,x表示参数占用的字节数

_stdcall:是C++标准的函数调用方式,所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。

这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是ret x,其中x表示参数占用的字节数。

_fastcall:是编译器指定的函数快速调用方式。由于大多数函数参数个数很少,使用堆栈传递比较费时。因此_fastcall通常规定前两个参数由寄存器传递,其余参数还是通过堆栈传递。但是不同的编译器编译的程序规定的寄存器不同,返回方式一般是ret x。

总结三个调用约定:
在这里插入图片描述
函数参数和局部变量区分

函数的局部变量的存在形式:mov eax, dword ptr[ebp -4]

函数参数表示法:mov eax, [esp+arg_0]

Arm32汇编(Android)

ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。

未分组寄存器 R0 ~ R7,共8个;

分组寄存器 R8 ~ R12,R13 ~ R14 R8 ~ R12:其中FIQ模式下有单独的一组 R8 ~ R12,共5个;

另外 6种模式共用一组R8 ~ R12,共5个;总共10个;

R13 ~ R14:其中USR和SYS模式(表格的第一列)共用一组R13 ~ R14共2个,另外5种模式下各有独自的一组R13 ~ R14共10个;总 共12个;

程序计数器 PC 即R15,共1个;

分组寄存器R13、R14

寄存器R13通常做堆栈指针SP

寄存器R14用作子程序链接寄存器(Link Register-LR),也称为LR,指向函数的返回地址。

Arm64汇编(Android)

汇编中共有34个寄存器。其中包括31个通用寄存器、SP寄存器、PC寄存器,CPSR寄存器。

31个通用寄存器中:

X0-X30:表示是64位的寄存器。

W0-W30:表示是32位的寄存器。

X31 : 也称为零寄存器(它一般用于变量的初始化),它也有两表现形式:XZR:表示是64位的零寄存器, 它在内存中是用8个字节存储。

WZR:表示是32位的零寄存器,它在内存中是用4个字节存储。

SP : 保存栈指针(栈顶指针),使用SP或WSP来进行对SP寄存器的访问,也就是用于操作局部变量地址。

PC:程序计数器(PC指针寄存器),它用于指向即将要执行的下一条指令。

CPSR:状态寄存器

FP(X29):保存栈帧地址(栈底指针)

LP(X30):通常称X30为程序的链接寄存器,保存子程序结束后需要执行的下一条指令。
在这里插入图片描述
掌握ARM汇编中基本结构前需要回顾和并熟记以下的条件指令
在这里插入图片描述
怎样在ARM汇编中去识别和定位出函数

1.1、 B 跳转指令

1.2、 BL 带返回的跳转指令

1.3、 BLX 带返回和状态切换的跳转指令

1.4、 BX 带状态切换的跳转指令

2.直接向程序计数器 PC 写入跳转地址值。

通过向程序计数器 PC写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC

总结:识别函数的方法就是汇编指令中是否有包含:B、BL、BLX、BX、PC的汇编指令。

ARM函数调用约定采用的是:ATPCS

ATPCS的英文全称是ARM-THUMB procedure call standard(ARM-Thumb过程调用标准)

总结:参数1~参数4 分别保存到 R0~R3 寄存器中 ,剩下的参数从右往左一次入栈,被调用者实现栈平衡,返回值存放在 R0 中。

函数参数:

当参数个数小于等于4个的时候,使用r0到r3这4个寄存器进行参数传递;如果参数个数大于4个,余下的参数就通过sp所指向的数据栈进行参数传递。

比如有3个参数的话,那么r0代表函数的第一个参数,r1代表函数的第二个参数,r2代表函数的第三个参数。

比如有6个参数的话,那么r0-r3表示前面4个参数,然后余下的两个参数通过在栈上开辟8字节的空间进行参数传递。

r0–r3:存储传递给函数的参数值,多余的参数通过压栈传递。

r4 -r11:存储函数的局部变量,Thumb模式不会使用r8以后的寄存器

r12:是内部过程调用暂时寄存器(intra-procedure-call scratch register)。

r13:存储栈指针(sp)。在计算机中,栈非常重要。这个寄存器保存着栈顶的指针。这里可以看到更多关于栈的信息。

r14:链接寄存器(link register)。存储着当被调用函数返回时,将要执行的下一条指令的地址。

r15:用作程序计数器(program counter)。存储着当前执行指令的地址。每条执行被执行后,该计数器会进行自增(+1)。

函数的返回值放到r0中。

fp叫做frame pointer寄存器,即栈帧指针寄存器;sp叫做stack pointer寄存器,即栈指针寄存器。

在ARM指令系统中是地址递减栈,入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的你操作。包括push/pop和LDMFD/STMFD等。

函数返回值

1.结果为一个32位的整数时,可以通过寄存器R0返回。

2.结果为一个64位整数时,可以通过R0和R1返回,依此类推。

3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回。

4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回。

5.对于位数更多的结果,需要通过调用内存来传递。

4、反调试

Window反调试技术

应用程序通过利用反调试技术可以进行识别判断自身是否被调试,当识别到被调试就会改变执行的流程或修改自身自销毁。从而增加逆向调试的时间和复杂度。

反调试实现的技术

1.IsDebuggerPresent函数

实现原理:只能用于自身进程的检测,通过查询进程环境块(PEB)中的IsDebugged标志,如果被调试状态那么返回非0,调试没有被调试状态返回0

2.NeQueryInfomationProcess函数

原理:用于提取一个给定进程的信息,函数参数1表示进程句柄,参数2表示信息类型,第二个参数ProcessDebugPort的值如果设置为0x7,就可以进行返回句柄标识的进程是否被调试,如果处于调试状态那么就会返回调试的端口,非调试状态则返回0。

3.CheckRemoteDebuggerPresent函数

实现原理:它可以用于自身进程和其他进程,通过查询进程环境块(PEB)中的ISDebugged标志,如果被调试状态,那么返回值返回非0,没调试状态返回0。

4.FindWindowA、EnumWindows

实现原理:通过检测运行环境的调试器的窗口信息。

5.OutputDebigString函数

实现原理:调试器调试应用程序的时候是通过触发异常方式进行执行调试功能的,通过利用SetLastError函数设置错误码方式,并用OutputDebugString函数进行打印出来,如果程序再被附加调试状态那么GetLastError获取到的错误码是前面用

SetLastError的错误码一致,如果没有被调试,那么错误码可能是任意值。

6.注册表检测

实现原理:通过查找调试器引用的注册表信息进行判断,如果当前环境下的注册表有存在调试器的信息,

下面是调试器在注册表中的一个常用位置。

SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug(32位系统)

SOFTWARE\Wow6432Node\Microsoft\WindowsNT\CurrentVersion\AeDebug(64位系统)

该注册表项指定当应用程序发生错误时,触发哪一个调试器。默认情况下,它被设置为Dr.Watson。如果该这册表的键值被修改为OllyDbg(其他的调试器X64dbg、Windbg、ollyIce也一样),则应用程序就可能确定它正在被调试。

7.BeginDebugged标志检测

实现原理:当应用程序运行时候,fs:[30h]指向PEB基地址,如果指向的BeginDebugged标志位0的情况下,那么应用程序没有被调试,反之被调试。
在这里插入图片描述
8.检测ProcessHead标志

实现原理:在PEB结构中的Reserved数组中有一个未公开的位置ProcessHeap,它位于PEB结构的0x18处,ProcessHeap中包含ForceFlags标志,可以通过该标志进行判断是否处于调试状态。
在这里插入图片描述
9.检测NTGlobalFlag标志

实现原理:通过调试器启动的进程和正常创建启动的进程是有差别的,所以他们创建内存推的方式也不一样。NTGlobaFlag标志它是微软未公开的,在PEB偏移0x68位置,如果值为0x70,那么表示程序是调试器启动的。
在这里插入图片描述
10.检测父进程是否是explorer.exe

实现原理:正常启动的应用,他的父进程是explorer.exe,如果进程被调试状态那么它的父进程就是调试器进程。所以只要父进程不是explorer.exe进程就可以认定为调试状态。

反调试检测小结

以上的反调试技术是相对应用比较多的技术,对于反调试技术一般是通过多种方案结合的。反调试技术除了以上的方案,还有程序中执行代码段的校验,运行的调试器检测,调试器的特征码检测,断点检测等等。反调试是逆向的第一个门槛,只有跨过这个门槛,逆向才能真正开始。

下面针对调试反调试的技术总结方案可以借鉴学习。

java层检测

1.isDebuggerConnected函数

检测原理:当app被调试的时候,调用android.os.Debug.isDebuggerConnected() 返回值为true,否则返回值为false。

2.android:debuggable标签

检测原理:Android中的AndroidManifest.xml文件中如果debuggable属性值设置为true,那么久表示可以调试,属性值为false就表示不可调试。

3.包签名校验

检测原理:通过检测app的包签名信息,如果包签名不一致那么就是重新打包的。

native层检测

1.检测自身进程的TracerPid值

检测原理:可以通过/proc/pid/status或/proc/pid/task/pid/status获取到TracerPid值,默认下是0,被附加调试会变成调试的PID值。

2.基于IDA调试器检测

检测原理:android_server端口号(通过/proc/net/tcp 检测23946端口)、android_server文件信息、调试器进程名、

3.检测自身进程maps

检测原理:通过检测/proc/pid/maps检测自身进程是否有保护敏感模块信息来判断是否被调试。

4.检测父进程zygote进程

检测原理:因为zygote是所有程序的父进程,所有应用app也是通过fork方式创建出来的,通过/proc/pid/cmdline获取,如果当前父进程不是zygote进程那么久表示被调试了。

5.检测自身状态

检测原理: app在被附加调试过程中会被挂起暂停,所以通过/proc/pid/stat或/proc/pid/task/stat获取,当第三个字段属性为t时候,那么表示app在被调试暂停挂起。

6.抢占Ptrace

检测原理:在android系统中一个app只能被ptrace一次。所以先自己ptrace自己。

android反调试小结

由于android系统是开源的,所以对于以上利用系统属性及函数用于反调试的,都可以通过修改系统源码然后重新编译方式进行过检测。对于这种修改系统方式其实可以通过自己ptrace自身方式,如果自身ptrace后,tracePid值还是为0,那么表示该系统是重新修改编译过的。

攻防是个不断持续的过程,同样反调试和过反调试也是如此。就在于点高点低了。以上罗列的只是简单的一些方案。

5、加壳和脱壳

Window加壳方案

专门负责保护软件被非法修改或编译的程序。它附加在原始程序上,通过window加载器载入内存后,先于原始程序执行,以得到控制权,在执行过程中对原始程序进行解密、还原,还原后把控制权还给原始程序,执行原来代码。
在这里插入图片描述
它的作用:可以有效防止破解者对程序文件进行非法修改,也可以防止程序被静态反编译。不同外壳的侧重方面是不一样的,有的侧重压缩,有的侧重加密。例如压缩壳的特点就是减少软件的体积,加密保护就不是它的重点。

常见壳的加载过程:

1.保存入口参数

2.获取壳本身需要使用的API地址

3.解密原程序各个区块的数据

4.IAT的初始化

5.重定位项的处理

6.Hook API

7.跳转到程序原入口点(OEP)

壳的种类:

压缩壳有:UPX、ASPack、PECompact等等

UPX是开源:https://upx.github.io/

ASPack壳的官网:http://www.aspack.com

加密壳:AsProtect、Armadillo、ExeCryptor等等

虚拟机壳:Themida、Winlicense、VMProtect等等

以上这些壳都可以用ExeInfo PE或PEID工具通过壳特征方式识别出什么类型的壳。

下图中是PEID工具识别壳的特征码Signs文件里面的特征。
在这里插入图片描述
window脱壳方案

手动脱壳的步骤:

1.查找真正的程序入口点

2.抓取内存映像文件

3.重建PE文件

定位程序OEP的方法:

1.根据跨段指令进行寻找OEP
在这里插入图片描述
在这里插入图片描述
2.用内存访问断点寻找OEP

方法:先打开内存模块(Alt+M),接着直接对代码段(例如.text区段)进行下内存访问断点(F2),这个断点是一次性断点,当所在段读取或执行时就中断,中断发生后,断点将自动删除。

3.根据栈平衡原理寻找OEP

在编写加壳软件时,必须保证外壳初始化的各寄存器值和原程序的各寄存器值是相同的。通常用pushad/popad,pushfd/popfd指令来保存和恢复现场环境。

4.根据编译语言特点寻找OEP

各类语言编译的文件入口点都有自己的特点。使用同一种编译器编译的程序,其入口代码都很类似,都有一段启动代码,编译器在编译程序时会自动和程序连接。在完成必须的初始化工作后,调用WinMain函数。

Android加壳方案

目前市面上加固产品种类:360加固、爱加密加固、梆梆加固、腾讯乐固、网易易盾、几维加固、顶象加固。

一般App源程序加密之后就存放在那几个目录下,一般是:dex文件尾部,libs目录,assets目录。

加固后可以通过app包里面的lib文件夹下的特有文件进行识别加固厂商。

网易易盾:libnesec.so、libbugrpt.so

爱加密:libexec.so,libexecmain.so,ijiami.dat

梆梆:libsecexe.so,libsecmain.so , libDexHelper.so

阿里聚安全:aliprotect.dat,libsgmain.so,libsgsecuritybody.so

腾讯安全:libtosprotection.armeabi.so,libtosprotection.armeabi-v7a.so,libtosprotection.x86.so

娜迦:libchaosvmp.so, libddog.so,libfdog.so

360:libprotectClass.so,libjiagu.so, libjiagu_art.so,libjiagu_x86.so

通付盾:libegis.so,libNSaferOnly.so

网秦:libnqshield.so

百度:libbaiduprotect.so

腾讯:libshellx-2.10.6.0.so,libBugly.so,libtup.so, libexec.so,libshell.so

APKProtect:libAPKProtect.so

几维安全:libkwscmm.so, libkwscr.so, libkwslinker.so

加固的特点
在这里插入图片描述
Android脱壳方案

脱壳的主要流程:就是在App程序运行起来后,将源App的数据内存释放出来后,并将释放出来的数据拷贝出来。

1.内存dump法

通过利用frida框架结合脱壳脚本dex-dump

https://github.com/hluwa/FRIDA-DEXDump

通过在app内存中暴力搜索 dex.035或者dex.036 。

通过读取/proc/pid/maps查找后,进行dump数据。

2.hook关键函数法

主要利用frida框架进行脚本开发。

通过hook关键函数InMemoryDexClassLoader、dvmDexFileOpenPartial、DexClassLoader,dexFileParse、memcmp然后去dump解密后的dex数据

3.动态调试法

通过动态调试app下mmap函数断点,然后去dump出源dex数据。

4.定制系统法

通过修改重编译android系统并刷机。

Hook Dalvik_dalvik_system_DexFile_defineClassNative。

枚举所有DexClassDef,对所有的class,调用dvmDefineClass进行强制加载

5.dex2oat法

ART模式下,dex2oat生成oat时,内存中的DEX是完整的。

《CTF特训营》——Reverse:逆向分析 一、常规逆向分析流程 1.API断点 API的定义:是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 在获取文本输入时。对于窗口类程序获取文本方式主要通过GetWindowText和 ........................ 阅读详情

相关推荐

CTF逆向Reverse入门学习路线(面向小白)

CTF逆向 Reverse入门学习路线(入门指南)面向小白

Sciurdae的博客 2万+

CTF之逆向入门

ELF文件在各种平台下都通用,ELF文件有32位版本和64位版本,其文件头内容是一样的,只不过有些成员的大小不一样。在这个二进制文件中,符号没有被剥离,因此我们可以看到函数名称,这使得它更容易理解。节表头部(Section Headers)包含了描述文件节区的信息,比如大小、偏移等,但这些对二进制文件的执行流程来说并不重要。我们先来看看 ELF 文件头,如果想详细了解,可以查看ELF的man page文档。3、我们可以查看“.rodata ”部分的偏移量,可以更好的查看这些字符。它到底循环了多少个字符?

小司机的奥拓 3606

CTF竞赛入门(五)逆向工程

逆向 逆向类题目是CTF中难度相对较高的题型,现已覆盖Windows逆向、Linux逆向和Android逆向,再加上Flash逆向、Python逆向、.NET逆向、ARM逆向等。 软件逆向工程的应用 软件维护 软件破解 恶意程序饭呢西 系统漏洞分析 手段 静态分析 动态分析 学习逆向需要的知识 C 预处理 编译 汇编 链接 计算机结构 CPU 内存 总线 I/O设备 寄存器 通用寄存器 32 8 程序状态与控制寄存器 32 1 指令指针寄存器 32 1 汇编 数据转移 MOV des

single7_的博客 2328

黑客赚钱的路子有多野?CTF逆向入门指南

在CTF比赛中, CTF逆向题目除了需要分析程序工作原理, 还要根据分析结果进一步求出FLAG。

瓦罗兰特顶级C位的博客 1922

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

【零基础教程】HEC-RAS 1D/2D全流程模拟指南|从水动力到水质建模一次搞定!

HEC-RAS由美国陆军工程兵团水文研究中心研制,具有完整的一二维耦合的水动力及水环境模拟功能,也具有闸、涵洞、桥梁以及泵站等水利构筑物的模拟能力;同时也可以与HEC研制的水文模型(HMS)、洪水淹没风险和损失分析软件(FDA)等耦合,是免费软件中使用最方便、应用最广泛的软件之一。2.HEC-RAS与HEC-HMS的耦合(不详细讲HEC-HMS)3.淹没风险分析软件HEC-FDA与HEC-RAS耦合。案例十八:HEC-RAS与HEC-HMS的耦合。案例十九:HEC-RAS与HEC-FDA的耦合。

weixin_48230888的博客 873

2024年网络安全最全黑客赚钱的路子有多野?CTF逆向入门指南(1)

网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

2401_84618514的博客 1014

BQ4050开发进阶(二):Protections参数优化策略与实战解析

本文深入解析了BQ4050电池管理芯片中Protections参数的优化策略与实战方法。针对电压、电流、温度等核心保护功能,详细阐述了如何根据具体电芯特性、负载场景和环境因素,精细调整CUV、COV、OCC/OCD等阈值与延时,以在确保电池绝对安全的前提下,实现极致的用户体验与系统可靠性。

rgv234567的博客 482

2024年最全黑客赚钱的路子有多野?CTF逆向入门指南(1),2024最新大厂网络安全面经

在ARM指令系统中是地址递减栈,入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的你操作。32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rbx,rbp,r12,r13,r14,r15 用作数据存储,遵循被调用者使用规则,简单说就是随便用,调用子函数之前要备份它,以防他被修改。_stdcall:是C++标准的函数调用方式,所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。

2401_84253380的博客 944

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7067

三相SST固态变压器详细设计案例

本案例针对400kVA、30kHz三相固态变压器(SST)开展详细设计,核心采用输入串联输出并联(ISOP)拓扑架构(模块化多电平矩阵变换器M3C简化版),重点完成高频变压器的参数计算、绕组设计、损耗分析及液冷温升验证,同时覆盖系统级架构设计、半导体损耗估算及整机效率优化,全流程基于当前电力电子技术可行性展开。

qq_32103755的博客 3307

2024年最全黑客赚钱的路子有多野?CTF逆向入门指南(2),2024年最新12道网络安全高级面试题

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。需要完整版PDF学习资源私我。

2401_84253380的博客 859

IsaacGym四足机器人sim to real全过程详细解析(walk these ways方法)

本文使用强化学习的方法运行到Aliengo机器人上完成从训练到部署的全过程。该方法使用的是GO1机器人提供了完整的sim to real代码和遥控器控制代码,所以我们只需要重新训练和部署健康就可以使用在Aliengo上。该方法使用lcm进行通讯首先程序通过UDP和机器人控制板进行通讯获取机器人状态并下达指令。然后又通过lcm进行机器人状态信息的发布和模型命令的获取。

weixin_44061195的博客 2万+

帽合法赚钱渠道全盘点!附带 CTF 逆向零基础入门完整指南

这篇文章首先介绍了CTF比赛中逆向题目的特点与常见考点,包括算法识别、代码混淆、反调试等技术,并分为暴力破解和算法分析两大解题方向。接着详细讲解了CTF逆向的基础知识,如常用工具(Ollydbg、IDA等)、涉及技能(汇编、文件结构、加壳脱壳等)以及解题流程(突破保护、定位代码、动静结合分析)。文章还提供了X86/X64和ARM32汇编的基础知识,包括寄存器功能、调用约定等核心概念,帮助零基础读者入门CTF逆向。最后分享了黑客合法赚钱的渠道与网络安全学习资源包,适合对安全领域感兴趣的初学者参考。

m0_56146626的博客 433

CentOS 7.9安装python3.11

CentOS 7.9安装python3.11

leafseelight的专栏 1343

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3153

CTF逆向入门指南:从零基础到读懂二进制程序的完整路径

在网络安全领域,二进制程序分析是样本研判、漏洞挖掘与软件保护的核心基础。CTF逆向正是训练这一能力的高效场景,它要求分析者在没有源代码的情况下,从可执行文件(如ELF、PE)中提取运行逻辑、还原加密算法并找到隐藏的flag。学习过程通常从C语言指针与内存模型开始,逐步掌握汇编指令、文件格式与调试工具(如gdb、objdump),再通过静态反汇编与动态调试相结合的方式拆解程序比较逻辑。具备逆向思维后,不仅能提升CTF竞赛获奖机会,也为企业众测平台提交漏洞赏金、进入安全研发岗位铺设了明确的成长路径。本文围绕一套

weixin_28568819的博客 440

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

CTF 竞赛拿奖能赚钱吗,揭秘网络安全圈的另一条搞钱路子

本文揭秘 CTF 竞赛在网络安全圈的变现逻辑。指出单纯靠奖金难致富,但获奖经历是进入大厂、获取高薪 Offer 的强力跳板。文章解析赛制与备赛路线,强调以赛促学,将技术转化为职业资本,助力开发者规划网络安全职业发展路径。

2503_90953556的博客 731

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 搞安全开发都是用什么编程语言?
下一篇: 一文学会,三款黑客必备的抓包工具教学(实在太强了,总有一款适合你)
AI小模型
博客等级 码龄6年 6863粉丝 487原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值