首页
社区
课程
招聘
看雪CTF2019Q1-第7题
2019-3-18 23:50 3650

看雪CTF2019Q1-第7题

2019-3-18 23:50
3650
初始化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



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 6051
活跃值: (1441)
能力值: ( LV15,RANK:1473 )
在线值:
发帖
回帖
粉丝
lelfei 23 2019-3-25 17:06
2
0
又一个找到程序后门的,很强大!
游客
登录 | 注册 方可回帖
返回