-
-
[原创] 第十题 生命的馈赠 WP
-
发表于: 2021-12-12 12:04 18398
-
这题一看文件还不小,但是ida打开基本没看到有用的东西。好在字符串都是明文,基本很容易就断住读取输入和输入判断的地方。但是很奇怪的是text段全程没用到,很让人怀疑里面藏了什么东西。
算法部分加了混淆,提取的过程没啥技术含量。根据运行速度看没有太复杂的运算量,所以只要F7一路跟下来,跟上几遍就梳理出来了。转成python代码如下:
这是一个二次剩余的问题,sagemath基本是立等可解,而且基本每一步都是两个解。相应的代码如下
但是因为最终结果是用户名的md5值,而不是前面算法生成的,所以实际上反推到第6步就进行不下去了。在这里纠结了好几天,最后才发现这两个常量是根据KCTF的md5值经过精心构造的,原运算还可能存在溢出的问题,手动把每一步可能溢出的情况考虑到,排除掉不会发生溢出的解,就是答案了。
def
Fun(a):
b
=
a
*
a
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
b
*
0x6805A57D5B006445AC1B0675EB188435
+
0x4362F6846292652664A4CBBDC44FD283
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
b
*
b
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
return
b
def
Fun(a):
b
=
a
*
a
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
b
*
0x6805A57D5B006445AC1B0675EB188435
+
0x4362F6846292652664A4CBBDC44FD283
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
b
*
b
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
b
=
(b >>
128
)
*
0x1A994BC5D
+
(b & ((
1
<<
128
)
-
1
))
return
b
def
sol(b):
p
=
2
^
128
-
0x1A994BC5D
R
=
Integers(p)
if
not
R(b).is_square():
return
0
tmp
=
mod(b,p).sqrt()
tmp
=
int
(tmp)
tmp_p
=
p
-
tmp
tmp
=
(tmp
-
0x4362F6846292652664A4CBBDC44FD283
)
%
p
tmp
=
(tmp
*
203054504892225387319251330678447746504
)
%
p
tmp_p
=
(tmp_p
-
0x4362F6846292652664A4CBBDC44FD283
)
%
p
tmp_p
=
(tmp_p
*
203054504892225387319251330678447746504
)
%
p
if
R(tmp).is_square():
return
int
(mod(tmp,p).sqrt())
if
R(tmp_p).is_square():
return
int
(mod(tmp_p,p).sqrt())
return
0
def
sol(b):
p
=
2
^
128
-
0x1A994BC5D
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
- [原创]第十二题 深入内核 4064
- [原创]第十一题 步步逼近 4526
- [原创]第八题 AI核心地带 3454
- [原创] 第七题 智能联盟计划 3623
- 第六题 至暗时刻 10388
看原图
赞赏
雪币:
留言: