羊城杯2023 | Reverse

羊城杯2023

CSGO

学习到了sharpOD orz
IDA的话没办法动调 至少很难动调
FindCrypt插件可以发现有base64加密
查看交叉引用 在汇编代码中定位到字串

.text:000000000049B144                 mov     [rsp+0C8h+var_88], rcx
.text:000000000049B149                 mov     [rsp+0C8h+var_80], rdi
.text:000000000049B14E                 mov     [rsp+0C8h+var_70], rdx
.text:000000000049B153                 lea     rcx, BASE64_table_4D9278 ; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"...
.text:000000000049B15A                 movzx   ebx, byte ptr [rax+rcx+0Bh]
.text:000000000049B15F                 xor     eax, eax
.text:000000000049B161                 call    runtime_intstring
.text:000000000049B166                 mov     rcx, [rsp+0C8h+var_88]
.text:000000000049B16B                 mov     rdi, rax
.text:000000000049B16E                 mov     rsi, rbx
.text:000000000049B171                 xor     eax, eax
.text:000000000049B173                 mov     rbx, [rsp+0C8h+var_70]
.text:000000000049B178                 call    runtime_concatstring2
.text:000000000049B17D                 mov     rcx, [rsp+0C8h+var_80]
.text:000000000049B182                 inc     rcx
.text:000000000049B185                 mov     rdx, rax
.text:000000000049B188                 mov     rax, rcx
.text:000000000049B18B                 mov     rcx, rbx

在main的汇编可以找到最后加密对比字符串

mov     rcx, rbx
lea     rbx, aCpqebacrpNZepY ; "cPQebAcRp+n+ZeP+YePEWfP7bej4YefCYd/7cuP"...
call    runtime_memequal
test    al, al
jnz     short loc_49B282

但是直接解发现是乱码
那么要么换表 要么base64后还进行了加密
但是看密文形式(=) 只可能是换表 但只有上面找到的一处lea ... ABCD...
理论可以动调查看
但IDA动调会直接while(1)卡死
反调试逻辑也比较复杂
这里学习到了用x64dbg的sharpOD插件过掉反调试的方法

搜索安装好插件 把默认勾上的都勾上
在x64中搜索ABCD... 定位到代码段
下个断点 就能运行了
输入flag后一直F9 可以发现出现了一个很大的循环 对base64表进行了变换

0000000000B5B14 | 48:895424 58            | mov qword ptr ss:[rsp+58],rdx           | [rsp+58]:"LMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHI"
0000000000B5B15 | 48:8D0D 1EE10300        | lea rcx,qword ptr ds:[B99278]           | 0000000000B99278:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

可以发现这里逻辑就是做了一个整体平移 那么提取出变表base64解密即可
DASCTF{73913519-A0A6-5575-0F10-DDCBF50FA8CA}



抽空还得看看具体怎么反调试的 以及IDA怎么反反调试

其实通过这段代码(概率性的F5出来了)

    v19 = (unsigned __int8)BASE64_table_4D9278[v25 + 11];
    v8 = runtime_intstring(
           0,
           v19,
           (unsigned int)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
           v24,
           (int)v25 + 11,
           v12,
           v13,
           v14,
           v15,
           v53,
           v59);
    LODWORD(v9) = v19;

可以猜到大致是移位11位 外面套了个64的循环 那么应该是取index赋值之类

Blast

用D810稍微去了点混淆
main

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  ...
  v45 = a1;
  v44 = a2;
  v43 = &v8;
  v42 = &v8;
  v41 = &v8;
  v40 = &
