Quantcast
Channel: 睿论坛 - 最新帖子
Viewing all articles
Browse latest Browse all 37470

一道ctf中的逆向题

$
0
0

好吧,看来没人做,我在这里分享下解题思路,供感兴趣的人参考一下:
(以下解题思路来自 time-keeper ),题目要求提交两种Serial值
图不太清晰(其实直接没法看:worried:),但主要是思路 ,所以将就吧。

---------------分割线-------------------
主要的函数位置在 [ViewController checkClicked:]
检查函数将用户名为"ctfuser"进行复杂的变换

[图1]

由于是固定变换,调试搞出 'transformed_username="\x00\x00\x00\x00\x00\xA8\x97\x40'

[图2]

后面的运算是将十六进制的序列号2字节分组相加或相减,按位翻转后,分别与对应上述变换结果异或,根据结果进行不同方式求和

[图3]
注意到求和过程主要有两个分支, +102030+x(0<x<0xF)
而两个目标hash值

816240 = 102030*8
714217 = 102030*7 + 7

此时可知该题应有多解,现在构造一组可行解:

对于求得第一种 hash 的情况,只要让序列号分组后每组数字加减结果的位反转 与 对应变 换后的用户名高 4 位一致,即可得到异或结果<=0xF

前 5 组直接使用 ”00”,因为 0+0=0-0=0,后面对于 0xA8、0x97、0x40,位翻转后得 0x15、0xE9、 0x02,
所以这三组所对应序列号 hex 加减后结果的低 4 位应分别为 5、9、2,那么直接就用 509020 吧,序列号为 0000000000509020

对于第二种 hash 结果,需要使上述异或过程的其中一个得到 0xX7(其中 X>0),此处选择 0x97 下手,使用任意 X0(X!=9)都能达到效果,那么选择 00,序列号为 0000000000500020。 在软件中验证通过,一个正常 pass,一个粗体 pass


Viewing all articles
Browse latest Browse all 37470

Trending Articles