刚开始接触二进制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
,保存
直接运行修改后的文件,完成!😄😄