吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
楼主: Dyingchen

[ReverseMe] X-NUCA-2019 Reverseme-Clever bird

[复制链接]
syncking 发表于 2019-8-25 08:41
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

Dyingchen 发表于 2019-8-25 08:37
x-30^4=16 B 10进制 66 16进制 42  即42-30^4=16

x-30^E5=E4 1

那就差在那 A9 上 了    我的程序运行时候是与3F  异或了

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

syncking 发表于 2019-8-25 08:42
现在还没有人写wp吗
 楼主| Dyingchen 发表于 2019-8-25 08:44
syncking 发表于 2019-8-25 08:41
那就差在那 A9 上 了    我的程序运行时候是与3F  异或了

有点意思,估计是我们分析还不到位,我去再单步走一下
灰灰。 发表于 2019-8-25 11:35
巧了,我也参加了这比赛
这题答案是flag{B1RD010000000000000001}
 楼主| Dyingchen 发表于 2019-8-25 11:36
灰灰。 发表于 2019-8-25 11:35
巧了,我也参加了这比赛
这题答案是flag{B1RD010000000000000001}

具体算法是什么?
灰灰。 发表于 2019-8-25 11:40
Dyingchen 发表于 2019-8-25 11:36
具体算法是什么?

首先要找出进入输入door key的正确分数,我是改他汇编代码爆破出来的,分数是0x20002;
然后前四个字节也如同你们所说的一样算出来是B1RD,第四个字符我一开始也是算不出正确值,但在正确分数下是可以算出第四个是D;
然后将分数0x20002转二进制字符串并且反转,然后两者拼接在一起就好了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Dyingchen + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| Dyingchen 发表于 2019-8-25 11:42
灰灰。 发表于 2019-8-25 11:40
首先要找出进入输入door key的正确分数,我是改他汇编代码爆破出来的,分数是0x20002;
然后前四个字节 ...

可是直接输入B1RD程序之后也没有给任何提示了啊,怎么想到还要拼接分数这个字符串的啊?
灰灰。 发表于 2019-8-25 11:44
Dyingchen 发表于 2019-8-25 11:42
可是直接输入B1RD程序之后也没有给任何提示了啊,怎么想到还要拼接分数这个字符串的啊?

明明在计算B1RD之前就有段代码在计算二进制啊,并且将分数的二进制与输入的字符串比较,没看见吗。。
梦游枪手 发表于 2019-8-25 14:37
本帖最后由 梦游枪手 于 2019-8-25 15:39 编辑

跟楼上大佬说的一样,带上door的目标分数就行了
QQ截图20190825133618.png
目标分数计算过后得到结果为0x436AE,要暴力还原应该也是可以的,不过这个过程涉及到浮点转换,还是推荐改汇编拿到计算前的score,这样更简单点。
QQ截图20190825151454.png
丢个暴力破解的py脚本吧。
[Python] 纯文本查看 复制代码
import ctypes
def h2f(s):
    cp = ctypes.pointer(ctypes.c_int(s))
    fp = ctypes.cast(cp, ctypes.POINTER(ctypes.c_float))
    return fp.contents.value
def f2h(s):
    fp = ctypes.pointer(ctypes.c_float(s))
    cp = ctypes.cast(fp, ctypes.POINTER(ctypes.c_int))
    return cp.contents.value
if __name__=='__main__':
    X=0
    score=0
    while(int(((1.5-h2f(X)*h2f(X)*(score/2))*h2f(X)*100000000*10+5)/10)!=0x436AE):
        score+=1
        X=0x5F3759D8 - (f2h(score)>>1)
        if X!=0:
            X+=7
    print score

至于楼上说的解密出来的结果为B1R2的,我的解密key是0xA991E504,脚本如下
[Python] 纯文本查看 复制代码
if __name__=='__main__':
    key=0xA991E504
    b=[0x16,0xe4,0xb3,0xbd]
    out=''
    for i in range(len(b)):
        out+=chr((b[i]^((key>>(i*8))%0x100))+0x30)
    print out

0xA991E504是异常处理分支返回,这个值是程序读取自身计算出来的,算是一个自校验,你应该是修改了程序吧。
QQ截图20190825153729.png
 楼主| Dyingchen 发表于 2019-8-25 17:15
梦游枪手 发表于 2019-8-25 14:37
跟楼上大佬说的一样,带上door的目标分数就行了

目标分数计算过后得到结果为0x436AE,要暴力还原应该也 ...

果然还是我不够细心啊,本来看到了上面一段比对的,但是自以为是判断角色是不是死亡的循环了所以没有细想
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复非技术或与主题无关水贴,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-9-24 00:06

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表