吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4494|回复: 29
收起左侧

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

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

本帖最后由 Dyingchen 于 2019-8-25 00:19 编辑

全国高校网安联赛(National University Cybersecurity Association,简称X-NUCA)是面向全国高校学生的网络安全技能竞赛。

楼主抱着参加玩玩的心情去参加了一下这个比赛,原以为应该能做出最简单的一两道题,没想到直到比赛结束一道也没做出来,话不多说,其中一道比赛题目叫Clever bird


打开程序我们就可以看到一个小游戏


按照常理来说这游戏肯定是过不了关的,所以直接丢入od
既然没壳就直接只能搜索,很快能找到009C1DD6   Your Door, pls key的提示,显然这个位置前面的跳转需要nop掉不然游戏你得一直玩下去过不了关,


然后角色死亡之后游戏会要求你输入一个key



然后就到了逆算法的环节了


大概就是一连串异或运算,逆出算法之后得到我们得到一个key{B1RD},
然后我们把这个key输入到程序里面,得到如下结果


于是到此我认为是结束了,然后把flag放到网站提交却是错误,然后管理给我的答复是这道题我并没有做完,因为刚好要赶火车的原因我就没有继续做下去了,
但是我很迷惑的是程序已经完了啊,一个提示都没有之后该怎么做?希望各位大佬能解一下这个题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

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

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

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

免费评分

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

查看全部评分

梦游枪手 发表于 2019-8-25 14:37
本帖最后由 梦游枪手 于 2019-8-25 15:39 编辑

跟楼上大佬说的一样,带上door的目标分数就行了

目标分数计算过后得到结果为0x436AE,要暴力还原应该也是可以的,不过这个过程涉及到浮点转换,还是推荐改汇编拿到计算前的score,这样更简单点。

丢个暴力破解的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是异常处理分支返回,这个值是程序读取自身计算出来的,算是一个自校验,你应该是修改了程序吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x
 楼主| Dyingchen 发表于 2019-8-24 23:42
Hmily 发表于 2019-8-25 00:08
附件不小心被我编辑删除了,重新传一下吧。
梦游枪手 发表于 2019-8-25 01:01
flag是"B1RD1"吧,程序有判断第五位是不是"1"的,我输入BIRD过不了
 楼主| Dyingchen 发表于 2019-8-25 07:54
梦游枪手 发表于 2019-8-25 01:01
flag是"B1RD1"吧,程序有判断第五位是不是"1"的,我输入BIRD过不了

可是奇怪的是程序在我输入B1RD之后也显示成功了,输入B1RD1也是成功
syncking 发表于 2019-8-25 08:07
Dyingchen 发表于 2019-8-25 07:54
可是奇怪的是程序在我输入B1RD之后也显示成功了,输入B1RD1也是成功

我看不懂你们的D是怎么算出来的  我算出来的是一个2次方的符号

[Python] 纯文本查看 复制代码
d = [0x16, 0xe4, 0xb3, 0xbd]  #  ebp+esi*4-0x48
ebx = [0x4, 0xe5, 0x91,0x3f]  # ebx  3f91e504

for i in range(4):
    raw = (d[i] ^ ebx[i])+0x30
    print(chr(raw), raw)

""" 输出
B 66
1 49
R 82
2 178     <= 这个2次方符号  输入控制台也是当作数字2处理

无论怎么输入 根本就执行不到   congratulation,submit with format: flag{key}
除非  改那个jnz跳转 改成jz   输入什么都是对的

"""
 楼主| Dyingchen 发表于 2019-8-25 08:14
syncking 发表于 2019-8-25 08:07
我看不懂你们的D是怎么算出来的  我算出来的是一个2次方的符号

[mw_shl_code=python,true]d = [0x16,  ...

可是输入B1R2程序直接输出wrong了
syncking 发表于 2019-8-25 08:21
Dyingchen 发表于 2019-8-25 08:14
可是输入B1R2程序直接输出wrong了

但是输入  B1RD   和 B1RD1也是错误的

syncking 发表于 2019-8-25 08:26
本帖最后由 syncking 于 2019-8-25 08:35 编辑

[Asm] 纯文本查看 复制代码
00161E80   > /0FBE5435 C8   movsx edx,byte ptr ss:[ebp+esi-0x38]     ;  edx 代表是输入的数据
00161E85   . |8BC3          mov eax,ebx                              ;  ebx 3F91E504
00161E87   . |D3F8          sar eax,cl
00161E89   . |83EA 30       sub edx,0x30
00161E8C   . |0FB6C0        movzx eax,al
00161E8F   . |33D0          xor edx,eax
00161E91   . |3954B5 B8     cmp dword ptr ss:[ebp+esi*4-0x48],edx    ;  要对比的数据分别是  0x16 0xE4 0xB3 0xBD
00161E95     |75 30         jnz short Clever_B.00161EC7              ;  不相等就跳转到 error
00161E97     |83C1 08       add ecx,0x8
00161E9A     |46            inc esi
00161E9B     |83F9 20       cmp ecx,0x20                             ;  这里限制了  只比较了 4位
00161E9E   .^\7C E0         jl short Clever_B.00161E80
00161EA0   .  8B0D 98401600 mov ecx,dword ptr ds:[<&MSVCP140.?cout@s>;  msvcp140.?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
00161EA6   .  BA 30431600   mov edx,Clever_B.00164330                ;  congratulation,submit with format: flag{key}
00161EAB   .  68 20261600   push Clever_B.00162620
00161EB0   .  E8 2B050000   call Clever_B.001623E0




刚刚我写的那个python脚本 算出来的第四个数据也只有  2次方符号 符合答案   
程序输入B1R2是错的,控制台输入B1R2次方 ,这个2次方符号从这个程序汇编上看是按ASCII(32)对待的。所以怎么输入也不会对

我觉得就是出题的人就是不想让你通过输入得到数据  所以用了一个2次方符号的数据


其他的我就不知道   一个菜鸟的分析
 楼主| Dyingchen 发表于 2019-8-25 08:37
syncking 发表于 2019-8-25 08:26
[mw_shl_code=asm,true]00161E80   > /0FBE5435 C8   movsx edx,byte ptr ss:[ebp+esi-0x38]     ;  edx 代 ...


x-30^4=16 B 10进制 66 16进制 42  即42-30^4=16

x-30^E5=E4 1

x-30^91=B3 R

x-30^A9=BD D
没有问题啊,我发现好像每个人的机器上面运行都有差异,难不成是我一开始的思路就错了?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 14:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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