<think>嗯,用户问的是关于“{{ 'qwertr' | reverse}}为什么用不了”。首先,我需要理解用户的问题到底是什么意思。看起来用户可能在使用某种模板引擎或者编程语言中的过滤器,比如Jinja2或者类似的东西。这里用了一个reverse过滤器,把字符串'qwertr'反转,但结果可能没有按预期工作,或者用户遇到了错误。 首先,我需要确认用户使用的上下文。这个reverse过滤器通常出现在模板引擎中,比如在Python的Jinja2、Django模板,或者JavaScript的模板库如Nunjucks中。不同的环境可能会有不同的语法和限制。比如在Jinja2中,{{ 'qwertr' | reverse }}应该会把字符串反转成'rtrewq',但用户说用不了,可能遇到了错误或者没有得到期望的结果。 接下来,我需要考虑可能的问题原因。可能的情况包括: 1. **语法错误**:用户可能没有正确使用过滤器,或者在模板引擎中没有正确配置。比如,是否正确地使用了管道符号|,是否有空格问题,或者过滤器名称是否正确。 2. **环境不支持reverse过滤器**:某些模板引擎可能默认不启用reverse过滤器,或者需要额外的扩展或自定义过滤器才能使用。例如,在Jinja2中,可能需要检查是否加载了相关扩展,或者是否自定义了过滤器。 3. **变量类型问题**:reverse过滤器可能只适用于列表或可迭代对象,而不是字符串。例如,如果在一个环境中,reverse用于列表反转,而字符串需要先转换成列表,或者使用不同的方法处理。 4. **作用域或上下文问题**:用户可能在错误的上下文中使用该过滤器,比如在不能直接访问字符串变量的地方。 5. **拼写错误或版本问题**:可能用户误拼了过滤器名称,或者使用的模板引擎版本过旧,不支持该过滤器。 现在,我需要进一步分析具体的案例。假设用户使用的是Jinja2模板引擎,{{ 'qwertr' | reverse }}应该返回反转后的字符串。如果不起作用,可能的原因可能是: - **未启用相关扩展**:Jinja2默认可能没有reverse过滤器,可能需要通过扩展或者自定义过滤器来实现。 - **字符串处理问题**:Jinja2的reverse过滤器可能只能用于列表,如果是字符串,可能需要先转换成字符列表,再反转,再合并。例如,使用{{ 'qwertr' | list | reverse | join }}。如果用户直接对字符串使用reverse,可能不会得到预期结果。 另外,用户可能混淆了不同模板引擎的语法。比如,在Django模板中,可能没有内置的reverse过滤器,需要自定义或者使用其他方法。 也有可能用户是在其他上下文中使用,比如JavaScript的模板库,或者甚至是在命令行工具中尝试这样的操作,导致语法不兼容。 再考虑用户可能的错误信息。如果用户没有得到任何输出或者报错信息,可能需要检查是否有语法错误,比如是否在正确的模板标签内使用,或者是否有其他冲突的代码。 总结可能的问题和解决方案: 1. **检查模板引擎的文档**:确认使用的模板引擎是否支持reverse过滤器,以及正确的使用方法。 2. **字符串处理**:如果过滤器仅支持列表,需要先将字符串转换为列表,反转后再合并。 3. **自定义过滤器**:如果环境不支持,可能需要自定义reverse过滤器来处理字符串。 4. **检查拼写和语法**:确保过滤器名称正确,语法符合引擎要求,比如正确的管道符号和空格。 5. **查看错误日志**:如果有错误信息,根据提示调试,比如查看是否过滤器未注册或变量未定义。 最后,用户可能需要提供更多上下文,比如使用的具体框架、模板引擎、错误信息等,以便更准确地诊断问题。但根据现有信息,以上是可能的原因和解决方法。</think>以下是关于 `{{ 'qwertr' | reverse }}` 无法正常使用的原因分析及解决方法: --- ### **一、可能原因** 1. **语法依赖特定模板引擎** `reverse` 过滤器通常存在于模板引擎(如 Jinja2、Liquid 等),但需确保: - 当前环境支持该语法(例如在纯文本或非模板环境中直接使用会无效)。 - 正确加载了相关扩展(如某些引擎需手动启用过滤器)。 2. **过滤器适用范围问题** - **字符串反转**:部分引擎的 `reverse` 仅支持列表(如 Python 列表),对字符串需先转为列表再操作。 例如:`{{ 'qwertr' | list | reverse | join }}`(Jinja2 中需分步处理)。 - **变量类型限制**:若输入非字符串或列表,可能报错。 3. **环境配置问题** - 未安装/启用相关库(如 Python 的 Jinja2 未安装)。 - 自定义过滤器未正确注册(需在代码中手动添加 `reverse` 功能)。 --- ### **二、场景示例与解决方案** #### **场景 1:在 Python Jinja2 模板中** - **问题复现** 直接使用 `{{ 'qwertr' | reverse }}` 可能无输出或报错。 - **解决方法** 分步处理字符串: ```jinja2 {{ 'qwertr' | list | reverse | join }} {# 输出:rtrewq #} ``` #### **场景 2:在 Liquid 模板(如 Jekyll)中** - **问题复现** Liquid 默认不支持 `reverse` 过滤器,需通过插件或自定义代码实现。 - **解决方法** 使用自定义过滤器或改用编程逻辑(如 Ruby 预处理数据)。 #### **场景 3:在纯编程语言中** - **Python 示例** ```python text = 'qwertr' reversed_text = text[::-1] # 输出:'rtrewq' ``` - **JavaScript 示例** ```javascript const reversedText = 'qwertr'.split('').reverse().join(''); // 输出:'rtrewq' ``` --- ### **三、通用排查步骤** 1. **检查环境支持** - 确认当前工具/语言是否原生支持 `reverse` 操作。 - 查阅官方文档(如 Jinja2、Django、Liquid 的过滤器列表)。 2. **验证代码逻辑** - 尝试简化操作: ```python # Python 测试 print('qwertr'[::-1]) # 预期输出 rtrewq ``` - 若成功,则问题出在模板引擎配置;若失败,检查语法或数据类型。 3. **自定义过滤器(以 Jinja2 为例)** 若引擎无内置 `reverse`,可手动注册: ```python from jinja2 import Environment def reverse_filter(s): return s[::-1] env = Environment() env.filters['reverse'] = reverse_filter template = env.from_string("{{ 'qwertr' | reverse }}") print(template.render()) # 输出 rtrewq ``` --- ### **四、常见错误提示** - **`UndefinedError: 'reverse' is undefined`** → 过滤器未注册或环境未启用。 - **`TypeError: unsupported operand type`** → 输入数据类型不符(如对数字使用 `reverse`)。 --- **总结**:`{{ 'qwertr' | reverse }}` 的可用性取决于具体环境和语法支持。若需跨平台通用,建议直接使用编程语言的原生字符串反转方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值