解题过程:

直接放入IDA分析,跳入main函数,得到如下内容

int __cdecl main(int argc, const char **argv, const char **envp)
{char *v3; // raxchar v5; // [rsp+Fh] [rbp-41h]char v6[56]; // [rsp+10h] [rbp-40h] BYREFunsigned __int64 v7; // [rsp+48h] [rbp-8h]v7 = __readfsqword(0x28u);printf("Try my base64 program?.....\n>");__isoc99_scanf("%20s", v6);v5 = time(0LL);srand(v5);if ( (rand() & 1) != 0 ){v3 = base64_encode(v6);puts(v3);puts("Is there something wrong?");}else{puts("Sorry I think it's not prepared yet....");puts("And I get a strange string from my program which is different from the standard base64:");puts("d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==");puts("What's wrong??");}return 0;
}

显然,最底下有一串形似base64编码的字符串

d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==

解码发现无法正确得到内容,猜测是映射表被更改过

观察发现一个明显怪异的函数:“O_OLookAtYou”

__int64 O_OLookAtYou()
{__int64 result; // raxchar v1; // [rsp+1h] [rbp-5h]int i; // [rsp+2h] [rbp-4h]for ( i = 0; i <= 9; ++i ){v1 = base64_table[i];base64_table[i] = base64_table[19 - i];result = 19 - i;base64_table[result] = v1;}return result;
}

直接放入VS得到置换后结果:

int main()
{char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for (int i = 0; i <= 9; ++i){char v1 = base64_table[i];base64_table[i] = base64_table[19 - i];char result = 19 - i;base64_table[result] = v1;}cout << base64_table;//TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
}

得到新表,直接对密文进行解密即可得到flag

--------------------------------------------------------------------------------------------

明确一点,当main函数找不到期望的内容的时候,应该从start函数开始看

main函数为用户代码的入口,但在此之前应有许多函数库需要初始化,这些初始化工作则从start函数开始

// positive sp value has been detected, the output may be wrong!
void __fastcall __noreturn start(__int64 a1, __int64 a2, void (*a3)(void))
{__int64 v3; // raxint v4; // esi__int64 v5; // [rsp-8h] [rbp-8h] BYREFchar *retaddr; // [rsp+0h] [rbp+0h] BYREFv4 = v5;v5 = v3;__libc_start_main(main, v4, &retaddr, _libc_csu_init, _libc_csu_fini, a3, &v5);__halt();
}

本题中,__libc_start_main()函数调用了包括main在内的三个函数(但第三个函数进入后会发现里面什么都没有)

void __fastcall _libc_csu_init(unsigned int a1, __int64 a2, __int64 a3)
{signed __int64 v4; // rbp__int64 i; // rbxv4 = &_do_global_dtors_aux_fini_array_entry - _frame_dummy_init_array_entry;init_proc();if ( v4 ){for ( i = 0LL; i != v4; ++i )(_frame_dummy_init_array_entry[i])(a1, a2, a3);}
}

v4变量使用了两个标签,不妨进入去看看

.init_array:0000000000601E08 __frame_dummy_init_array_entry dq offset frame_dummy
.init_array:0000000000601E08                                         ; DATA XREF: LOAD:00000000004000F8↑o
.init_array:0000000000601E08                                         ; LOAD:0000000000400210↑o ...
.init_array:0000000000601E08                                         ; Alternative name is '__init_array_start'
.init_array:0000000000601E10                 dq offset O_OLookAtYou
.init_array:0000000000601E10 _init_array     ends
.init_array:0000000000601E10
.fini_array:0000000000601E18 ; ELF Termination Function Table
.fini_array:0000000000601E18 ; ===========================================================================
.fini_array:0000000000601E18
.fini_array:0000000000601E18 ; Segment type: Pure data
.fini_array:0000000000601E18 ; Segment permissions: Read/Write
.fini_array:0000000000601E18 _fini_array     segment qword public 'DATA' use64
.fini_array:0000000000601E18                 assume cs:_fini_array
.fini_array:0000000000601E18                 ;org 601E18h
.fini_array:0000000000601E18 __do_global_dtors_aux_fini_array_entry dq offset __do_global_dtors_aux

0000000000601E10地址处引用了O_OLookAtYou函数的地址

这一系列函数通过_libc_csu_init函数中的for循环去使用

当然,实际上看看表有没有被更改只需要对base64_table查看其交叉引用即可

所以最后还是自己瞎忙活一通,算是吃个瘪长个教训吧......

[WUSTCTF2020]level3 笔记与自省相关推荐

  1. Dubbo笔记 ㉗ : 服务自省-提供者

    文章目录 一.前言 1. 概念 二.服务自省 1. 相关配置 3.1 dubbo.application.metadata-type 3.2 dubbo.application.register-co ...

  2. Dubbo笔记 ㉘ : 服务自省-消费者

    文章目录 一.前言 二.ReferenceAnnotationBeanPostProcessor#doGetInjectedBean 1. newProxyInstance 2. ReferenceB ...

  3. BUUCTF RE WP39-40 [WUSTCTF2020]Cr0ssfun、[WUSTCTF2020]level3

    (为了保证隔两天一更就来水文了) 39.[WUSTCTF2020]Cr0ssfun 得到的 flag 请包上 flag{} 提交. 感谢 Iven Huang 师傅供题. 比赛平台:https://c ...

  4. [WUSTCTF2020]level3

    文章目录 拖进ida base64 O_OLookAtYou() 写个脚本: 答案: 拖进ida base64 d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9y ...

  5. REVERSE-PRACTICE-BUUCTF-12

    REVERSE-PRACTICE-BUUCTF-12 [WUSTCTF2020]level3 crackMe [FlareOn6]Overlong [WUSTCTF2020]Cr0ssfun [WUS ...

  6. buuctf刷题记录(6)

    [MRCTF2020]Xor 查壳: 拖入IDA中: 跟进,但是我们无法对关键函数sub_401090查看伪代码: 然后我们就直接看: 再函数中可以看到v0和byte_4212c0按位异或,最后得到b ...

  7. WUST2020部分WP

    [WUSTCTF2020]B@se 密文:MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD== JASGBWcQPRXEFLbCDIlmnHUVKT ...

  8. BUUCTF reverse题解汇总

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

  9. 【2023.5.3~2023.5.9】CTF刷题记录

    目录 日期:2023.5.3 题目:[GWCTF 2019]pyre 日期:2023.5.4 题目:[ACTF新生赛2020]easyre 题目:DASCTF Apr.2023 X SU战队2023开 ...

最新文章

  1. myeclispse配置自己的jdk和tomcat
  2. jaxb-xjc.jar_使用xjc在一秒钟内生成您的JAXB类
  3. 收藏 | 来自微软大神的机器学习秘籍!
  4. Leetcode算法题(C语言)6--只出现一次的数字
  5. [C++] - 面向对象-图书管理系统
  6. PrimeNG01 angular集成PrimeNG
  7. ★LeetCode(202)——快乐数(JavaScript)
  8. MySql存储过程总结
  9. apache 伪静态转到nginx
  10. Android 应用程序模块: 应用, 任务, 进程, 和线程
  11. nc windows安装教程
  12. 华为鸿蒙系统os新机,鸿蒙OS今日面世,华为将出新机搭载新系统入市场
  13. 思科路由器虚拟服务器,解读CISCO路由器基本设置方法
  14. 解压文件时,系统找不到指定路径
  15. 技嘉Gigabyte主板Z370HD3安装1080ti+ubuntu17.10+Cuda9.1+cudnn7+tensorflow
  16. 硅谷一万清华人,为何打不过印度人?
  17. Vue实现超级简单的tab切换
  18. u盘安装成功计算机里找不到文件夹,u盘里文件夹不见了怎么办 u盘里文件夹不见了原因及解决方法...
  19. Android热更新五:四大热修复方案对比分析
  20. Matlab坐标轴操作

热门文章

  1. css特效实例——纯css实现带边角卷边阴影的纸
  2. 【计算机毕业设计】017学生公寓电费信息管理系统
  3. Vue 移动端项目 百度地图 点击事件无效、不触发 解决方案
  4. 百度离线地图APIV2.0
  5. 联想IBM服务器X3650M3之硬盘扩容
  6. 平衡小车PID,就该这么调!!!
  7. 硬件nat关闭还是开启_卡顿未必怪硬件,Win10玩游戏不可不知的技巧
  8. 实用的建筑企业工程项目管理软件系统
  9. Oracle数据库初学者入门教程
  10. ubuntu更新软件包命令_从Ubuntu命令行查看哪些更新的软件包可用