Revers篇:攻防世界reverse进阶re2-cpp-is-awesome

攻防世界reverse进阶re2-cpp-is-awesome

IDA分析

很简单的一个程序
Revers篇:攻防世界reverse进阶re2-cpp-is-awesome

程序流程分析

  • 首先检查参数,参数少于2就退出,并提示:Usage: ./re2-cpp-is-awesome flag,也就是要给main传参。
  • 然后获取到参数,在堆申请了一段空间,大小为参数长度+1,并把参数放进去。
  • 把begin赋值给v11,把end赋值给v14
  • 进入while循环,第一个if判断是否到字符串结尾,到了就break退出。
  • 第二个 if 判断,v9是否等于data段指定的字符,不等就退出。这里是以单字节判断,没办法去内存找数据,一个不相等就退出了。
  • 好在知道v9是原始flag,又知道data段中的数据,直接用数据运算即可。

获取flag

#include <iostream>

int main()
{
    char flag_list[] = "L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t";
    int dword_ptr[] = { 0x24,0x00,0x05,0x36,0x65,0x07,0x27,0x26,0x2D,0x01,0x03,0x00,0x0D,0x56,0x01,0x03,0x65,0x03,0x2D,0x16,0x02,0x15,0x03,0x65,0x00,0x29,0x44,0x44,0x01,0x44,0x2B };
    char v9 = 0;
    int v5 = 0;
    while (v5<(sizeof(dword_ptr)/4))
    {
        
        v9 = flag_list[dword_ptr[v5]];
        ++v5;
        printf("%c", v9);
    }
    return 0;
}

运行结果

结果为:ALEXCTF{W3_L0v3_C_W1th_CL45535}
Revers篇:攻防世界reverse进阶re2-cpp-is-awesome

上一篇:《算法竞赛进阶指南》0x03 T1 激光炸弹


下一篇:Web基础_0x03_Go的http包详解