这道题没用复杂算法,主要用到几个小坑 O(∩_∩)O
序列号=hellocatx202112050a3b1c4d29,它是27位,必须平均分成3段,每段9位,但是会误导每段是8位
第一段:hellocat x
第二段:20211205 0
第三段:a3b1c4d2 9
strncmp(第一段,
"hellocat"
,
8
)
第
9
位不提
strncmp(第一段,
"hellocat"
,
8
)
第
9
位不提
reverse(
"20211205"
)
=
"50211202"
atoi(
"50211202"
)
*
3
=
150633606
; 但代码里藏着一个无声的反调试,会将
3
变成
2
第
9
位也不提
reverse(
"20211205"
)
=
"50211202"
atoi(
"50211202"
)
*
3
=
150633606
; 但代码里藏着一个无声的反调试,会将
3
变成
2
第
9
位也不提
四皇后问题,每个直线、竖线、斜线上只能有一个皇后!
a3 b1 c4 d2,就是
4
个皇后的坐标,转换成二维数组坐标
国际象棋坐标系:
4
1
3
1
2
1
1
1
a b c d
二维数组坐标:
0
1
2
3
0
1
1
1
2
1
3
1
先介绍
2
个全局变量:
char g_serial3[
8
]
=
{
0
};
/
/
第三段serial会拷贝进去
int
g_serial3_verify
=
0
;
/
/
第三段serial最终校验数
有意思的校验方式来了!
g_serial3_verify 最终等于
0x10000039
才能校验通过
但是一开始 g_serial3_verify |
=
0x10000000
=
0x10000000
如果
4
个坐标都正确,g_serial3_verify
=
0x10000000
如果
4
个坐标都错,g_serial3_verify
=
0x39
如果
4
个坐标,错
1
-
3
个,g_serial3_verify
=
0x100000
*
*
但是只有当
4
个落子位置都错的时候,才能执行下列
4
条语句,凑出
0x39
。但是这样开头的
0x10
就被清空,最终校验失败
g_serial3_verify
=
0b00000001
;
/
/
清空
0x10
,因为这里用的是
=
,不是 ^
=
g_serial3_verify ^
=
0b00001000
;
g_serial3_verify ^
=
0b00010000
;
g_serial3_verify ^
=
0b00100000
;
所以陷入矛盾。。。
再来看 g_serial3 和 g_serial3_verify 的内存布局是挨着的:
00
00
00
00
00
00
00
00
-
00
00
00
00
模拟下 产生
0x10000039
时,内存布局应该是:
00
00
00
00
00
00
00
00
-
39
00
00
10
所以校验通过的唯一解法就是,让第三段serial是
9
位,第
9
位是
'9'
,将 g_serial3_verify 低地址
1
字节覆盖成
0x39
四皇后问题,每个直线、竖线、斜线上只能有一个皇后!
a3 b1 c4 d2,就是
4
个皇后的坐标,转换成二维数组坐标
国际象棋坐标系:
4
1
3
1
2
1
1
1
a b c d
二维数组坐标:
0
1
2
3
0
1
1
1
2
1
3
1
先介绍
2
个全局变量:
char g_serial3[
8
]
=
{
0
};
/
/
第三段serial会拷贝进去
int
g_serial3_verify
=
0
;
/
/
第三段serial最终校验数
有意思的校验方式来了!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-9-4 13:05
被kanxue编辑
,原因: