首页
社区
课程
招聘
[原创]奇虎360第4题的解法
2008-12-19 10:07 55158

[原创]奇虎360第4题的解法

ccfer 活跃值
16
2008-12-19 10:07
55158
编译环境vc6,直接release编译可以得到sys文件
再修改子系统1个字节可以做为题目需求的exe和dll

我只用了一行内联asm,不知道还有没有完全不用内联asm的方法

#include <windows.h>

#pragma comment (linker, "/subsystem:native")
//#pragma comment (linker, "/subsystem:windows")
#pragma comment (linker, "/entry:real_main")
#pragma comment (linker, "/FIXED:NO")
#pragma comment (linker, "/ALIGN:0x1000")
#pragma comment(linker, "/BASE:0x400000")

typedef DWORD (_cdecl *DBGPRINT)(char *Format,...);
typedef DWORD (WINAPI *OUTPUTDEBUGSTRING)(char *lpOut);

DWORD GetModBase(DWORD x)
{
  DWORD p = x;
  DWORD dwTmp;

  while (p)
  {
    if (*(WORD *)p == 0x5A4D)
    {
      dwTmp = *(DWORD *)(p+0x3C) + p;
      if (*(DWORD *)dwTmp == 0x4550)
      {
        return p;
      }
    }
    p -= 0x10000;
  }

  return 0;
}

PVOID WINAPI GetExportByName(PVOID BaseAddress,char *FuncName)
{
  PIMAGE_NT_HEADERS pNt;
  PIMAGE_EXPORT_DIRECTORY  ExportDir;
  DWORD ExportDirSize;
  PDWORD *ExFunctions;
  PDWORD *ExNames;
  USHORT *ExOrdinals;
  PVOID ExName;
  DWORD Ordinal;
  PVOID Function = NULL;
  int minn,maxn;

  pNt = (PIMAGE_NT_HEADERS)(*(DWORD *)((DWORD)BaseAddress + 0x3C) + (DWORD)BaseAddress);
  if (pNt->OptionalHeader.Magic != 0x10B)
  {
    return NULL;
  }
  ExportDir = (PIMAGE_EXPORT_DIRECTORY)(pNt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress + (DWORD)BaseAddress);
  ExportDirSize = pNt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
  if (ExportDir == NULL)
  {
    return NULL;
  }
  if (ExportDir->AddressOfNames == 0)
  {
    return NULL;
  }
  
  ExNames = (PDWORD *)((DWORD)BaseAddress + ExportDir->AddressOfNames);
  ExOrdinals = (USHORT *)((DWORD)BaseAddress + ExportDir->AddressOfNameOrdinals);
  ExFunctions = (PDWORD *)((DWORD)BaseAddress + ExportDir->AddressOfFunctions);

  minn = 0;
  maxn = ExportDir->NumberOfNames - 1;
  while (minn <= maxn)
  {
        int mid;
        int res;
    
        mid = (minn + maxn) / 2;
    
        ExName = (PVOID)((DWORD)BaseAddress + (DWORD)ExNames[mid]);
        res = strcmp((PCHAR)ExName, (PCHAR)FuncName);
        if (res == 0)
    {
      Ordinal = ExOrdinals[mid];
      Function = (PVOID)((DWORD)BaseAddress + (DWORD)ExFunctions[Ordinal]);
      if (((DWORD)Function >= (DWORD)ExportDir) &&
        ((DWORD)Function < (DWORD)ExportDir + (DWORD)ExportDirSize))
      {
        return NULL;
      }
      if (Function != NULL)
      {
        return Function;
      }
    }
        else if (minn == maxn)
    {
      break;
    }
        else if (res > 0)
    {
      maxn = mid - 1;
    }
        else
    {
      minn = mid + 1;
    }
  }

  return Function;
}

