首页
社区
课程
招聘
[原创]新人报道,一个自制CrackMe
发表于: 2017-8-10 11:02 3218

[原创]新人报道,一个自制CrackMe

2017-8-10 11:02
3218

输入注册码回车,显示Success为成功

显示Failure或直接退出为失败

【别改Failure字符串常量,谢谢】


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
2
3  4  1  17  6  8  33
2017-8-10 16:26
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
41
34
33
17
50
19
65
2017-8-10 16:31
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上perfect..北海若的cm也很厉害呀。
2017-8-10 16:31
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5




Lnairan

3 4 1 17 6 8 33

恭喜你

你怎么做的可以说说嘛

2017-8-10 16:34
0
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
6
北海若 Lnairan 3 4 1 17 6 8 33 恭喜你你怎么做的可以说说嘛
我数学和算法很菜,让大神见笑了,其他位都好说用正确的ASCII码乘以相应的数得到结果,在到相应的内存中找对应的索引值,用程序跑一下得到一个结果,第3位的计算我是一点一点试的
2017-8-10 23:23
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Lnairan 我数学和算法很菜,让大神见笑了[em_40],其他位都好说用正确的ASCII码乘以相应的数得到结果,在到相应的内存中找对应的索引值,用程序跑一下得到一个结果,第3位的计算我是一点一点试的[em_16]
我有一个常数写错了,所以7位只有3位是有效的。。
2017-8-11 08:31
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Lnairan 我数学和算法很菜,让大神见笑了[em_40],其他位都好说用正确的ASCII码乘以相应的数得到结果,在到相应的内存中找对应的索引值,用程序跑一下得到一个结果,第3位的计算我是一点一点试的[em_16]
大佬你和我的方法一样
不过在这个几个乘法过去  又回到只有位移没有乘法了
不过当时跑出来的框架都写好了
于是我后面5个整数都是跑出来的
2017-8-11 09:53
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我要公布算法吗?
2017-8-11 12:35
0
雪    币: 20
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
北海若 我要公布算法吗?
公布下吧......新人没看出逻辑.....
2017-8-16 21:11
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
// CrackMe004_cpp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <map>
#include <Windows.h>
#include <tchar.h>
using namespace std;
map<int,string> has = map<int,string>();
inline int calc() //inline也可以让编译器制造混乱……
{
    int a;
    int inb;
    a = 3;
    scanf("%d", &inb);
    
    if (has[inb] != "") throw inb;
    //用了map;由于inline的存在,你们就看不懂判重的方法了……map内部是平衡树
    //我想大多数这里玩CM的人都是看不懂的——特别是反编译出来的鬼代码
    has[inb] = "Failure"; //混淆视听的常量
    register int r = 1;
    register int base = a;
    register int b = inb;
    while (b != 0){
        if (b % 2) { r *= base; r %= 17; }
        base *= base;
        base %= 17;
        a++;
        b /= 2;
        inb--; //a++和inb--是没有用的,因为已经用base和b中间存放了。只是混淆一下视听。
    }
    //计算快速幂,计算3^inb模17的余数
    return r;
}
int a[2] = {int('S')*2, int('a')*2};
int b[2] = {int('u')*4, int('B')*4};
int c[2] = {int('q')*3, int('c')*3};
int d[2] = {int('d')*7, int('c')*7};
int e[2] = {int('e')*32, int('M')*32};
int f[2] = {int('s')*64, int('f')*64};
int g[2] = {int('g')*128, int('s')*128};
int h[17] = {9,2,3,1,5,6,4,8,7,0}; //这里应该写h[10],写了17,所以有四位就达不到效果了(数组后面默认赋值0了)
//设计的应该结果是0011001才能成功。现在所有0的位上随便输应该成功几率不小……
char buffer[10] = "";
void tryFunc()
{
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(a[h[(int)buffer[9]]]/2));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(b[h[(int)buffer[9]]]/4));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(c[h[(int)buffer[9]]]/3));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(d[h[(int)buffer[9]]]/7));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(e[h[(int)buffer[9]]]/32));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(f[h[(int)buffer[9]]]/64));
	buffer[9] = (char)calc();
    sprintf(buffer, "%s%c", buffer, (char)(g[h[(int)buffer[9]]]/128));
	string str = buffer;
	if (str == "Success")
		cout<<str;
	else throw buffer[9];
}
int _tmain(int argc, _TCHAR* argv[])
{
    __try
    {
        tryFunc(); //用这样的方式调用,编译器编译__try__except的时候会制造混乱
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        cout<<"Failure";
    }
    cin.get();cin.get(); //保留输出
    return 0;
}


2017-8-24 16:04
0
游客
登录 | 注册 方可回帖
返回
//