-
-
[原创]看雪 2022·KCTF 秋季赛 > 第六题 病疫先兆
-
发表于: 2022-11-28 22:18 7935
-
1、直接F5,结合调试知道输入的格式为{前5位校验码+4位用户名+后5位校验码),总共是14位字符。

2、rand()是关键,跟进去看下rand的实现。
前面跟下srand函数,函数2020C1返回值+0X14的初始值是由srand传入的,就是输入的前5位校验码字符串转换后的数字。

3、把约束条件扣出来,解出前5位和后5位校验码的代码如下。
#include <iostream>
unsigned int hehe(unsigned int seed)
{
return (seed * 0x343FD + 0x269ec3);
}
int main()
{
unsigned long a[20] = { 0x3BFC, 0x2173, 0x25BB, 0x380B, 0x2C13, 0x75BE, 0x7366, 0x46A3,
0x13C1, 0x159B, 0x5B5F, 0x534F, 0x4E37, 0x3A04, 0x1301, 0x5D0C,
0x4155, 0x48E9, 0x61D2, 0x6158 };
1 | unsigned long b[20] = { 0x2BB6,0x6B5A,0x3D4,0x152B,0x6E04,0x254C,0x40AE,0x56CA, |
0x17E1,0x55C7,0x3641,0x2D3C,0x0A41,0x4BC5,0x6233,0x1FE7,
0x6E05,0x0F6E,0x6398,0x6AD7 };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | unsigned int seed, i;for (seed = 10000; seed < 0xffffffff; seed++){ unsigned key = seed; for (i = 0; i < 20; i++) { key = hehe(key); if (((key >> 16)&0x7fff) == b[i]) { continue; } else { break; } } if (i == 20) { std::cout << seed; break; }}std::cout << "Hello World!\n"; |
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!
赞赏
他的文章
- [原创]逆向狄X楼宇对讲机的485控制协议 13736
- [原创]看雪 2022·KCTF 秋季赛 > 第六题 病疫先兆 7936
- [原创][原创]看雪2016第一题CK分析 2686
- [原创]一马调试分析之下篇(马说) 10875
赞赏
雪币:
留言: