首页
社区
课程
招聘
[原创]『深圳腾讯2010安全技术竞赛』 [第二阶段 第一题] VM指令转换
发表于: 2010-11-1 12:10 13449

[原创]『深圳腾讯2010安全技术竞赛』 [第二阶段 第一题] VM指令转换

2010-11-1 12:10
13449
收藏
免费 7
支持
分享
最新回复 (40)
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
26
要表达出这个“言外之意”,需要题目中多提供几个正确的输入文件,或者给出输入文件的构造规则。
2010-11-1 13:28
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
27
忘了说明一下,内存映射文件默认是按0x1000字节对齐分配内存的,限制范围为0xFF字节计算,始终不会超过范围,而如果按楼主所说限制计算范围为0xFFFF。当.dat文件头中记录的字串长度达到了0xFFFF,而实际文件又没有这么大时,自然又会引起Crash。
我说的问题,楼主不相信的话,可以手动修改.dat文件测试一下。
2010-11-1 13:32
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
28
[QUOTE=ccfer;882008]局部变量里有个文件大小的值[ebp-20h],可以用来参考计算[/QUOTE]

这个应该算比较好的方案。
比较一下[文件大小(可以取到)-0x10]和文件头给出的数据长度,不一致就不处理。

完美的方案总是会复杂一点儿。
2010-11-1 13:35
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
两次关闭同一打开文件句柄 才是Crash的原因
2010-11-1 13:36
0
雪    币: 7318
活跃值: (3793)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
30
crash处理的最完美方案应该是改EH4结构

可惜,这个VM切栈了,导致SEH处理不了VM内部异常,因此出现了多种答案。
2010-11-1 13:36
0
雪    币: 101
活跃值: (88)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
31
就题目中给出的Crash.dat而言,取0xff和0xffff,效果是一样的。
2010-11-1 13:37
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
32
啊,如果你所说属实,看来这题第二点有两个地方会引起Crash。

我前面回答的,是说程序只判断了字符串长度是否为0,并未做进一步的判断,这才导致的crash.dat文件异常。
2010-11-1 13:42
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
33
不会吧,我自己刚试了下,按楼主所说去修改EXE。
然后修改Crash.dat文件,文件仍保持0x20字节,但偏移第八字节的字符串长度改为0xFFFF,运行后马上报错了。
2010-11-1 13:47
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
int __cdecl sub_401000(LPCSTR lpFileName)
{
  int ebp0; // ebp@0
  int result; // eax@7
  LPVOID v11; // [sp+18h] [bp-30h]@5
  HANDLE v12; // [sp+20h] [bp-28h]@2
  HANDLE v13; // [sp+24h] [bp-24h]@4
  DWORD v14; // [sp+28h] [bp-20h]@3

  if ( !sub_40201B(lpFileName, 0) )
  {
    v12 = CreateFileA(lpFileName, 0x80000000u, 1u, 0, 3u, 0x80u, 0);
    if ( v12 != (HANDLE)-1 )
    {
      v14 = GetFileSize(v12, 0);
      if ( v14 > 0x10 )//文件如果大于10
      {
        v13 = CreateFileMappingA(v12, 0, 2u, 0, 0, 0);
        if ( v13 )
        {
          v11 = MapViewOfFile(v13, 4u, 0, 0, v14);
          if ( v11 && *(_DWORD *)v11 == 'TSET' )//文件头是不是TEST
          {
            sub_401F10();
            __asm { pushf }
            *((_DWORD *)&unk_40DD28 + 23) = 0x401160u;
            *((_DWORD *)&unk_40DD28 + 47) = 0x401160u;
            __asm { popf }
            return result;//正常文件直接返回
          }
          sub_4011C9(ebp0);//关闭一次文件句柄 ebp0=?
        }
      }
      sub_4011E2(ebp0);//关闭两次两次文件句柄ebp0=?
    }
  }
  return 0;
}
2010-11-1 13:56
0
雪    币: 7318
活跃值: (3793)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
35
两次CloseHandle出现的异常,是因为你的调试器被anti了

If the application is running under a debugger, the function will throw an exception if it receives either a handle value that is not valid or a pseudo-handle value.
This can happen if you close a handle twice, or if you call CloseHandle on a handle returned by the FindFirstFile function.
2010-11-1 14:10
0
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
36
两次关闭的是不同的句柄,没什么问题
一个是CreateFileA的,另一个是CreateFileMappingA的
2010-11-1 14:14
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
37
嗯,我刚也看了MSDN,是说在调试器下出现。但这算不算问题,可能要评委决定了,我个人严重怀疑这是出题人编码失误引起的,呵。
2010-11-1 14:15
0
雪    币: 206
活跃值: (186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
38
刚看了下,的确是不同的句柄,我们都被“杜djz”忽悠了,还是楼上细心。
2010-11-1 14:27
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
hoho.原来如此啊
2010-11-1 14:37
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
40
我也是改的SUB ESI , 1经不起折腾,就这么提交了。就给出的3个文件都是成功的。
2010-11-1 19:49
0
雪    币: 678
活跃值: (101)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
41
高手之间的交流,没有经验看不明白。
2010-11-1 23:08
0
游客
登录 | 注册 方可回帖
返回
//