[XCTF-Reverse] 69 XCTF 3rd-RCTF-2017_MyDriver2-397

本文通过对一个.sys文件的研究,详细解析了其内部结构及加密方式,并通过逆向工程手段成功解码,揭示了该驱动程序背后的秘密。

一个.sys文件,应该是驱动程序。反正当个exe文件处理吧。

在数据区找到两个串,感觉是加密用的qword_16310,qword_16390,顺着这个线索找引用处。于是找到sub_113c8 手工找也行,因为一共也没几个函数。

__int64 sub_113C8()
{
  PVOID v0; // rbx
  int v1; // er11
  int v2; // edx
  _DWORD *v3; // rax
  int v4; // ecx
  __int64 v5; // rax
  signed __int64 v6; // r8
  __int64 result; // rax
  char Dst; // [rsp+20h] [rbp-38h]

  memmove(&Dst, sub_11DF0, 0x22ui64);
  v0 = ExAllocatePool(0, 0x22ui64);
  memmove(v0, &Dst, 0x22ui64);
  dword_16414 = ((__int64 (__fastcall *)(signed __int64, signed __int64))v0)(3435209541i64, 1412570316i64);// 0xccc12345,0x54321ccc
  ExFreePoolWithTag(v0, 0);
  v1 = dword_16414;                             // 0x5c3113c5
  v2 = dword_16414 - 1546720155;                // 42
  v3 = qword_16310;
  do
  {
    *v3 ^= v1;
    ++v3;
  }
  while ( (signed __int64)v3 < (signed __int64)qword_16390 );
  v4 = 0;
  v5 = v2;
  SubStr = (wchar_t *)qword_16310;
  word_16432 = v2;
  word_16430 = v2;
  qword_16310[v5] = 0;
  qword_16310[v5 + 1] = 0;
  v6 = 0i64;
  do
  {
    qword_16390[v6] ^= qword_16310[v4];
    ++v6;
    result = (unsigned int)((v4 + 1) / (unsigned __int16)v2);
    v4 = (v4 + 1) % (unsigned __int16)v2;
  }
  while ( v6 < 128 );
  return result;
}

这里先把sub_11DF0给Dst再殷Dst给v0再运行v0其实就是运行sub_11DF0

unsigned __int64 __fastcall sub_11DF0(__int64 a1, __int64 a2)
{
  return a2 & 0xF0F0F0F0F0F0F0F0ui64 ^ a1 & 0xF0F0F0F0F0F0F0Fi64;
}

所有参数都已经给出了,可以顺序得到dword_16414 = 0x5c3113c5 再逄出v2=42(从数据也可看出长度)

然后给qword_16310和v1做个异或(因为v3是dword类型的,每4字节作一次),再然后就是390和310异或了。

解码

from pwn import *

v = 0x54321ccc & 0xF0F0F0F0F0F0F0F0 ^ 0xccc12345 & 0x0F0F0F0F0F0F0F0F #0x5c3113c5

a = [0x5C5813A25C6E1395,0x5C5413885C5413B3,0x5C5013A95C57139A,0x5C0213F75C6E13A2,0x5C4913B15C1F13F6,0x13B1]
b = b''
for i in a:
    b +=p64(i^ 0x5c3113c55c3113c5)
print(b)

c = [0x6105664765377470,0x733A416D730C2011,0x6E285F096C166D36,0x6F5C686D6531690B,0x780002726A5F58,0x67005F00500074,
     0x4D006500760069,0x6C0066005F0065,0x32005F00670061,0x74002E00330033,0x5F005000740078,0x65007600690067,
     0x66005F0065004D,0x5F00670061006C,0x2E003300330032,0x50007400780074]
d = b''
for i in c:
    d +=p64(i)
print(d)

e = []
for i,v in enumerate(d):
    e.append(v^b[i%42])

print(bytes(e))
#A_simple_Inline_hook_Drv
#RCTF{A_simple_Inline_hook_Drv}

### XCTF WEB进阶 Fakebook 解题报告 #### 源码分析 Fakebook 类似于社交网络平台,在此环境中存在多个功能模块,包括但不限于用户注册、登录以及个人信息管理等功能。通过查看源代码发现,该应用可能存在多种安全漏洞。 对于假想的 `fakebook` 平台而言,其核心逻辑通常围绕着用户的会话管理和数据交互展开。假设存在如下简化版 PHP 伪代码表示部分关键业务流程: ```php <?php class User { public $username; public $password; function login($input_username, $input_password){ // 存在一个潜在的安全隐患:未对输入做严格验证 if ($this->username === $input_username && md5($input_password) === $this->password){ $_SESSION[&#39;logged_in&#39;] = true; return "Login successful"; } return "Invalid credentials"; } } ?> ``` 上述代码片段展示了用户认证过程中可能存在的安全隐患——使用弱哈希算法 MD5 对密码进行了处理[^1]。 #### 安全问题剖析 基于以上描述可以推测出几个主要攻击面: - **弱哈希函数**:MD5 已经被证明不再适合用于护敏感信息,因为它容易受到碰撞攻击的影响。 - **缺乏输入过滤机制**:未能有效防止恶意字符进入系统内部,这可能导致 SQL 注入或其他类型的注入攻击发生。 - **不恰当的错误消息返回**:当用户名或密码错误时给出的具体提示可能会帮助攻击者缩小猜测范围。 #### 利用技巧 针对这些弱点,参赛选手可以从以下几个方面入手尝试突破并解决问题: - 尝试暴力破解或者彩虹表查找已知 MD5 值对应的原始字符串; - 测试是否存在其他形式的数据注入风险点,比如 URL 参数、POST 请求体内的字段等位置; - 探索是否有任何地方暴露出过多调试信息给外部访问者利用; 成功完成挑战后一般可以获得 flag 或者进一步的操作权限作为奖励。 #### 复现过程 为了模拟真实的渗透测试场景,建议按照以下方式构建实验环境来进行练习: 1. 构建一个类似的 Web 应用程序框架,确其中包含了所有必要的组件和服务依赖关系; 2. 实施相应的防护措施来抵御常见的Web 攻击手段,如 XSS 和 CSRF 等; 3. 使用工具辅助自动化执行某些特定任务,例如 Hydra 可以用来实施字典攻击尝试登陆接口; 4. 记录每一步操作细节以便后续总结经验教训,并分享给社区成员共同学习进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值