DWORD WINAPI PeMagic(DWORD s)
{
  DWORD *p;
  DWORD dwTmp;

  p = &s - 1;
  if (p[2] >= 0x80000000)
  {
    //sys
    char szDbgPrint[] = {'D','b','g','P','r','i','n','t',0};
    char szSysInfo[] = {'T','h','i','s',' ','i','s',' ','s','y','s',' ','i','n','f','o',0};
    dwTmp = p[2];
    dwTmp = GetModBase(dwTmp & 0xFFFF0000);
    if (dwTmp)
    {
      DBGPRINT fDbgPrint = (DBGPRINT)GetExportByName((LPVOID)dwTmp,szDbgPrint);
      fDbgPrint(szSysInfo);
    }
  }
  else
  {
    char szOutputDebugStringA[] = {'O','u','t','p','u','t','D','e','b','u','g','S','t','r','i','n','g','A',0};
    char szExeInfo[] = {'T','h','i','s',' ','i','s',' ','e','x','e',' ','i','n','f','o',0};
    char szDllInfo[] = {'T','h','i','s',' ','i','s',' ','d','l','l',' ','i','n','f','o',0};
    dwTmp = *(DWORD *)(s + 0x0C);
    dwTmp = *(DWORD *)(dwTmp + 0x1C);
    dwTmp = *(DWORD *)dwTmp;
    dwTmp = *(DWORD *)(dwTmp + 0x08);
    OUTPUTDEBUGSTRING fOutputDebugString = (OUTPUTDEBUGSTRING)GetExportByName((LPVOID)dwTmp,szOutputDebugStringA);

    if ((p[0] - p[3]) <= 0x2000)
    {
      //dll
      fOutputDebugString(szDllInfo);
    }
    else
    {
      //exe
      fOutputDebugString(szExeInfo);
    }
  }
  
  return 0;
}

static __inline NtCurrentPeb(void)
{
  __asm mov eax,fs:[0x30]
}

DWORD WINAPI real_main(DWORD a,DWORD b)
{
  return PeMagic(NtCurrentPeb());
}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (39)
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
vxasm 6 2008-12-19 10:12
2
0
第一时间:沙发。
雪    币: 116
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
peowner 2008-12-19 10:19
3
0
学习了!感谢!
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2008-12-19 10:25
4
0
汗。。。。。
我评分时没仔细看。。。

大侠没有100分。。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2008-12-19 10:34
5
0
CCFER的贴要顶
雪    币: 233
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
glery 2 2008-12-19 10:37
6
0
顶并学习之
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
weolar 10 2008-12-19 10:38
7
0
顶!
我想看看第一题和那个网络题的解法……
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-12-19 10:38
8
0
现在才知道内核模块是0x1000对齐的
雪    币: 29412
活跃值: (18670)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2008-12-19 10:40
9
0
ccfer下次打你PP
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-12-19 10:52
10
0
其实一开始写的就是0x1000
后来想效率高一些就改的步长大了点
主要还是不熟悉内核,缺少一些常识性的认识
雪    币: 8861
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2008-12-19 12:20
11
0
这题用nasm+纯汇编,不用改一个字节吧~
无import,无reloc只有一个.text段,DOSHeader的bin都没有~
雪    币: 287
活跃值: (102)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
cxhcxh 3 2008-12-19 12:20
12
0
学习了。。。。。。。。。。。。
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-12-19 12:22
13
0
无bin无真相
雪    币: 1686
活跃值: (868)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9521 2008-12-19 12:23
14
0
vc一样可以不用改
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2008-12-19 12:24
15
0
winhex一样可以不用改
雪    币: 1122
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
DiKeN 5 2008-12-19 12:33
16
0
我题目没看懂, 丢了好多分.
雪    币: 8861
活跃值: (2364)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 10 2008-12-19 12:34
17
0
怎么弄~~
用int 0x2d输出string?
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2008-12-19 12:35
18
0
subsystem:0x2的时候 xp下驱动一样可以加载
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2008-12-19 12:45
19
0
爆早了吧,快没收cc的奖品! 见人有份
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 26 2008-12-19 13:04
20
0
学习,学习,学习。
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XSJS 2008-12-19 13:29
21
0
我就是暴力在ntorkenl.exe搜索DbgPrint,后来才悟到可以用int 2eh
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XSJS 2008-12-19 13:31
22
0
惨啊惨啊,经验不足。。。。。。。。。题目有点BT。
其实试出subsystem=2可以加载就差不多可以做出来了的
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2008-12-19 13:33
23
0
欧阳哥哥,我和你换
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2008-12-19 13:38
24
0
用中断int 2d的一律没给分
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XSJS 2008-12-19 13:46
25
0
无所谓了,反正我的驱动你加载就蓝掉了,驱动怎么写都没分。
游客
登录 | 注册 方可回帖
返回