首页
社区
课程
招聘
[看雪CTF2016]第二十三题分析
发表于: 2016-12-16 15:54 2253

[看雪CTF2016]第二十三题分析

2016-12-16 15:54
2253
根据输入的sn生成字符点阵, 与字库中的点阵相比较, 保存索引, 对索引进行处理验证

根据sn(长度为18)生成字符点阵8*14, 用奇偶数表示
.text:004011C5                 push    eax             ; flags
.text:004011C6                 mov     eax, [ebp+var_90]
.text:004011CC                 add     eax, esi
.text:004011CE                 or      eax, 80000000h
.text:004011D3                 push    eax             ; lprect
.text:004011D4                 push    [ebp+hdc]       ; hdc
.text:004011DA                 call    ds:GetBoundsRect ; hooked => GetPixel


根据字符点阵获取索引值,保存到索引数组
.text:004010A0

字库, 62个8*14的点阵
.data:004121C0


打印字库, 结果为: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
void test2()
{
	unsigned char buf[] =
	{
		//4121C0
	};

	for (DWORD k1 = 0; k1 < 62; k1++)
	{
		for (DWORD k2 = 0; k2 < 14; k2++)
		{
			for (DWORD k3 = 0; k3 < 8; k3++)
			{
				BYTE v = *(buf + k1 * 14 * 8 + k2 * 8 + k3);
				printf("%c", (v & 1) ? ' ' : '*');
			}
			printf("\n");
		}
		printf("\n");
	}
}


索引数组必须为1D11121C2C1C360E1B120A15311E160B0E1B
int __thiscall sub_4017B0(_BYTE *p)
{
  unsigned int v1; // ebx@1
  unsigned int v2; // ebx@1
  int v3; // ebx@1

  v1 = g_buf[(unsigned __int8)~LOBYTE(g_buf[(unsigned __int8)~*p]) ^ (unsigned __int8)p[1]] ^ ((g_buf[(unsigned __int8)~*p] ^ 0xFFFu) >> 8);
  v2 = g_buf[(unsigned __int8)v1 ^ (unsigned __int8)p[2]] ^ (v1 >> 8);
  v3 = g_buf[(unsigned __int8)v2 ^ (unsigned __int8)p[3]] ^ (v2 >> 8);
  if ( *((_DWORD *)p + 1) == 0xE361C2C
    && *((_DWORD *)p + 2) == 0x150A121B
    && *((_DWORD *)p + 3) == 0xB161E31
    && *((_DWORD *)p + 4) == 0x1B0E )
  {
    v3 = ~v3;
  }
  return v3;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//