一,何须相思煮余年
0x55 0x8b 0xec 0x81 0xec 0xa8 0x0 0x0 0x0 0xa1 0x0 0x40 0x41 0x0 0x33 0xc5 0x89 0x45 0xfc 0x68 0x9c 0x0 0x0 0x0 0x6a 0x0 0x8d 0x85 0x60 0xff 0xff 0xff 0x50 0xe8 0x7a 0xc 0x0 0x0 0x83 0xc4 0xc 0xc7 0x85 0x58 0xff 0xff 0xff 0x27 0x0 0x0 0x0 0xc7 0x85 0x5c 0xff 0xff 0xff 0x0 0x0 0x0 0x0 0xeb 0xf 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x83 0xc1 0x1 0x89 0x8d 0x5c 0xff 0xff 0xff 0x83 0xbd 0x5c 0xff 0xff 0xff 0x27 0xf 0x8d 0xed 0x0 0x0 0x0 0x8b 0x95 0x5c 0xff 0xff 0xff 0x81 0xe2 0x3 0x0 0x0 0x80 0x79 0x5 0x4a 0x83 0xca 0xfc 0x42 0x85 0xd2 0x75 0x25 0x8b 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8c 0x85 0x60 0xff 0xff 0xff 0x3 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x95 0x5c 0xff 0xff 0xff 0x89 0x8c 0x95 0x60 0xff 0xff 0xff 0xe9 0xac 0x0 0x0 0x0 0x8b 0x85 0x5c 0xff 0xff 0xff 0x25 0x3 0x0 0x0 0x80 0x79 0x5 0x48 0x83 0xc8 0xfc 0x40 0x83 0xf8 0x1 0x75 0x22 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x94 0x8d 0x60 0xff 0xff 0xff 0x2b 0x95 0x5c 0xff 0xff 0xff 0x8b 0x85 0x5c 0xff 0xff 0xff 0x89 0x94 0x85 0x60 0xff 0xff 0xff 0xeb 0x73 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x81 0xe1 0x3 0x0 0x0 0x80 0x79 0x5 0x49 0x83 0xc9 0xfc 0x41 0x83 0xf9 0x2 0x75 0x23 0x8b 0x95 0x5c 0xff 0xff 0xff 0x8b 0x84 0x95 0x60 0xff 0xff 0xff 0xf 0xaf 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8d 0x5c 0xff 0xff 0xff 0x89 0x84 0x8d 0x60 0xff 0xff 0xff 0xeb 0x38 0x8b 0x95 0x5c 0xff 0xff 0xff 0x81 0xe2 0x3 0x0 0x0 0x80 0x79 0x5 0x4a 0x83 0xca 0xfc 0x42 0x83 0xfa 0x3 0x75 0x20 0x8b 0x85 0x5c 0xff 0xff 0xff 0x8b 0x8c 0x85 0x60 0xff 0xff 0xff 0x33 0x8d 0x5c 0xff 0xff 0xff 0x8b 0x95 0x5c 0xff 0xff 0xff 0x89 0x8c 0x95 0x60 0xff 0xff 0xff 0xe9 0xf7 0xfe 0xff 0xff 0x33 0xc0 0x8b 0x4d 0xfc 0x33 0xcd 0xe8 0x4 0x0 0x0 0x0 0x8b 0xe5 0x5d 0xc3
enc = [88,88,134,87,74,118,318,101,59,92,480,60,65,41,770,110,73,31,918,39,120,27,1188,47,77,24,1352,44,81,23,1680,46,85,15,1870,66,91,16,4750]
txt文件,一大串数据,应该是机器码,首先想着肯定先机器码变汇编代码
要先转换成:
55 8B EC 81 EC A8 00 00 00 A1 00 40 41 00 33 C5 89 45 FC 68 9C 00 00 00 6A00 8D 85 60 FF FF FF 50 E8 7A 0C 00 00 83 C4 0C C7 85 58 FF FF FF 27 00 0000 C7 85 5C FF FF FF 00 00 00 00 EB 0F 8B 8D 5C FF FF FF 83 C1 01 89 8D 5CFF FF FF 83 BD 5C FF FF FF 27 0F 8D ED 00 00 00 8B 95 5C FF FF FF 81 E2 0300 00 80 79 05 4A 83 CA FC 42 85 D2 75 25 8B 85 5C FF FF FF 8B 8C 85 60 FFFF FF 03 8D 5C FF FF FF 8B 95 5C FF FF FF 89 8C 95 60 FF FF FF E9 AC 00 0000 8B 85 5C FF FF FF 25 03 00 00 80 79 05 48 83 C8 FC 40 83 F8 01 75 22 8B8D 5C FF FF FF 8B 94 8D 60 FF FF FF 2B 95 5C FF FF FF 8B 85 5C FF FF FF 8994 85 60 FF FF FF EB 73 8B 8D 5C FF FF FF 81 E1 03 00 00 80 79 05 49 83 C9FC 41 83 F9 02 75 23 8B 95 5C FF FF FF 8B 84 95 60 FF FF FF 0F AF 85 5C FFFF FF 8B 8D 5C FF FF FF 89 84 8D 60 FF FF FF EB 38 8B 95 5C FF FF FF 81 E203 00 00 80 79 05 4A 83 CA FC 42 83 FA 03 75 20 8B 85 5C FF FF FF 8B 8C 8560 FF FF FF 33 8D 5C FF FF FF 8B 95 5C FF FF FF 89 8C 95 60 FF FF FF E9 F7FE FF FF 33 C0 8B 4D FC 33 CD E8 04 00 00 00 8B E5 5D C3
有一个在线网站:Online x86 and x64 Intel Instruction Assembler (defuse.ca)
不是特别好看,想想还能不能转换成高级语言。
看别人wp:010 Editor 打开,把上面整理的字节码全部复制到十六进制文件里,保存之后使用IDA打开 。先全选强制分析,但有很多爆红,先不管直接变函数,但不太对。别人的好像是直接成功了,悲(,不知道哪里出问题了,重新来一遍。
别人的:
别人的好像是二进制文件,我的是十六进制文件,可能是这个问题吧。
二,今夕是何年
说运行起来就给flag
装qemu可以跑,试试,装好了,真的出flagl
sudo apt install libc6-riscv64-cross
sudo apt install binutils-riscv64-linux-gnu
sudo apt install gcc-riscv64-linux-gnu
sudo apt install binutils-riscv64-unknown-elf
sudo apt install gcc-riscv64-unknown-elf
sudo apt install qemu-system-misc
sudo apt install qemu-user
若出现“/lib/ld-linux-riscv64-lp64d.so.1”报错
则再终端输入‘sudo cp /usr/riscv64-linux-gnu/lib/* /lib/’就可以了,因为文件下载的地方,和查
找的地方不一样,只要把文件cp一下就可以了
三,easy language
cmd窗口:拒绝访问。
提示是易语言的,拖进ida试试,不能分析。
看wp要加个插件。
IDA进行逆向得知,原来hexray在生成伪代码的时候会调用一个calc_c_cpp_name
函数,该函数会试图针对C/C++的函数名称进行优化,结果却误伤中文字符,我们将此处代码给NOP掉,就可以了。
ctrl+3可以换出插件窗口。
得到了一个新程序
在字符串窗口,找到关键信息的位置, 发现是红的,全选然后按P
得到关键函数
int sub_4015CC()
{
void *v0; // eax
void *v1; // eax
_DWORD *v2; // eax
unsigned int v3; // ecx
int v4; // ebx
int v5; // eax
int result; // eax
_BYTE *v7; // [esp-8h] [ebp-24h]
void *v8; // [esp-4h] [ebp-20h]
void *v9; // [esp+0h] [ebp-1Ch]
LPVOID v10; // [esp+4h] [ebp-18h] BYREF
LPVOID v11; // [esp+8h] [ebp-14h] BYREF
LPVOID v12; // [esp+Ch] [ebp-10h] BYREF
LPVOID lpMem; // [esp+10h] [ebp-Ch] BYREF
LPVOID v14; // [esp+14h] [ebp-8h]
LPVOID v15; // [esp+18h] [ebp-4h] BYREF
v15 = 0;
v14 = 0;
v0 = (void *)sub_40937A(1375797348, (LPCSTR)0x16010066, 8, -1);
lpMem = v0;
if ( !v0 )
v0 = &unk_4A41DB;
v12 = (LPVOID)sub_40936E(1, (char)v0, 0, -2147483644);
if ( lpMem )
free(lpMem);
v11 = 0;
v10 = "AES-ECB";
v9 = (void *)sub_401975(&v12, &dword_59D0F0, &v10, 1, 7, 1, &v11, 0);
if ( v12 )
free(v12);
if ( v10 )
free(v10);
if ( v11 )
free(v11);
if ( v15 )
free(v15);
v15 = v9;
lpMem = sub_403E67((int)&v15);
v8 = lpMem;
if ( v14 )
free(v14);
v14 = v8;
LOBYTE(v1) = (_BYTE)v8;
if ( !v8 )
v1 = &unk_4A41DB;
v2 = (_DWORD *)sub_40936E(1, (char)v1, 0, -2147483644);
lpMem = v2;
v3 = 0;
if ( v2 )
v3 = v2[1];
v7 = v2 + 2;
v4 = 0;
if ( dword_59D0F4 )
v4 = *((_DWORD *)dword_59D0F4 + 1);
v5 = 1;
if ( v4 == v3 )
{
v5 = 0;
if ( v3 )
v5 = strlen((_BYTE *)dword_59D0F4 + 8, v7, v3);
}
v12 = (LPVOID)(v5 == 0);
if ( lpMem )
free(lpMem);
if ( v12 )
{
lpMem = (LPVOID)sub_40937A(1375797348, (LPCSTR)0x16010066, 8, -1);
v12 = (LPVOID)sub_404471((int)&lpMem);
if ( lpMem )
free(lpMem);
if ( v12 == (LPVOID)29 )
result = sub_409374((HWND)0x52010064, (LPCSTR)0x16010065, 8, -1, "real?!", 0);
else
result = sub_409374((HWND)0x52010064, (LPCSTR)0x16010065, 8, -1, "E++ is so easy!", 0);
}
else
{
result = sub_409374((HWND)0x52010064, (LPCSTR)0x16010065, 8, -1, byte_4A41FB, 0);
}
if ( v15 )
result = free(v15);
if ( v14 )
return free(v14);
return result;
}
很多函数不认识,烦(,
据wp说是AES-ECB和basse64。
不对,可以:
得到关键函数,但太丑了。尽是sub_地址,下来搜搜看。
也附上别人的脚本
from crypto.Cipher import AES
import base64
# 给定的字节串 byte_string
byte_string = b'E\x9c\xbf\xcdQ\x160\x9cAZ\t\xbc\xc2\x84\x08<\xc7n\x97e\x8a\xf9\xd6\xb3U\x9c\xcf\xb3\x06\x80i\xde\x0c\x9a\xf7r\xfdA\x05\xe9\x15\x18\xa7\xd4\x917\xde\xfc\xb1'
# 将字节串转换为整数
integer_value = int.from_bytes(byte_string, byteorder='big')
# 将整数拆分为三个部分,每部分包含16个字节
first_part_integer = integer_value >> 256
second_part_integer = (integer_value >> 128) & ((1 << 128) - 1)
third_part_integer = integer_value & ((1 << 128) - 1)
# 将每个部分转换回字节串
first_part_bytes = first_part_integer.to_bytes(16, byteorder='big')
second_part_bytes = second_part_integer.to_bytes(16, byteorder='big')
third_part_bytes = third_part_integer.to_bytes(16, byteorder='big')
# 打印结果
print("第一部分:", first_part_bytes)
print("第二部分:", second_part_bytes)
print("第三部分:", third_part_bytes)
# 根据动态调试找到的密钥
key = b'welcometoxyctf!!'
# 创建 AES 解密器
cipher = AES.new(key, AES.MODE_ECB)
# 解密每个部分
part1 = cipher.decrypt(first_part_bytes)
part2 = cipher.decrypt(second_part_bytes)
part3 = cipher.decrypt(third_part_bytes)
# 打印解密结果
print("成功解出flag 第一部分:", part1)
print("成功解出flag 第二部分:", part2)
print("成功解出flag 第三部分:", part3)
print("flag是:", part1 + part2 + part3)