Crack 小实验

工具

  • Dev C++(书上使用的VS)
  • IDA_Pro_v7.0
  • Ollydbg
  • LordPE
  • 010 editor

使用IDA打开文件

  • 找到程序分支点
  • 空格跳转到汇编界面
  • 得到VA:0x40156d

使用OD打开文件

  • Ctrl+G跳转到IDA得到的VA
  • 加断点,运行,此时输入任意密码,回车后程序在此中断。
  • 我们只要把je改成jne就能实现输入错误密码返回正确结果。


使用LordPE打开文件

  • OD修改只是修改了内存中的值
  • 利用公式计算:
    文件偏移地址 = 虚拟内存地址(VA) - 装载基址 - 节偏移
    = 0x0040156D - 0x00400000 - (0x1000 - 0x400)
    = 0x96D

使用十六进制编辑器修改文件

  • 010Editor打开文件
  • Ctrl + G 跳转到0x96D
  • 修改740e为750e
  • 保存运行
  • 输入正确密码显示密码错误,错误密码会返回正确的提示

实验 2.2.2 突破密码验证程序

知识点

实验环境与工具

  • Win10 64bit
  • Dev-C++
  • IDA-Pro
  • OD

实验记录

  • 代码:

     #include <stdio.h>
    #include <string.h> #define PASSWORD "1234567" int verify_password(char *password)
    {
    int authenticated;
    char buffer[];
    authenticated=strcmp(password,PASSWORD);
    strcpy(buffer,password);
    return authenticated;
    } int main()
    {
    int valid_flag = ;
    char password[];
    while()
    {
    printf("Please input password: ");
    scanf("%s", password);
    valid_flag = verify_password(password);
    if(valid_flag)
    {
    printf("incorrect password!\n\n");
    }
    else
    {
    printf("Congratulation! You have passed the verification!\n");
    break;
    }
    }
    return ;
    }

实验步骤

  • 运行测试:
  • 静态反汇编:
    • strcpy后一句地址为0x401532
  • 动态调试
    • 输入"qqqqqq",authenticated的值为1
    • 输入"qqqqqqqq"尝试使用字符串末尾的'\0'把authenticated的低字节覆盖从而变成0

    • 成功绕过了验证

实验 2.3.2 更改返回地址

实验工具

  • 010 Editor
  • Dev C++
  • IDA-Pro
  • OD

实验知识点

  • 缓冲区溢出覆盖栈内函数的返回地址

实验源码

 #include <stdio.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
} main()
{
int valid_flag=;
char password[];
FILE *fp;
if(!(fp=fopen("password.txt","rw+")))
{
exit();
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation!You Have passed the verification!\n");
}
fclose(fp);
}

实验步骤

  • 运行测试
  • 静态反编译,strcpy下一句为0x40152e,密码正确的分支是0x4015ca

  • 动态调试
    • 当前栈帧的EBP是0x61fa78
    • 查看栈的内容
    • 尝试直接修改返回地址,成功跳转到正确密码的分支

    • 使用二进制编辑器构造payload
    • 运行,虽然会闪退,但是通过捕捉,可以发现确实跳转到了正确的分支

实验 2.4 代码植入

实验工具

  • Windows XP SP3
  • Visual C++ 6.0
  • Depends
  • OD

源码

 #include <stdio.h>
#include <string.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);
return authenticated;
} main()
{
int valid_flag=;
char password[];
FILE *fp;
LoadLibrary("user32.dll");
if(!(fp=fopen("password.txt","rw+")))
{
exit();
}
fscanf(fp,"%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation!You Have passed the verification!\n");
}
fclose(fp);
}

实验步骤

  1. 编译程序并且拖入Depends,发现并没有user32.dll
  2. 从编辑器里面打开dll文件,发现也可以看到库的基地址,user32.dll的库基地址为0x77D10000,MessageBoxA的偏移地址为0x407EA,地址为0x77D5 07EA‬

  3. 先用123422343234423452346234来找到栈中buffer的位置,buffer的起始地址是0x12FAF0

  4. 构造password.txt
  5. 代码植入成功
  6. 运行测试

遇到的问题

  • Depends的结果与实验指导上的不一样,没有显示出user32.dll的库基地址

    • 从编辑器打开user32.dll:

最新文章

  1. Microsoft SQL Server 2008 R2 安装卸载
  2. jackson error 含义log
  3. 09B-独立按键消抖实验02——小梅哥FPGA设计思想与验证方法视频教程配套文档
  4. LINUX下常用SHELL指令
  5. Servlet与JSP版本历史以及Tomcat支持的版本
  6. BZOJ3542:DZY Loves March
  7. Linux用户与“最小权限”原则
  8. 【循序渐进学Python】8.面向对象的核心——类型(下)
  9. 二模 (2) day2
  10. Intellij IDEA开发第一个Android应用
  11. window nodejs 版本切换 nvmw
  12. CodeForces 190A Vasya and the Bus
  13. Swing 组件焦点设置
  14. EventBus实现 - 发布订阅 - XML加载
  15. poj3683
  16. 201521123059 《Java程序设计》第二周学习总结
  17. FX-玩列表
  18. Python基础理论 - 常用模块
  19. 详解 leetcode 猜数字大小 II
  20. android--------阿里 AndFix 热修复

热门文章

  1. Mybatis 解决问题的记录与博客
  2. yii 上传视频(ajax)
  3. CDOJ 1135 邱老师看电影 概率dp
  4. 快速乘(O(1))
  5. 【知识库】-数据库_MySQL之基本数据查询:子查询、分组查询、模糊查询
  6. [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)
  7. hive分区表插入一条测试数据
  8. linux IP 网关配置
  9. Linux shell - `dirname $0` 定位到运行脚本的相对位置
  10. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现