-
-
看雪CTF2019Q1-第7题
-
2019-3-18 23:50
3697
-
初始化g_bn, 这个用来保存数独
.text:004B8DCC mov ecx, offset g_bn
.text:004B8DD1 call BigNum__BigNum_0
// size: 1410
struct BigNum {
void *vtbl;
DWORD digit_len;
// 8
BYTE digit[0x400];
// 408
DWORD digit_index[0x400];
// 1408
DWORD seed1;
DWORD seed2;
};
digit_index保存了digit的实际索引
构造函数中使用当前clock为随机数种子, 初始化digit_index
校验代码, 设置硬件断点, 校验结果保存到buf_bn1
.text:004B8E55 call x_update_buf_bn1
...
.text:004B8E7A call x_set_hardware_bp
更新后的buf_bn1
.data:004BC080 buf_bn1 db 0BDh, 0A3h, 9Ch, 10h, 46h, 0F3h, 2Ch, 0
.data:004BC088 buf_bn2 db 1Eh, 0D6h, 83h, 0F4h, 9Fh, 0A3h, 62h, 0A3h, 0Dh, 34h, 73h, 0AEh, 0CDh, 0EEh, 0
sn字符集: 123456789ABCDEF
输入作为16进制转换成10进制
.text:004B8EBF
...
.text:004B8FBC
bn1 *= bn2; 结果转换成16进制
bn1: C23F6401C93ADB = 54675844241111771
bn2: EEDCEA3743D03A263AF94F386DE1 = 4844716167725693655941655263997409
bn1 *= bn2; B53E8F2B7B1A5B4D53C1BC6B32C8B6A5D9B4D3F97B
.text:004B8FBC
...
.text:004B9028
bn1
0028D680 30 5F 4C 00 2A 00 00 00 0B 07 09 0F 03 0D 04 0B
0028D690 09 0D 05 0A 06 0B 08 0C 02 03 0B 06 0C 0B 01 0C
0028D6A0 03 05 0D 04 0B 05 0A 01 0B 07 0B 02 0F 08 0E 03
0028D6B0 05 0B
通过bn1构造数独
其中digit为16进制时表示需要从sn中补 digit-9 位(
如0xB, 需要从sn补2位 ),
如果两个16进制相邻(0C 0B), 则中间1个值为几个check函数的返回值的和(这里应该是7, 对应下面数独中的O)
.text:004B9382 mov eax, [ebp+digit]
.text:004B9388 mov eax, vtbl_check[eax]
.text:004B938E mov [ebp+var_2BA8], 4
.text:004B9398 call eax
.text:004B939A cmp eax, 1
.text:004B939D adc dword ptr [ebp-2BB8h], 0 ; +1 when ret == 0
几个check函数正常情况的返回值
x_dbg_present: 0
x_check_debug_port: 0
x_check_debug_handle: 0
x_check_ods: 1 for xp, 0 for win7
x_check_delete_fiber: 0
x_check_hardware_bp: 1
x_check_debug_flags: 1
x_check_csrss: 0
x_check_veh: 0
最终得到如下的数独
* * 7 9 * * * * *
* 3 * * * * 4 * *
9 * * * * 5 * 6 *
* 8 * * * 2 3 * *
6 * * * O * * 1 *
* * 3 5 * * * * 4
* * 5 * 1 * * 7 *
* 2 * * * * * * 8
* * * * * 3 5 * *
解得
4 6 7 9 3 8 1 2 5
5 3 2 1 6 7 4 8 9
9 1 8 2 4 5 7 6 3
1 8 4 6 9 2 3 5 7
6 5 9 3 7 4 8 1 2
2 7 3 5 8 1 6 9 4
3 4 5 8 1 9 2 7 6
7 2 1 4 5 6 9 3 8
8 9 6 7 2 3 5 4 1
得到: 4638125521678918247314695759348227816934892671456938967241
逆序转16进制再逆序得到sn: CBC25EF8D9F482BC1F3DA3CA1F154EC89FC3F1414EDD93A3
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界