zoukankan      html  css  js  c++  java
  • [WP]XCTF-re2-cpp-is-awesome

    1、查看基本信息,64 位 ELF 文件

     2、载入 IDA 中,进入 main 函数

    修改其中的函数的名称后方便分析(下面等号代表相等不代表赋值)

    找到关键循环,前面两行代码 v17 = 0, v8 = v14

    循环内前两行(行号33, 34)v9 = v14, v16 = v9

    第一次循环时 i = v8,也就有 i = v8 = v14 = v9 = v16 --> i = v16,会执行 35 行的 if 语句,之后由于 i 的自增便不会执行。可以当做这部分代码不存在来看下面的代码。

    37 行将 i 的值赋值给 v11,即 v8 的值(第一次循环等于 v8 之后 i 会自增)。

    然后 v11 会进行比较,如果不等会输出一个错误的警告信息。

    而判断条件右半部分我们是可以直接查看的。

     

     3、第一步直接运行时,会出现提示 Usage: ./re2-cpp-is-awesome flag

    我们输入提示信息,会输出 Better luck next time

    而实际上我们观察 main 函数 __int64 __fastcall main(int a1, char **a2, char **a3) 会发现其中有三个参数。

    a1 经过测试可以知道是我们输入的字符串的个数(空格分隔开),当输入三个字符串时也会跳出提示信息。

    a2 即我们输入的字符串(第一步的为./re2-cpp-is-awesome flag)而它其实并不能检测到第二个字符串是否为 "flag"。

    a3 在第 20、26 等行也是赋值为 v2。

    知道 a2 是我们运行程序是输入的字符串后,由第 27 行的 std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string(&v14, a2[1], &v15); 就能知道我们输入的第二个串(a2[1],下标 1 代表第二个串)存储到了 v14 中。

    此时再看关键循环便能知道 i 实际上是我们输入的第二个串的每个字符。

     4、查看 string 和 index 的具体表示

    index 有一个对齐,观察地址可以知道前几位应该是 0x24, 0x0, 0x5, 0x36

     5、编写 EXP,运行得到 flag

    1 s = 'L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t'
    2 index = [0x24, 0x0, 0x5, 0x36, 0x65, 0x7, 0x27, 0x26, 0x2D, 0x1, 0x3, 0x0, 0xD, 0x56, 0x1, 0x3, 0x65, 0x3, 0x2D, 0x16, 0x2, 0x15, 0x3, 0x65, 0x0, 0x29, 0x44, 0x44, 0x1, 0x44, 0x2B]
    3 flag = ''
    4 for i in index:
    5     flag += s[i]
    6 print(flag)

     

  • 相关阅读:
    学习之spring属性文件注入
    学习之spring自带缓存
    FreeMarker语法
    spring mvc 拦截器
    spring mvc 全局异常处理
    spring mvc 多视图配置
    学习之spring注解DI疑惑
    @Transactional详解
    mybatis关联查询
    shiro 实现 用户 a 操作b 的权限 ,用户 b 能够及时获知。b不需要退出登陆 。 关闭鉴权缓存,或者不配置缓存
  • 原文地址:https://www.cnblogs.com/Tsuiyields/p/13712114.html
Copyright © 2011-2022 走看看