初试逆向 - 01

刚开始接触二进制0day技术,入门第一式

破解一段验证代码,如图

编译器:Visual Studio 2019 Enterprise,编译选项如下

编译后生成exe格式的PE文件

先拖进IDA里面看看程序的逻辑流程:

可以看见IDA已经自动识别出main函数了
小插曲:一开始博主一直好奇怎么去定位main函数,在找了一大堆资料和问了一圈之后,其实不需要刻意去找到main函数的位置,IDA和x64dbg都有自动定位功能,一般默认程序的原始入口点,简称OEP,全称Origin Entry Point,就是程序开始执行的地方,main函数是程序逻辑开始执行的地方

LordPE看看PE文件信息:

这里需要知道的2个公式是:
VA[虚拟内存地址,Virtual Address] = Image Base[装载基址] + RVA[相对虚拟地址, Relative Virtual Address]文件偏移地址[File Offset] = VA - Image Base - 节偏移[Section Offset] => RVA - 节偏移

现在把程序用OllyDBG跑起来,OD会停在程序的入口处,注意:因为操作系统的内存管理器有动态基址模式,每次重启完之后程序的装载基址都会变化,如下2图
重启前

重启后

在OllyDBG可以通过Alt + e 来查看程序的装载基址

目前的装载基址是0x00C80000

回到IDA,能看到引起程序分支的指令是jz short loc_4119CF,在左下角能看到指令的位于0x004119BE同时也显示了这条指令在文件中相对于文件头的位置,但是先不用它,到后面再计算出来

在LordPE看到装载基址是0x00400000,所以RVA = VA - Image Base = 0x004119BE - 0x00400000 = 0x000119BE

回到OllyDBG重启过了,加载程序,按Alt + e调出可执行模块窗口,记录下当前的动态基址是0x00260000,根据上面提到的公式,可以得到跳转指令在当前的VA = 0x00260000 + 0x000119BE = 0x002719BE

找到这个地址后,双击这条指令,把je改成jnz,按Assemble写入内存,按F2键下断点


执行程序,随便输入,回车后,程序执行到断点处

按F7和F8,单步追踪,发现原本应该正确的1234567现在提示不正确

原本错误的13579现在提示通过

目前对于程序的修改止于内存层面,下一步尝试把修改后的逻辑写入文件
先算出这条指令相对于文件开头的偏移,根据公式,可以得到文件偏移 = 0x002719BE - 0x00260000 - (0x00011000 - 0x00000400)[这个是.text节的节偏移] = 0x000119BE - 0x00010C00 = 0x00000DBE
C32Asm打开,定位到距离文件头第0xDBE个字节处,将代表jz指令的机器码74改成jnz指令的机器码75,保存

直接运行修改后的文件,完成!😄😄