zoukankan      html  css  js  c++  java
  • 0day学习笔记(3)--修改函数返回地址

    • 环境: devc++(编译改为32位),windows10
    • 源码(来自书中)
    #include <stdio.h>
    #define PASSWORD "1234567"
    
    int verify_password (char *password)
    {
    int authenticated;
    char buffer[8];
    authenticated=strcmp(password,PASSWORD);
    strcpy(buffer,password);
    return authenticated;
    }
    main()
    {
    int valid_flag=0;
    char password[1024];
    FILE * fp;
    if(!(fp=fopen("password.txt","rw+")))
    {
    exit(0);
    }
    fscanf(fp,"%s",password);
    valid_flag = verify_password(password);
    if(valid_flag)
    {
    printf("incorrect password!
    ");
    }
    else
    {
    printf("Congratulation! You have passed the verification!
    ");
    }
    fclose(fp);
    }
    
    • 过程
    1. ida找到跳转地址
      在这里插入图片描述
    2. od中定位
      在这里插入图片描述
    3. 观察汇编代码主要注意三个位置: 调用函数的位置,返回地址,验证成功的地址
      在这里插入图片描述
    4. 栈中寻找返回地址(这里和书中不太一样)暂时不清楚原因
      在这里插入图片描述
    5. 然后在password.txt文件中写入7组1234,再用010editor打开更改要覆盖的地址(注意逆序书写)
      在这里插入图片描述
    6. 重新运行程序发现程序并没有经过断点,更改返回地址成功
      在这里插入图片描述

    中间遇到的一点问题 qqqqqqq在多处出现,导致未能找到返回地址

  • 相关阅读:
    Android_程序未处理异常的捕获与处理
    instanceof关键字
    乐优商城项目爬坑
    [LeetCode]Isomorphic Strings
    [LeetCode]Contains Duplicate II
    [LeetCode]Valid Sudoku
    [LeetCode]Valid Anagram
    [LeetCode]Contains Duplicate
    [LeetCode]Single Number
    [LeetCode]Valid Number
  • 原文地址:https://www.cnblogs.com/l0nmar/p/12553846.html
Copyright © 2011-2022 走看看