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:

《0day安全-软件漏洞分析技术》实验笔记1的更多相关文章

  1. 《0day安全软件漏洞分析技术》学习笔记

    最近因为工作需要在看0day的软件漏洞分析,发现这本<0day安全软件漏洞分析技术(第2版)>真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践, ...

  2. 《0day安全-软件漏洞分析技术》实验笔记2

    实验 3.4 通用shellcode 工具 Windows XP SP3 Visual C++ 6.0 OD IDA 源代码 见随书代码,参考:https://github.com/jas502n/0 ...

  3. 书评第003篇:《0day安全:软件漏洞分析技术(第2版)》

    本书基本信息 丛书名:安全技术大系 作者:王清(主编),张东辉.周浩.王继刚.赵双(编著) 出版社:电子工业出版社 出版时间:2011-6-1 ISBN:9787121133961 版次:1 页数:7 ...

  4. 《ODAY安全:软件漏洞分析技术》学习心得-----shellcode的一点小小的思考

    I will Make Impossible To I'm possible -----------LittleHann 看了2个多星期.终于把0DAY这本书给看完了,自己动手将书上的实验一个一个实现 ...

  5. PHPCMS9.6.0最新版SQL注入和前台GETSHELL漏洞分析 (实验新课)

    PHPCMS9.6.0最新版中,由于/modules/attachment/attachments.php的过滤函数的缺陷导致了可以绕过它的过滤机制形成SQL注入漏洞,可导致数据库中数据泄漏. 而且在 ...

  6. 认识二进制安全与漏洞攻防技术 (Windows平台)

    二进制漏洞是指程序存在安全缺陷,导致攻击者恶意构造的数据(如Shellcode)进入程序相关处理代码时,改变程序原定的执行流程,从而实现破坏或获取超出原有的权限. 0Day漏洞 在计算机领域中,0da ...

  7. 漫谈SCA(软件成分分析)测试技术:原理、工具与准确性

    摘要:本文介绍了SCA技术的基本原理.应用场景,业界TOP SCA商用工具的分析说明以及技术发展趋势:让读者对SCA技术有一个基本初步的了解,能更好的准确的应用SCA工具来发现应用软件中一些安全问题, ...

  8. Linux漏洞分析入门笔记-CVE-2015-0235

    Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...

  9. Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出

    操作系统   Ubuntu 16.04 /32 位 调试器     IDA pro 7.0 漏洞软件   binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...

随机推荐

  1. nginx 缓存,大文件分片请求方法

    实现的途径:expire cache-control 更新缓存的机制 如何校验本地缓存是否过期 expires cache-control(max-age)如果超期,说明失效 然后进行etag是否过期 ...

  2. Mybatis Generator-自动化生成代码步骤

    链接:https://blog.csdn.net/guo_xl/article/details/86004068 文档:http://mybatis.org/generator/configrefer ...

  3. vue中axios的二次封装

    我们做项目时,虽然axios也可以直接拿来用,但是对接口比较零散,不太好进行维护,也会产生大量的重复代码,所以我在这对axios进行了统一接口处理 第一步,先在src中的公共文件夹中如utils里新建 ...

  4. 初识java的算术运算符

    总所周知,算术运算符作为日常基本算法在我们上小学时接触到了,对加.减.乘.除熟练运用,这些基础算法也被引用到Java语言中.一般越基本的东西越重要,类比生活中的阳光,空气,水,土等... 闲话少叙,那 ...

  5. Cortex-M3 入门指南(三):时钟总线与复位时钟控制器

    [reset clock control  复位和时钟控制器] 时钟信号对于处理器非常重要,比如我们熟悉的 CPU 就是由时钟信号驱动的,而主频就是内核的的时钟信号频率.Cortex-M3 有着复杂的 ...

  6. 微信支付接口,curl错误代码58

    微信支付接口,curl错误代码58 之前的微信付款到用户零钱都是好好的,今天运营来找我, 我想了了下,就是进行了网站搬家 看了下 微信支付相关的证书配置文件 知道了,在这个 要改下证书的路径 WxPa ...

  7. [POJ1151][HDU1542]Atlantis(线段树,扫描线)

    英文题面,我就只放个传送门了. Solution  题意是算矩形面积并,这是扫描线算法能解决的经典问题. 算法的大致思想是,把每一个矩形拆成上边和下边(以下称作扫描线),每条扫描线有四个参数l,r,h ...

  8. python2.7与3.4共存【win】

    python3并非完全向后兼容python2 方法一: 电脑里有3.4,再安装个2.7 下载地址:https://www.python.org/downloads/windows/ 解释下安装包: W ...

  9. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  10. nginx返回固定字符串

    在系统还没有做集群的情况下,直接重启项目时刚好用户在使用的话,一般都会受到投诉,那么使用nginx返回类似“系统维护”的提示信息并且提前在应用上面做通知才是合适的做法 那么记录一下nginx里面的配置 ...