其他分享
首页 > 其他分享> > 苏大强的保险箱-1

苏大强的保险箱-1

作者:互联网

苏大强的保险箱-1

题目来源:

ISCC2020 RE

运行程序观察程序特征

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

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

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

使用查壳工具进行查壳

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

分析步骤

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

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

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

尝试输入 可得:

算法逆向

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

#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