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