苏大强的保险箱-1

苏大强的保险箱-1

题目来源:

ISCC2020 RE

运行程序观察程序特征

运行程序,随意输入,可得到下图:

苏大强的保险箱-1

由上图可知,程序基本逻辑很简单,在 命令行 按照提示 密码即可,随意输入 123456 可得到 关键字符串“Wrong!Please try again!”

同样从上图可知,不需要输入Name,直接输入密码;可以推测该密码多半为固定字符串吗,已经存储在数据段,与输入的开箱密码进行对比;所以要注意查看程序运行中出现的固定字符串

使用查壳工具进行查壳

根据信息可知这个程序无壳,对这部不甚了解,所以不展开了

分析步骤

  • 将程序拖入X64DGB或者OD
  • 右键->搜索->所有模块->字符串 ;然后搜索上述所说关键字符串,对他们下断点;双击进入第一个关键字符串所在的位置

苏大强的保险箱-1

  • 第一个字符串的位置即为 标号为1 处
  • 观察下方内容 标号为2处 可以看到重要的提示部分 说明当开箱密码输入正确时,会显示 Flag 和Key
  • 在OD中运行 会先运行 下方标号为3的部分
  • 注意 标号为4 的地方 出现了可疑的固定字符串, 尝试输入程序后发现并不是密码,保留观察
  • 从标号为3处 单步运行,发现了标号为4 明显可知 取得输入的密码长度和 0xA对比 说明 密码长度要求为 10

F8单步运行 发现关键 比较函数,位于 00401709 F7单步步入该函数

苏大强的保险箱-1

进入该函数后得到如下图所示该函数 中 有多轮 循环;可单步F8进行分析 或者整体分析 判断 0040151为关键的 判断 部分,光标点击该处F4 ,运行到光标处;意外发现出现了固定字符串 信息量极为丰富,下图标号为2 长度为10 即为可能是 密码

苏大强的保险箱-1

将标号为2的字符串输入程序,发现并不是正确密码,对比标号1 发现原本缩入的 0123456789被翻转倒置,所以推测正确的密码 为该字符串的倒置

尝试输入 可得:
苏大强的保险箱-1

算法逆向

根据上述找的关键位置,将程序拖入IDA ,找到该位置,F5得到

苏大强的保险箱-1

#include <iostream>
#include <string>
using namespace std;

int main(){
    char a[10]={0x0A,0x7,0x41,0x0B,0x2C,0x0C,0x3D,0x38,0x27,0x73};
    char b[10]={0xD5,0x9E,0xB4,0x70,0x78,0x60,0x82,0x70,0x39,0x5E};
    string s="";
    for(int i=0;i<10;i++){
       s+=b[9-i]-i-a[i] ;
    }

    //字符串逆序输出 
    for(int i =s.size();i>=0;i--){
        cout<<s[i];
    }
    return 0;
}

注意 key值 :a1dWT1pJXF1USVxRV1ZbUElQSVBJ

原文链接: https://www.cnblogs.com/ms-study/p/13173964.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    苏大强的保险箱-1

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/357614

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午11:51
下一篇 2023年3月2日 上午11:51

相关推荐