首页
社区
课程
招聘
[求助]来啊,一起看看这是不是个洞?
发表于: 2023-3-23 19:40 10855

[求助]来啊,一起看看这是不是个洞?

2023-3-23 19:40
10855

调用函数的环境是这样的:

.text:000000018000CAB8                 lea     r8, [rax-28h]   ; unsigned int
.text:000000018000CABC                 xor     r9d, r9d        ; unsigned int *
.text:000000018000CABF                 xor     edx, edx        ; struct _TOKEN_SECURITY_ATTRIBUTE_V1 *
.text:000000018000CAC1                 mov     rbp, rcx
.text:000000018000CAC4                 call    ?GetPackageRelativeApplicationId@SysAppId@ProcessToken@ARI@@YAJPEBU_TOKEN_SECURITY_ATTRIBUTE_V1@@IPEAIPEAG@Z ; ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(_TOKEN_SECURITY_ATTRIBUTE_V1 const *,uint,uint *,ushort *)
.text:000000018000CAC9                 cmp     eax, 7Ah ; 'z'


被调用函数就是这个GetPackageRelativeApplicationId(),展开是这样的:

.text:000000018000CC1C arg_0           = qword ptr  8
.text:000000018000CC1C
.text:000000018000CC1C                 mov     [rsp+arg_0], rbx
.text:000000018000CC21                 push    rdi
.text:000000018000CC22                 sub     rsp, 20h
.text:000000018000CC26                 mov     r10, [rcx+20h]
.text:000000018000CC2A                 mov     rdi, r9
.text:000000018000CC2D                 movzx   ecx, word ptr [r10+10h]
.text:000000018000CC32                 shr     ecx, 1
.text:000000018000CC34                 lea     eax, [rcx+1]
.text:000000018000CC37                 mov     [r8], eax
.text:000000018000CC3A                 cmp     edx, eax
.text:000000018000CC3C                 jnb     short loc_18000CC45
.text:000000018000CC3E                 mov     eax, 7Ah ; 'z'
.text:000000018000CC43                 jmp     short loc_18000CC5E
.text:000000018000CC45 ; ---------------------------------------------------------------------------
.text:000000018000CC45
.text:000000018000CC45 loc_18000CC45:                          ; CODE XREF: ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(_TOKEN_SECURITY_ATTRIBUTE_V1 const *,uint,uint *,ushort *)+20↑j
.text:000000018000CC45                 mov     rdx, [r10+18h]  ; Src
.text:000000018000CC49                 lea     rbx, [rcx+rcx]
.text:000000018000CC4D                 mov     r8, rbx         ; Size
.text:000000018000CC50                 mov     rcx, r9         ; void *    这里是不是存在问题?
.text:000000018000CC53                 call    memcpy_0
.text:000000018000CC58                 xor     eax, eax
.text:000000018000CC5A                 mov     [rbx+rdi], ax
.text:000000018000CC5E
.text:000000018000CC5E loc_18000CC5E:                          ; CODE XREF: ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(_TOKEN_SECURITY_ATTRIBUTE_V1 const *,uint,uint *,ushort *)+27↑j
.text:000000018000CC5E                 mov     rbx, [rsp+28h+arg_0]
.text:000000018000CC63                 add     rsp, 20h
.text:000000018000CC67                 pop     rdi
.text:000000018000CC68                 retn


我疑问的地方,就是这个memcpy_0,向r9=0?的地方赋值吗?但是系统所示貌似没有问题,为何?



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

