[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)