buuctf通关6-7
xor
6.xor
用exeinfope查看可知文件是64位无壳
老样子,通过关键信息分析伪代码。
由代码可知,flag长度为33字节,第二个if语句为异或处理,global为flag异或后的结果。
找到global的值,再进行脚本修复。
得到flag。
代码步骤:1.区分十六进制数和字符串。
2.第一个f既是明文又是密文,直接在后面加上即可。
3.(isinstance用于判断变量类型),利用if语句和ord函数将变量值都变成整数进行异或运算。
4.用chr再转成字符,连接得到flag值。
7.helloworld
apk文件,确定题目为安卓逆向,使用工具jadx-gui进行反编译。
导航flag{,即可找到flag的内容信息。
PE头解析
1.DOS头:
WORD e_magic; 5A4D * "MZ标记" 用于判断是否为可执行文件
WORD e_cblp; 0090
WORD e_cp; 0003
WORD e_crlc; 0000
WORD e_cparhdr; 0004
WORD e_minalloc; 0000
WORD e_maxalloc; FFFF
WORD e_ss; 0000
WORD e_sp; 00B8
WORD e_csum; 0000
WORD e_ip; 0000
WORD e_cs; 0000
WORD e_lfarlc; 0040
WORD e_ovno; 0000
WORD e_res[4]; 00 00 00 00 00 00 00 00
WORD e_oemid; 0000
WORD e_oeminfo; 0000
WORD e_res2[10]; 20
LONG e_lfanew; 00 00 00 08 * PE头相对于文件的偏移,用于定位PE文件
2.标准PE头
WORD Machine; 8664 * 程序运行的CPU型号:0X0 任处理器/0x14c
WORD NumberOfSections; 000F * 文件中存在的节的总数,如果要新增节或者合并节就要修改这个值
DWORD TimeDateStamp; 65B65283
DWORD PointerToSymbolTable; 0000B800
DWORD NumberOfSymbols; 000004D5
WORD SizeOfOptionalHeader; 00F0
WORD Characteristics; 0027
3.可选PE头
WORD Magic; * 020B 说明文件类型:10B 32位下的PE文件 20B 64位下的
PE文件
BYTE MajorLinkerVersion; 02
BYTE MinorLinkerVersion; 1E
DWORD SizeOfCode; * 00001E00 所有代码节的和,必须是FileAlignment的整数倍
DWORD SizeOfInitializedData; * 00003A00 已初始化数据大小的和,必须是FileAlignment的整数倍
DWORD SizeOfUninitializedData; * 00000A00 未初始化数据大小的和,必须是
FileAlignment的整数倍
DWORD AddressOfEntryPoint; * 000014E0 程序入口
DWORD BaseOfCode; * 00001000 代码开始的基址
DWORD BaseOfData; * 00400000 数据开始的基址
DWORD ImageBase; * 00000000 内存镜像基址
DWORD SectionAlignment; * 00001000 内存对齐
DWORD FileAlignment; * 00000200 文件对齐
WORD MajorOperatingSystemVersion; 0004
WORD MinorOperatingSystemVersion; 0000
WORD MajorImageVersion; 0000
WORD MinorImageVersion; 0000
WORD MajorSubsystemVersion; 0005
WORD MinorSubsystemVersion; 0002
DWORD Win32VersionValue; 00000000
DWORD SizeOfImage; * 00017000 内存中整个PE文件的映射的尺寸,可以比实际的值大,但必须是SectionAlignment的整数倍
DWORD SizeOfHeaders; * 00000400 所有头+节表按照文件对齐后的大小,否则加载会出错
DWORD CheckSum; * 0001A97A 校验和,一些系统文件有要求.用来判断文件是否被修改.自己写的一般为0,把一个pe文件,两个字节里的值,两个字节两个字节循环加,存不下的自然溢出,能存多少存多少,防君子不防小人,是一个可修改的东西
WORD Subsystem; * 0003
WORD DllCharacteristics; 0000
DWORD SizeOfStackReserve; * 00200000 初始化时保留的堆栈大小
DWORD SizeOfStackCommit; * 00000000 初始化时实际提交的大小
DWORD SizeOfHeapReserve; * 00001000 初始化时保留的堆大小
DWORD SizeOfHeapCommit; * 00000000 初始化时实践提交的大小
DWORD LoaderFlags; 00100000
DWORD NumberOfRvaAndSizes; * 00000000 目录项数目