[WUSTCTF2020]Cr0ssfun
查壳
64位ELF文件

反编译

分析可以知道将V4转化为64位整数类型,进入check函数,check函数的返回值被转化为unsigned int 类,如果返回值为1,输出Your flag is correct, go and submit it!
跟进check函数

继续跟进就ok了






按照下标将他们组合起来就得到flagctf2020{cpp_@nd_r3verse_@re_fun}
脚本
感觉我做的好麻烦,去网上看看,同样很麻烦,顺了个没啥用的脚本
1 | #include<iostream> |
[UTCTF2020]basic-re
查壳
64位无壳文件

关键信息&反编译
shift+F12查找字符串发现好多关键词,进去看看
得到mTyqm7wjODkrNLcWl0eqO8K8gc1BPk1GNLgUpI==
base64Encode( )进去看看吧

base编码过程,从其中找到编码表

AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0987654321/+

解密
把他们扔进CyberChef

[GWCTF 2019]xxor
查壳
64位ELF文件

查找关键信息
shift+F12查找关键字Congratulation!点进去看看吧

反编译
主要函数
sub_400770(v7, a2) = 1输出成功信息
LODWORD(v7[j]) = dword_601078;用于提取一个 64 位变量的低 32 位HIDWORD(v7[j]) = dword_60107C;用于提取一个 64 位变量的高 32 位

深入sub_400686函数,发现只要获得其中需要的数据就可以逆向得到答案

这是那个判断函数,从中就可以获得上面需要的信息

用前几天学过的z3
1 | from z3 import * |
解密 ,然后再十六进制转化成字符串,得到flag
1 | #include <stdio.h> |
文件格式
1. ELF(Executable and Linkable Format)
- 使用平台:Linux、Unix、类Unix系统(如FreeBSD、Android)。
- 特点:
- 支持多种架构(如x86、ARM、RISC-V)。
- 支持动态链接和静态链接。
- 结构清晰,包含ELF头、程序头表、节头表。
- 常用于可执行文件、共享库(.so)、目标文件(.o)和核心转储。
- 工具:
readelf、objdump、nm。 - 文件扩展名:
.elf、.so、.o。
2. PE(Portable Executable)
- 使用平台:Windows。
- 特点:
- 基于COFF(Common Object File Format)扩展。
- 支持32位(PE32)和64位(PE32+)。
- 包含DOS头、PE头、节表、导入表、导出表等。
- 支持动态链接(DLL文件)和资源管理(如图标、菜单)。
- 工具:
dumpbin、PEview、CFF Explorer。 - 文件扩展名:
.exe、.dll、.sys。
3. Mach-O(Mach Object)
- 使用平台:macOS、iOS。
- 特点:
- 支持多种架构(如x86、ARM)。
- 包含Mach-O头、加载命令、段和节。
- 支持动态链接(dylib)和框架(Framework)。
- 支持代码签名和沙盒机制。
- 工具:
otool、nm、lipo。 - 文件扩展名:
.o、.dylib、.app。
1. 提取特定位
通过掩码操作,可以从数据中提取特定位。例如,提取一个字节的低4位:
1 | byte = 0b10101100 |
2. 设置特定位
掩码操作可以设置数据中的特定位。例如,设置一个字节的第3位:
1 | byte = 0b10101100 |
3. 清除特定位
掩码操作可以清除数据中的特定位。例如,清除一个字节的第5位:
1 | byte = 0b10101100 |
4. 切换特定位
掩码操作可以切换数据中的特定位。例如,切换一个字节的第2位:
1 | byte = 0b10101100 |
5. 检查特定位
掩码操作可以检查数据中的特定位是否被设置。例如,检查一个字节的第7位:
python
复制
1 | byte = 0b10101100 |
6. 组合掩码
多个掩码可以组合使用。例如,提取一个字节的第2位和第4位:
1 | byte = 0b10101100 |
7. 移位操作
移位操作常与掩码操作结合使用。例如,提取一个32位整数的第5到第8位:
1 | value = 0x12345678 |
Std库
1. 容器(Containers)
用于存储和管理数据的模板类,分为:
- 顺序容器:按顺序存储元素。
vector:动态数组。list:双向链表。deque:双端队列。array:固定大小数组(C++11)。forward_list:单向链表(C++11)。
- 关联容器:基于键值对的有序/无序集合。
set/multiset:有序唯一/重复集合。map/multimap:有序键值对。unordered_set/unordered_multiset:哈希表实现的集合(C++11)。unordered_map/unordered_multimap:哈希表实现的键值对(C++11)。
- 容器适配器:基于其他容器实现的接口。
stack:后进先出(LIFO)栈。queue:先进先出(FIFO)队列。priority_queue:优先级队列。
1 | #include <vector> |
2. 算法(Algorithms)
提供通用算法,通过 <algorithm> 头文件访问:
- 非修改序列操作:
for_each,find,count。 - 修改序列操作:
copy,fill,replace。 - 排序和查找:
sort,binary_search,lower_bound。 - 数值操作:
accumulate,inner_product(需<numeric>)。
1 | #include <algorithm> |
3. 字符串处理(Strings)
std::string:动态字符串类,支持拼接、查找、替换等操作。std::string_view:字符串视图(C++17),用于高效读取字符串片段。
1 | std::string s = "Hello"; |
4. 输入/输出(I/O)
通过 <iostream>、<fstream> 等头文件提供:
- 流对象:
std::cin,std::cout,std::cerr,std::clog。 - 文件操作:
std::ifstream,std::ofstream。 - 格式化工具:
std::hex,std::setw,std::fixed(需<iomanip>)。
1 | #include <iostream> |
5. 智能指针(Smart Pointers)
用于自动内存管理(需 <memory>):
std::unique_ptr:独占所有权的指针。std::shared_ptr:共享所有权的指针。std::weak_ptr:解决shared_ptr循环引用问题。
1 | auto ptr = std::make_unique<int>(42); |
6. 工具类与函数(Utilities)
- 元编程:
std::pair,std::tuple,std::variant(C++17)。 - 类型操作:
std::move(移动语义),std::forward(完美转发)。 - 时间和日期:
std::chrono(需<chrono>)。 - 随机数生成:
std::mt19937(需<random>)。
1 | std::pair<int, std::string> p = {1, "one"}; |
7. 多线程与并发(Concurrency)
通过 <thread>, <mutex>, <atomic> 等头文件支持:
- 线程管理:
std::thread,std::jthread(C++20)。 - 同步机制:
std::mutex,std::lock_guard,std::condition_variable。 - 原子操作:
std::atomic<T>。
1 | #include <thread> |
8. 异常处理(Exceptions)
- 异常类:
std::exception及其子类(如std::runtime_error)。 - 异常工具:
std::throw_with_nested(C++11)。
1 | try { |
9. 其他重要组件
- 函数对象:
std::function(包装函数指针、Lambda 等)。 - 正则表达式:
std::regex(需<regex>)。 - 文件系统操作:
std::filesystem(C++17,需<filesystem>)。
1 | #include <functional> |