文章目录

  • easyCpp
    • transform分析
    • accumulate分析
    • 代码实现
  • [MRCTF2020]EasyCpp
    • main::{lambda(int &)#1}
      • lambda(int &)#1
      • :operator++(_QWORD *a1)

easyCpp

简单题目,只是伤眼而已。
大概分析了一下,有实际作用的也就两个函数。

transformaccumulate,接下来,逐渐展开。拖进ida

 for ( i = 0; i <= 15; ++i ){scanf("%d", &v26[4 * (signed __int64)i], v16);std::vector<int,std::allocator<int>>::push_back((__int64)&v20, (__int64)&v26[4 * i]);}

输入东西进行相应的初始化。。

  for ( j = 0; j <= 15; ++j ){LODWORD(v25) = fib(j);std::vector<int,std::allocator<int>>::push_back(&v19, &v25);}

fib(j)进去看了一下也就是生成相应长度的斐波那契数列

push_back函数作用大概用猜都能猜完,只不过每个push_back都不一样,最好还是进去看看。

transform分析

__int64 __fastcall std::transform<__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>,std::back_insert_iterator<std::vector<int,std::allocator<int>>>,main::{lambda(int)#1}>(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{int *v4; // rax@3__int64 *v5; // rax@3__int64 result; // rax@4__int64 v7; // rcx@4__int64 v8; // [sp+0h] [bp-30h]@1__int64 v9; // [sp+8h] [bp-28h]@1__int64 v10; // [sp+10h] [bp-20h]@1__int64 v11; // [sp+18h] [bp-18h]@1int v12; // [sp+24h] [bp-Ch]@3__int64 v13; // [sp+28h] [bp-8h]@1v11 = a1;                                   v10 = a2;                                   v9 = a3;                                     v8 = a4;                                  v13 = *MK_FP(__FS__, 40LL);while ( __gnu_cxx::operator!=<int *,std::vector<int,std::allocator<int>>>((__int64)&v11, (__int64)&v10) ){v4 = (int *)__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>::operator*((__int64)&v11);v12 = main::{lambda(int)#1}::operator() const((_DWORD **)&v8, *v4);v5 = (__int64 *)std::back_insert_iterator<std::vector<int,std::allocator<int>>>::operator*((__int64)&v9);std::back_insert_iterator<std::vector<int,std::allocator<int>>>::operator=(v5, (__int64)&v12);__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>::operator++(&v11);// v11++std::back_insert_iterator<std::vector<int,std::allocator<int>>>::operator++((__int64)&v9);// v9++}result = v9;v7 = *MK_FP(__FS__, 40LL) ^ v13;return result;
}

接下来进行简略分析:

 v11 = a1;

根据函数外面分析这个也就是第二个元素的地址

v10 = a2;

根据函数外面分析这个也就是最后一个元素的地址

 v9 = a3;                                      v8 = a4;

而这两个所指的地方的话,它都是一样的,都是起始地址,输入数据的起始地址。(在这里是不是有所疑问,为什么两个指针指向同一个地方呢?)

然后是while循环分析:

v4 = (int *)__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>::operator*((__int64)&v11);遍历取出从v11~v10的每一个元素

从这里分析,两个指向相同地方的指针,v9在变化,它从v8始终不变,指向第一个元素。
得出,把v8加上(v11~v10)的每个元素,然后重新赋值给v9
很清楚了,这函数就是把我们输入的值从第二个开始都加上第一个的值
至于这个v5是啥用,感觉是个中间变量。。。

accumulate分析

__int64 __usercall std::accumulate<__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>,std::vector<int,std::allocator<int>>,main::{lambda(std::vector<int,std::allocator<int>>,int)#2}>@<rax>(__int64 a1@<rdx>, __int64 a2@<rcx>, __int64 a3@<rdi>, __int64 a4@<rsi>, char a5)
{int v5; // ebx@3__int64 result; // rax@4__int64 v7; // rcx@4__int64 v8; // [sp+0h] [bp-70h]@1__int64 v9; // [sp+8h] [bp-68h]@1__int64 v10; // [sp+10h] [bp-60h]@1__int64 v11; // [sp+18h] [bp-58h]@1char v12; // [sp+20h] [bp-50h]@3char v13; // [sp+40h] [bp-30h]@3__int64 v14; // [sp+58h] [bp-18h]@1v11 = a3;                                     // 第二个元素地址v10 = a4;                                     // 头指针v9 = a1;                                      // 尾指针v8 = a2;v14 = *MK_FP(__FS__, 40LL);while ( __gnu_cxx::operator!=<int *,std::vector<int,std::allocator<int>>>((__int64)&v10, (__int64)&v9) ){v5 = *(_DWORD *)__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>::operator*((__int64)&v10);// v5=&v10std::vector<int,std::allocator<int>>::vector((__int64)&v12, v8);main::{lambda(std::vector<int,std::allocator<int>>,int)#2}::operator() const((__int64)&v13,(__int64)&a5,(__int64)&v12,v5);std::vector<int,std::allocator<int>>::operator=(v8, &v13);std::vector<int,std::allocator<int>>::~vector(&v13);std::vector<int,std::allocator<int>>::~vector(&v12);__gnu_cxx::__normal_iterator<int *,std::vector<int,std::allocator<int>>>::operator++(&v10);}std::vector<int,std::allocator<int>>::vector(v11, v8);result = v11;v7 = *MK_FP(__FS__, 40LL) ^ v14;return result;
}

这个函数静态分析了半天,直接没看明白啥意思。。。
看了看其它大佬动态分析的结果,这个函数功能只是把经过 accumulate 函数后的结果. 把结果都记录下来后. 发现只是把 transform函数后的结果进行了逆序.(稍后补充解析过程)我动调环境出了点问题。。

代码实现

#include <stdio.h>int fib(int a)
{if (!a || a == 1)return 1;return fib(a - 1) + fib(a - 2);
}int main(void)
{int flag[100] = { 0 }, i = 0;for (i = 0; i <= 15; i++){flag[i] = fib(i);}for (i = 15; i >= 0; i--){printf("%d ", flag[i] = (i < 15 ? flag[i] - flag[15] : flag[i]));}return 0;
}

[MRCTF2020]EasyCpp

 for ( i = 0; i <= 8; ++i ){std::istream::operator>>(&std::cin, &keys[i]);// 输入进行赋值std::__cxx11::to_string((std::__cxx11 *)v22, keys[i]);// keys每个元素赋值给v22std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::operator+=((__int64)v18, (__int64)v22);// 把每个元素字符串加起来,最后放进v18std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::~basic_string(v22);// 释放掉v22}v28 = keys;                                   // keys赋给v28v29 = keys;                                   // keys赋给v29v27 = (int *)&unk_83E4;                       // 这里取出v27的作用也就是起到一个end作用while ( v29 != v27 ){v17 = *v29;std::vector<int>::push_back((__int64)v20, (__int64)&v17);// 这里就是把每个keys元素进行push++v29;}

main::{lambda(int &)#1}

 unsigned int v2; // ebx__int64 v3; // raxchar v5; // [rsp+Fh] [rbp-21h] BYREF__int64 v6; // [rsp+10h] [rbp-20h] BYREF__int64 v7[3]; // [rsp+18h] [rbp-18h] BYREFv7[0] = a1;v6 = a2;while ( (unsigned __int8)__gnu_cxx::operator!=<int *,std::vector<int>>(v7, &v6) ){v3 = __gnu_cxx::__normal_iterator<int *,std::vector<int>>::operator*(v7);main::{lambda(int &)#1}::operator()(&v5, v3);__gnu_cxx::__normal_iterator<int *,std::vector<int>>::operator++(v7);}return v2;

lambda(int &)#1

_DWORD *result; // raxresult = a2;*a2 ^= 1u;return result;

异或1然后返回

:operator++(_QWORD *a1)

*a1 += 4LL;return a1;

这里的我刚开始以为是元素值自增4,但后来看了一下传过来的参数v7是个地址,所以*a1也就是个地址,a1的话就是二级指针,查看汇编代码验证一下:

lea     rdx, [rax+4]
mov     rax, [rbp+var_8]
mov     [rax], rdx
mov     rax, [rbp+var_8]

这里用的是

XCTF easyCpp buu [MRCTF2020]EasyCpp相关推荐

  1. buu [MRCTF2020]天干地支+甲子 1

    题目描述: 题目分析: 首先有这一题我们可以想到 'buuctf 传统知识+古典密码 1' 这一题 通过天干地支类似解题方法可以由 "甲戌 甲寅 甲寅 癸卯 己酉 甲寅 辛丑" 转 ...

  2. buu [MRCTF2020]vigenere

    密文:g vjganxsymda ux ylt vtvjttajwsgt bl udfteyhfgt oe btlc ckjwc qnxdta  vbbwwrbrtlx su gnw nrshylwm ...

  3. buu [MRCTF2020]keyboard

    密文: ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ...

  4. CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决

    CTF逆向-[MRCTF2020]VirtualTree-恒成立的jz花指令去除及smc变换原执行流程在二叉树上的应用,通过逆向思维编写脚本以解决 来源:https://buuoj.cn/ 内容: 附 ...

  5. buu(前三页第二弹) RSA习题与相关知识总结

    文章目录 buu [ACTF新生赛2020]crypto-rsa3 1 题目描述: 题目分析: 收获与体会: buu [WUSTCTF2020]情书 1 题目描述: 题目分析: 收获与体会: buu ...

  6. REVERSE-PRACTICE-BUUCTF-21

    REVERSE-PRACTICE-BUUCTF-21 [SCTF2019]babyre [MRCTF2020]EasyCpp [GUET-CTF2019]encrypt [QCTF2018]Xman- ...

  7. BUUCTF reverse题解汇总

    本文是BUUCTF平台reverse题解的汇总 题解均来自本人博客 目录 Page1 Page2 Page3 Page4 Page1 easyre reverse1 reverse2 内涵的软件 新年 ...

  8. CTF逆向-[b01lers2020]little_engine-cpp基本函数用法和byte类型要点

    CTF逆向-[b01lers2020]little_engine-cpp基本函数用法和byte类型要点 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.co ...

  9. XCTF easyCpp

    查壳 无壳,64位Linux程序 放入IDA中分析 查看Main函数 这里拿加密后的用户输入和程序生成的前16个斐波那契数列进行对比 ,不相等则退出程序,相等的话则继续往下执行 所以说只需要逆推出in ...

最新文章

  1. java基本类型转换,随记
  2. 【为自己相亲】单身小姐姐你在哪里,我是书豪,我在等你
  3. vue-cli脚手架项目构成
  4. 谈谈常用清除浮动的方法
  5. MySQL多表事务课堂笔记
  6. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑
  7. Linux服务之SSH
  8. python编程能有什么用_python编程能做什么开发
  9. 字符、字符集和字符编码详解(一文扫清疑惑)
  10. java基础 作业(一)
  11. C语言 scanf函数
  12. 《中国人工智能学会通讯》——第12章 12.1 新世纪知识工程—— 在哪里跨越
  13. ES6学习笔记三(字符串)
  14. 苹果cms影视源码的安装和使用
  15. vue vant ui 教程注意事项
  16. CGI编程学习----查询2000W开房数据
  17. 自动化构建工作流--grunt
  18. pip使用清华镜像源安装库
  19. 超长攻略,机器学习基石!带你涉足王者之巅
  20. mybatis 查询出的日期没有时分秒

热门文章

  1. 成功解决KeyError: “Passing list-likes to .loc or [] with any missing labels is no longer supported. The
  2. 成功解决极其刁钻bug之SyntaxError: invalid character in identifier
  3. DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(六)
  4. 成功解决ValueError: Parameter values for parameter (n_estimators) need to be a sequence.
  5. 中科院分词系统(NLPIR)JAVA简易教程
  6. JavaScript优化基本篇
  7. Pycharm下载tensorflow问题
  8. dedecms织梦修改标题默认长度
  9. SSH连接原理及ssh-key讲解
  10. hiho 1318 非法二进制数 dp