首页
社区
课程
招聘
[求助]用malloc开辟一段空间,然后memcpy一个dll的代码进去,通过偏移改eip,为何显示不可读,xt看malloc的空间是readwrite的
发表于: 2014-10-2 17:51 5925

[求助]用malloc开辟一段空间,然后memcpy一个dll的代码进去,通过偏移改eip,为何显示不可读,xt看malloc的空间是readwrite的

2014-10-2 17:51
5925
如题~~(代码段复制的),改了eip后程序直接蹦了

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你是要直接执行dll的代码么?
这样直接copy进去的话 可不是dll正常加载到内存的呀
输入表 还有重定位啥的都没处理,看下内存加载dll的那个库吧

放假还不玩玩撒,,楼主11搞的咋样了
2014-10-2 18:08
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已经搞出来了,异常处理+硬件断点+hook getthreadcontext+hook KiUserExceptionDispatcher,不过4个断点实现的功能太少
所以想搞搞这样
2014-10-2 18:17
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
oo ,hook getthreadcontext+hook KiUserExceptionDispatcher过掉硬件断点检测,然后用异常处理gamedll的模块代码么?,,,,可以留个qq一起交流不...
2014-10-2 18:54
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你说你的吧
2014-10-2 18:58
0
雪    币: 74
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
重定位做了没.......
而且你应该用 PAGE_EXECUTE_READWRITE啊
2014-10-2 20:37
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
怎么重定位
2014-10-2 22:12
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
必须要做重定位,具体的看PE的资料。有点奇怪的是,不重定位,楼主大人的程序是怎么运行起来的,好奇一下
2014-10-3 15:05
0
雪    币: 96
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
没用运行起来。。直接蹦了
不过我virtualalloc,复制了dll,然后把dll重定位,运行virtualalloc的那部分,程序运行了1秒就自动关闭了,咋回事
typedef struct _UNICODE_STRING
{
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING,*PUNICODE_STRING;

typedef struct _PEB_LDR_DATA {
  ULONG                   Length;
  BOOLEAN                 Initialized;
  PVOID                   SsHandle;
  LIST_ENTRY              InLoadOrderModuleList;
  LIST_ENTRY              InMemoryOrderModuleList;
  LIST_ENTRY              InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _LDR_MODULE
{
  LIST_ENTRY          InLoadOrderModuleList;   //+0x00
  LIST_ENTRY          InMemoryOrderModuleList; //+0x08  
  LIST_ENTRY          InInitializationOrderModuleList; //+0x10
  void*               BaseAddress;  //+0x18
  void*               EntryPoint;   //+0x1c
  ULONG               SizeOfImage;
  UNICODE_STRING      FullDllName;
  UNICODE_STRING      BaseDllName;
  ULONG               Flags;
  SHORT               LoadCount;
  SHORT               TlsIndex;
  HANDLE              SectionHandle;
  ULONG               CheckSum;
  ULONG               TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
VOID RebaseModule(HMODULE hModToRebase,ULONG newBase)
{
        char *ModuleBase=NULL;//映射后的基址
        PIMAGE_DATA_DIRECTORY pRelocTable=NULL;//指向重定位表
        PIMAGE_DOS_HEADER pDosHeader;
        PIMAGE_FILE_HEADER pFileHeader;
        PIMAGE_OPTIONAL_HEADER pOptHeader;
        PIMAGE_BASE_RELOCATION pRelocBlock;
        DWORD dwIoCnt;
        DWORD newValue = 0 ;
        WORD i=0;//用作循环计数

        ModuleBase=(char*)hModToRebase;
//        printf("Mode Base=0x%08X\n",ModuleBase);
        pDosHeader=(PIMAGE_DOS_HEADER)ModuleBase;
        pFileHeader=(PIMAGE_FILE_HEADER)(ModuleBase+pDosHeader->e_lfanew+4);
        pOptHeader=(PIMAGE_OPTIONAL_HEADER)((char*)pFileHeader+sizeof(IMAGE_FILE_HEADER));

        //保存重定位表信息
       
        pRelocTable=&(pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]);
//        printf("IMAGE_DIRECTORY_ENTRY_BASERELOC:0x%08X Size=0x%X\n",pRelocTable->VirtualAddress,pRelocTable->Size);

        //开始处理重定位数据
       
        //先取得第一个重定位块的地址
        pRelocBlock=(PIMAGE_BASE_RELOCATION)(ModuleBase+pRelocTable->VirtualAddress);
//        printf("After Loaded,Reloc Table=0x%08X\n",pRelocBlock);
        do
        {//处理一个接一个的重定位块,最后一个重定位块以RAV=0结束
                //需要重定位的个数,是本块的大小减去块头的大小,结果是以DWORD表示的大小
                //而重定位数据是16位的,那就得除以2
                int numofReloc=(pRelocBlock->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/2;
                //printf("Reloc Data num=%d\n",numofReloc);
                //重定位数据是16位的
                WORD offset=0;
                WORD *pRelocData=(WORD*)((char*)pRelocBlock+sizeof(IMAGE_BASE_RELOCATION));
                for (i=0;i<numofReloc;i++)//循环,或直接判断*pData是否为0也可以作为结束标记
                {
                        DWORD *RelocAddress=0;//需要重定位的地址
                        //重定位的高4位是重定位类型,
                        if (((*pRelocData)>>12)==IMAGE_REL_BASED_HIGHLOW)//判断重定位类型是否为IMAGE_REL_BASED_HIGHLOW
                        {
                                //计算需要进行重定位的地址
                                //重定位数据的低12位再加上本重定位块头的RAV即真正需要重定位的数据的RAV
                                offset=(*pRelocData)&0xFFF;//小偏移
                                RelocAddress=(DWORD*)(ModuleBase+pRelocBlock->VirtualAddress+offset);
                                //对需要重定位的数据进行修正
                                //修正方法:减去IMAGE_OPTINAL_HEADER中的基址,再加上新的基址即可
                                //*RelocAddress=*RelocAddress-pOptHeader->ImageBase+newBase;
                                newValue =*RelocAddress - (DWORD)ModuleBase + newBase;
                                WriteProcessMemory(GetCurrentProcess(),RelocAddress,&newValue,sizeof(DWORD),&dwIoCnt);
                        }
                        pRelocData++;
                       
                }
                //指向下一个重定位块
                pRelocBlock=(PIMAGE_BASE_RELOCATION)((char*)pRelocBlock+pRelocBlock->SizeOfBlock);
               
        }while (pRelocBlock->VirtualAddress);
}

我调用的是RebaseModule(dll基地址,malloc的地址)
2014-10-3 15:42
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你设置内存保护属性了么?另外有些dll要运行一下dll入口
2014-10-4 09:29
0
雪    币: 74
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
dll里有个重定位节区 按照节区里的信息对代码进行重定位处理
手动加载dll需要处理重定位节区并且对导入表进行重定位  因为你是拷贝已经加载的dll所以只要处理重定位节区即可 导入表系统已经帮你处理了
至于怎么处理你度娘下 peloader  原理基本一样  论坛上也有一大堆
另外执行代码需要page_execute_readwrite  光是读写权限是不行的
2014-10-4 14:14
0
游客
登录 | 注册 方可回帖
返回
//