一道ctf中的逆向题

膜大神……

细节当然不一样,但思路和题目类型几乎是完全一样的

好吧,看来没人做,我在这里分享下解题思路,供感兴趣的人参考一下:
(以下解题思路来自 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

2 个赞

思路清晰.

论坛里面都是逆向大牛。。。你有啥问题直接发帖问啊。。

请教ida使用的版本以及选择哪个debuger…看图似乎能够远程调试

wine ida
ida支持的debugerserver貌似是gdb…

thx…