收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 7029
活跃值: (3983)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
xor     r9d, r9d
这句是不是在做低32位的对齐,高32位还是有数据的?
2023-3-24 09:56
0
雪    币: 258
活跃值: (1747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Lightal xor r9d, r9d 这句是不是在做低32位的对齐,高32位还是有数据的?
我也疑惑这个地方,之前问过其他朋友,也有说是r9整体清零了;
如果清零的话,这段代码确实会有问题
2023-3-24 10:01
0
雪    币: 10964
活跃值: (4597)
能力值: ( LV12,RANK:404 )
在线值:
发帖
回帖
粉丝
4
xor r9d, r9d 清零
memcpy在分支里面呀,
2023-3-24 11:27
0
雪    币: 267
活跃值: (625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
r9清零了是没错,但这仅仅只会导致memcpy第一个参数为0,如果memcpy第三个参数也为0,那这段代码不会导致access violation
2023-3-24 11:36
0
雪    币: 292
活跃值: (850)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6

看了下你这段函数在ProximityServicePal.dll里,函数在memcpy之前会先比较第二个参数的值,首次调用GetPackageRelativeApplicationId的时候第二个参数值为0,所以第一次调用的时候无论怎么比较都是会返回的,这个汇编xor edx,edx也有体现,所以判断会不通过直接返回,第二次调用才会正常走到memcpy的位置

```
result = ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(this, 0i64, v12, 0i64); //注意下第二个参数
```


ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId的代码逻辑

```
 v6 = *(unsigned __int16 *)(v4 + 0x10) >> 1;

*a3 = v6 + 1;

 if ( (unsigned int)a2 < (int)v6 + 1 ) //这里a2是0,v6是short类型强制转换成int,这里也不存在整数溢出的情况,因此无论怎么比较这个值都会成立,函数返回0x7A,这个错误码一般表示buffer大小不够
    return 0x7Ai64;
  v8 = 2 * v6;
  memcpy_0(a4, *(const void **)(v4 + 24), 2 * v6);
```


至于memcpy的功能主要体现在第二次调用的阶段,第一次返回0x7A之后才会进入第二次调用的逻辑部分

```
result = ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(this, 0i64, v12, 0i64);
  if ( result == 0x7A )
  {
   [...]
      ARI::ProcessToken::SysAppId::GetPackageRelativeApplicationId(
        this,
        (const struct _TOKEN_SECURITY_ATTRIBUTE_V1 *)(v6 - v10),
        (_DWORD *)v12 + 1,
        (unsigned int *)((char *)a4 + 2 * (unsigned int)(v10 - 1) + 2));
      *a3 = v11 + v9 + 1;
      return 0;
    }
```
至于为什么会有第一次调用,主要是为了给第三个参数,也就是v12赋值,这个代码逻辑有点像比如NtQueryInformationToken在某些InformationTokenClass需要先获取buffer的大小,然后malloc出不小于这个buffer大小的buffer再传值,如果不管大小,直接malloc的话,如果malloc的buffer小于token某些结构要返回的大小的话,queryinformationtoken将会失败,GetLastError()返回0x7A,也就是buffer大小不够,这个逻辑也类似,需要先获取出某个结构的大小,再在后面做处理

最后于 2023-3-24 14:02 被Keoyo编辑 ,原因:
2023-3-24 13:57
0
雪    币: 258
活跃值: (1747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Keoyo 看了下你这段函数在ProximityServicePal.dll里,函数在memcpy之前会先比较第二个参数的值,首次调用GetPackageRelativeApplicationId的时候第二个参数 ...
棒棒棒 
2023-3-24 14:18
0
雪    币: 258
活跃值: (1747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Keoyo 看了下你这段函数在ProximityServicePal.dll里,函数在memcpy之前会先比较第二个参数的值,首次调用GetPackageRelativeApplicationId的时候第二个参数 ...

学习了。谢谢给的指导。
我看的代码是consentux.dll中的

最后于 2023-3-24 17:11 被Valdik编辑 ,原因: 更正
2023-3-24 14:28
0
雪    币: 258
活跃值: (1747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
堂前燕 xor r9d, r9d 清零 memcpy在分支里面呀,
2023-3-24 14:29
0
雪    币: 258
活跃值: (1747)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
hypersine r9清零了是没错,但这仅仅只会导致memcpy第一个参数为0,如果memcpy第三个参数也为0,那这段代码不会导致access violation
2023-3-24 14:29
0
雪    币: 25953
活跃值: (5037)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
Keoyo 看了下你这段函数在ProximityServicePal.dll里,函数在memcpy之前会先比较第二个参数的值,首次调用GetPackageRelativeApplicationId的时候第二个参数 ...
请教是怎样定位到ProximityServicePal.dll的,谢谢!
2023-3-26 22:23
0
雪    币: 292
活跃值: (850)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
huangyalei 请教是怎样定位到ProximityServicePal.dll的,谢谢!
google搜下函数名就有了
2023-3-27 11:43
1
游客
登录 | 注册 方可回帖
返回
//