0day2安全——笔记1

第一章

PE和内存之间的映射

节偏移

文件偏移地址(File Offset Address):数据在PE文件中的地址

装载地址(Image Base):PE装入内存的基地址

虚拟内存地址(Virtual Address,VA):PE文件中的指令被装入内存后的地址

相对虚拟地址(Relative Virtual Address,RVA):相对虚拟地址是虚拟内存地址相对于映射基址(装载地址)的偏移量

关系:

VA = Image Base + RVA

节偏移=文件虚拟地址偏移量-文件物理地址偏移量

文件偏移地址=虚拟内存地址-装载基址-节偏移

例:虚拟内存地址为0x4010D4,文件虚拟地址偏移量为1000h,文件物理地址偏移量为200h

 文件偏移地址=0x4010D4-0x400000(1000h-200h)=0x2D4  (注意十六进程的换算)

分析和破解win32控制台程序

环境如下

系统:windows7 x64虚拟机

软件:IDA Pro、UltraEdit

编译器:vc++6.0

注意:尽量不用vs或其他IDE,否则反编译时出现的伪代码不同,有些IDE编译会加入IDE的一些代码提高软件安全性等(笔者使用了vs2017,反编译出来没有main函数)

代码:

#include <stdio.h>
#include <string.h>
#define PASSWORD "123456"


int verfity(char *password) {
    int i;
    i = strcmp(password, PASSWORD);
    return i;


}

int main() {

    char password[1024];
    int i;
    printf("please input pwd:
");
    while (1) {
        scanf("%s",password);

        i = verfity(password);
        if (i){
            printf("fail!please input pwd:
");
        }
        else{
            printf("success
");
            break;
            
        }
    }
    return 0;

}

载入IDA,这里选择第一个(进行PE分析)

进入main函数,按F12查看函数的流程图

经过分析后我们发现破解的关键点在于怎么跳过验证(两个字符串对比)

我们可以从字符串对比的判断JZ(为零则跳)作为切入点

按空格键进入汇编代码,找到JZ的虚拟地址004010D4

 

根据前面虚拟内存计算的例子,可以得出文件偏移地址是0x2D4

打开UltraEdit,进入0x2D4的位置,把74(机器指令JZ)修改为75(机器指令JNZ)

保存程序,破解完成!

关于机器指令和汇编指令可以参考: https://blog.csdn.net/ida0918/article/details/52655615

原文地址:https://www.cnblogs.com/luocodes/p/11863368.html