[GWCTF 2019]babyvm re
BABYVM
基于虚拟机操作的一个题 明面上的check函数和加密逻辑都是假的
操作码
重点分析这个vm
0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,
0x20, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00,
0xF2, 0xF1, 0xE4, 0x21, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,
0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x22, 0x00, 0x00, 0x00,
0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x23,
0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00, 0xF2,
0xF1, 0xE4, 0x24, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00,
0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x25, 0x00, 0x00, 0x00, 0xF1,
0xE1, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x26, 0x00,
0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00, 0xF2, 0xF1,
0xE4, 0x27, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08, 0x00, 0x00,
0x00, 0xF2, 0xF1, 0xE4, 0x28, 0x00, 0x00, 0x00, 0xF1, 0xE1,
0x09, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x29, 0x00, 0x00,
0x00, 0xF1, 0xE1, 0x0A, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,
0x2A, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0B, 0x00, 0x00, 0x00,
0xF2, 0xF1, 0xE4, 0x2B, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0C,
0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2C, 0x00, 0x00, 0x00,
0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2D,
0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00, 0xF2,
0xF1, 0xE4, 0x2E, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0F, 0x00,
0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x2F, 0x00, 0x00, 0x00, 0xF1,
0xE1, 0x10, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x30, 0x00,
0x00, 0x00, 0xF1, 0xE1, 0x11, 0x00, 0x00, 0x00, 0xF2, 0xF1,
0xE4, 0x31, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x12, 0x00, 0x00,
0x00, 0xF2, 0xF1, 0xE4, 0x32, 0x00, 0x00, 0x00, 0xF1, 0xE1,
0x13, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x33, 0x00, 0x00,
0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xF1,
0xE1, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x01, 0x00, 0x00,
0x00, 0xF2, 0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE1,
0x01, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00,
0xF2, 0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x02,
0x00, 0x00, 0x00, 0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00, 0xF2,
0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x03, 0x00,
0x00, 0x00, 0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00, 0xF2, 0xF1,
0xE4, 0x03, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x04, 0x00, 0x00,
0x00, 0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4,
0x04, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00,
0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00, 0xF2, 0xF1, 0xE4, 0x05,
0x00, 0x00, 0x00, 0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00, 0xF1,
0xE2, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x08, 0x00, 0x00,
0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6, 0xF7, 0xF1,
0xE4, 0x06, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x07, 0x00, 0x00,
0x00, 0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00, 0xF1, 0xE3, 0x09,
0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00, 0xF6,
0xF7, 0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x08,
0x00, 0x00, 0x00, 0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00, 0xF1,
0xE3, 0x0A, 0x00, 0x00, 0x00, 0xF1, 0xE5, 0x0C, 0x00, 0x00,
0x00, 0xF6, 0xF7, 0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00, 0xF1,
0xE1, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x13, 0x00, 0x00,
0x00, 0xF8, 0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00, 0xF1, 0xE7,
0x13, 0x00, 0x00, 0x00, 0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00,
0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00, 0xF8, 0xF1, 0xE4, 0x0E,
0x00, 0x00, 0x00, 0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00, 0xF1,
0xE1, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE2, 0x11, 0x00, 0x00,
0x00, 0xF8, 0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00, 0xF1, 0xE7,
0x11, 0x00, 0x00, 0x00, 0xF4
操作码 接下来分析对应含义
函数含义
0xF1
unsigned __int64 __fastcall sub_555555400B5F(__int64 a1)
{
int *v2; // [rsp+28h] [rbp-18h]
unsigned __int64 v3; // [rsp+38h] [rbp-8h]
v3 = __readfsqword(0x28u);
v2 = (*(a1 + 16) + 2LL);
switch ( *(*(a1 + 16) + 1LL) )
{
case 0xE1:
*a1 = *(sbb + *v2);
break;
case 0xE2:
*(a1 + 4) = *(sbb + *v2);
break;
case 0xE3:
*(a1 + 8) = *(sbb + *v2);
break;
case 0xE4:
*(sbb + *v2) = *a1;
break;
case 0xE5:
*(a1 + 12) = *(sbb + *v2);
break;
case 0xE7:
*(sbb + *v2) = *(a1 + 4);
break;
default:
break;
}
*(a1 + 16) += 6LL;
return __readfsqword(0x28u) ^ v3;
}
类似于move 取决于后面的
0XF2
//0XF2
unsigned __int64 __fastcall sub_555555400A64(__int64 a1)
{
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
*a1 ^= *(a1 + 4);
++*(a1 + 16);
return __readfsqword(0x28u) ^ v2;
}
异或xor
0XF5
//0xF5
unsigned __int64 __fastcall sub_555555400AC5(__int64 a1)
{
const char *buf; // [rsp+10h] [rbp-10h]
unsigned __int64 v3; // [rsp+18h] [rbp-8h]
v3 = __readfsqword(0x28u);
buf = sbb;
read(0, sbb, 0x20uLL);
dword_5555556022A4 = strlen(buf);
if ( dword_5555556022A4 != 21 )
{
puts("WRONG!");
exit(0);
}
++*(a1 + 16);
return __readfsqword(0x28u) ^ v3;
}
好像是个长度判断
0XF4
//0XF4
unsigned __int64 __fastcall sub_555555400956(__int64 a1)
{
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
++*(a1 + 16);
return __readfsqword(0x28u) ^ v2;
}
没啥用 nop
0XF7
//0XF7
unsigned __int64 __fastcall sub_555555400A08(__int64 a1)
{
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
*a1 *= *(a1 + 12);
++*(a1 + 16);
return __readfsqword(0x28u) ^ v2;
}
mul乘积
0XF8
0xF8
unsigned __int64 __fastcall sub_5555554008F0(int *a1)
{
int v2; // [rsp+14h] [rbp-Ch]
unsigned __int64 v3; // [rsp+18h] [rbp-8h]
v3 = __readfsqword(0x28u);
v2 = *a1;
*a1 = a1[1];
a1[1] = v2;
++*(a1 + 2);
return __readfsqword(0x28u) ^ v3;
}
swap 交换
0XF6
//0XF6
unsigned __int64 __fastcall sub_55555540099C(__int64 a1)
{
unsigned __int64 v2; // [rsp+18h] [rbp-8h]
v2 = __readfsqword(0x28u);
*a1 = *(a1 + 8) + 2 * *(a1 + 4) + 3 * *a1;
++*(a1 + 16);
return __readfsqword(0x28u) ^ v2;
}
一个函数
解析脚本
格式化一下
opca = [[0xF5],
[0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x20, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x21, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x02, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x22, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x23, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x24, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x25, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x26, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x27, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x08, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x28, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x09, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x29, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0A, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2A, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0B, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2B, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0C, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2C, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2D, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2E, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0F, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x2F, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x10, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x30, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x11, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x31, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x12, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x32, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x13, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x33, 0x00, 0x00, 0x00],
[0xF4],
[0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, ]
[0xF5],
[0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x01, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x00, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x01, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x02, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x01, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x02, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x03, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x02, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x03, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x04, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x03, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x04, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x05, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x04, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x05, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x06, 0x00, 0x00, 0x00],
[0xF2],
[0xF1, 0xE4, 0x05, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x06, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x07, 0x00, 0x00, 0x00],
[0xF1, 0xE3, 0x08, 0x00, 0x00, 0x00],
[0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00],
[0xF6],
[0xF7],
[0xF1, 0xE4, 0x06, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x07, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x08, 0x00, 0x00, 0x00],
[0xF1, 0xE3, 0x09, 0x00, 0x00, 0x00],
[0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00],
[0xF6],
[0xF7],
[0xF1, 0xE4, 0x07, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x08, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x09, 0x00, 0x00, 0x00],
[0xF1, 0xE3, 0x0A, 0x00, 0x00, 0x00],
[0xF1, 0xE5, 0x0C, 0x00, 0x00, 0x00],
[0xF6],
[0xF7],
[0xF1, 0xE4, 0x08, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0D, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x13, 0x00, 0x00, 0x00],
[0xF8],
[0xF1, 0xE4, 0x0D, 0x00, 0x00, 0x00],
[0xF1, 0xE7, 0x13, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0E, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x12, 0x00, 0x00, 0x00],
[0xF8],
[0xF1, 0xE4, 0x0E, 0x00, 0x00, 0x00],
[0xF1, 0xE7, 0x12, 0x00, 0x00, 0x00],
[0xF1, 0xE1, 0x0F, 0x00, 0x00, 0x00],
[0xF1, 0xE2, 0x11, 0x00, 0x00, 0x00],
[0xF8],
[0xF1, 0xE4, 0x0F, 0x00, 0x00, 0x00],
[0xF1, 0xE7, 0x11, 0x00, 0x00, 0x00],
[0xF4]]
for x in opca:
if x[0] == 0xF1:
if x[1] == 0xE1:
print(f"move e1 flag[{x[2]}]")
if x[1] == 0xE2:
print(f"move e2 flag[{x[2]}]")
if x[1] == 0xE3:
print(f"move e3 flag[{x[2]}]")
if x[1] == 0xE4:
print(f"move flag[{x[2]}] e1")
if x[1] == 0xE5:
print(f"move e4 flag[{x[2]}]")
if x[1] == 0xE7:
print(f"move flag[{x[2]}] e2")
elif x[0] == 0xf2:
print("xor e1 e2")
# elif x[0] == 0XF4:
# print("nop")
elif x[0] == 0xF5:
print("len")
elif x[0] == 0xF6:
print("mov e1 3*e1+2*e2+e3")
elif x[0] == 0xf7:
print("mul e1 e2")
elif x[0] == 0xf8:
print("swap e1 e2")
结果为
#一看第一段就是假的
read_len
move e1 flag[0]
xor e1 e2
move flag[32] e1
move e1 flag[1]
xor e1 e2
move flag[33] e1
move e1 flag[2]
xor e1 e2
move flag[34] e1
move e1 flag[3]
xor e1 e2
move flag[35] e1
move e1 flag[4]
xor e1 e2
move flag[36] e1
move e1 flag[5]
xor e1 e2
move flag[37] e1
move e1 flag[6]
xor e1 e2
move flag[38] e1
move e1 flag[7]
xor e1 e2
move flag[39] e1
move e1 flag[8]
xor e1 e2
move flag[40] e1
move e1 flag[9]
xor e1 e2
move flag[41] e1
move e1 flag[10]
xor e1 e2
move flag[42] e1
move e1 flag[11]
xor e1 e2
move flag[43] e1
move e1 flag[12]
xor e1 e2
move flag[44] e1
move e1 flag[13]
xor e1 e2
move flag[45] e1
move e1 flag[14]
xor e1 e2
move flag[46] e1
move e1 flag[15]
xor e1 e2
move flag[47] e1
move e1 flag[16]
xor e1 e2
move flag[48] e1
move e1 flag[17]
xor e1 e2
move flag[49] e1
move e1 flag[18]
xor e1 e2
move flag[50] e1
move e1 flag[19]
xor e1 e2
move flag[51] e1
#从这段开始是真的 直接逆
read_len
#下面三段都是异或
move e1 flag[0]
move e2 flag[1]
xor e1 e2
move flag[0] e1
move e1 flag[1]
move e2 flag[2]
xor e1 e2
move flag[1] e1
move e1 flag[2]
move e2 flag[3]
xor e1 e2
move flag[2] e1
move e1 flag[3]
move e2 flag[4]
xor e1 e2
move flag[3] e1
move e1 flag[4]
move e2 flag[5]
xor e1 e2
move flag[4] e1
move e1 flag[5]
move e2 flag[6]
xor e1 e2
move flag[5] e1
#下面三段都是相乘
move e1 flag[6]
move e2 flag[7]
move e3 flag[8]
move e4 flag[12]
mov e1 3*e1+2*e2+e3
mul e1 e4
move flag[6] e1
move e1 flag[7]
move e2 flag[8]
move e3 flag[9]
move e4 flag[12]
mov e1 3*e1+2*e2+e3
mul e1 e4
move flag[7] e1
move e1 flag[8]
move e2 flag[9]
move e3 flag[10]
move e4 flag[12]
mov e1 3*e1+2*e2+e3
mul e1 e4
move flag[8] e1
#下面三段都是交换
move e1 flag[13]
move e2 flag[19]
swap e1 e2
move flag[13] e1
move flag[19] e2
move e1 flag[14]
move e2 flag[18]
swap e1 e2
move flag[14] e1
move flag[18] e2
move e1 flag[15]
move e2 flag[17]
swap e1 e2
move flag[15] e1
move flag[17] e2
flag z3求解!
from z3 import *
flag = [0x69, 0x45, 0x2A, 0x37, 0x09, 0x17, 0xC5, 0x0B, 0x5C, 0x72,
0x33, 0x76, 0x33, 0x21, 0x74, 0x31, 0x5F, 0x33, 0x73, 0x72,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00]
flag[15], flag[17] = flag[17], flag[15]
flag[14], flag[18] = flag[18], flag[14]
flag[13], flag[19] = flag[19], flag[13]
#
# so = Solver()
# e1 = BitVec("e1", 8)
# e2 = BitVec("e2",8)
# e3 = BitVec("e3", 8)
# e4 = BitVec("e4", 8)
#
# so.add(e2 == 0x72)
# so.add(e3 == 0x33)
# so.add(e4 == 0x33)
# so.add((3 * e1 + 2 * e2 + e3) * e4 == 0x5C)
# print(so.check())
# print(so.model())
flag[8] = 95
#
# so = Solver()
# e1 = BitVec("e1", 8)
# e2 = BitVec("e2",8)
# e3 = BitVec("e3", 8)
# e4 = BitVec("e4", 8)
#
# so.add(e2 == flag[8])
# so.add(e3 == flag[9])
# so.add(e4 == flag[12])
# so.add((3 * e1 + 2 * e2 + e3) * e4== flag[7])
# print(so.check())
# print(so.model())
flag[7] = 51
so = Solver()
e1 = BitVec("e1", 8)
e2 = BitVec("e2", 8)
e3 = BitVec("e3", 8)
e4 = BitVec("e4", 8)
so.add(e2 == flag[7])
so.add(e3 == flag[8])
so.add(e4 == flag[12])
so.add((3 * e1 + 2 * e2 + e3) * e4 == flag[6])
print(so.check())
print(so.model())
flag[6] = 118
flag[5]^=flag[6]
flag[4]^=flag[5]
flag[3]^=flag[4]
flag[2]^=flag[3]
flag[1]^=flag[2]
flag[0]^=flag[1]
print(flag)
for x in flag:
print(chr(x),end="")
Y0u_hav3_r3v3rs3_1t!
[GWCTF 2019]babyvm re的更多相关文章
- 种子爆破&[GWCTF 2019]枯燥的抽奖
伪随机数的爆破,种子爆破 做到了一道题,就是有个伪随机数爆破的漏洞,当时尽管是看到了这两个敏感的函数,但是先去看其他的了,没有看到什么漏洞,所以我当时是准备直接强行爆破,之后看到使用伪随机数爆破的方式 ...
- [BJDCTF2020]Cookie is so stable && [GWCTF 2019]枯燥的抽奖
[BJDCTF2020]Cookie is so stable 进入环境后看到有hint,点击之后查看源代码 提示我们cookie有线索 flag页面是: 需要输入一个username,或许这道题目是 ...
- 刷题记录:[GWCTF 2019]枯燥的抽奖
目录 刷题记录:[GWCTF 2019]枯燥的抽奖 知识点 php伪随机性 刷题记录:[GWCTF 2019]枯燥的抽奖 题目复现链接:https://buuoj.cn/challenges 参考链接 ...
- [BUUCTF]REVERSE——[GWCTF 2019]xxor
[GWCTF 2019]xxor 附件 步骤: 无壳,64位ida载入 程序很简单,首先让我们输入一个字符串,然后进行中间部分的操作,最后需要满足44行的if判断,看一下sub_400770函数 得到 ...
- [BUUCTF]REVERSE——[GWCTF 2019]pyre
[GWCTF 2019]pyre 附件 步骤: 1.附件是pyc文件,用python打不开,百度后得知用python反编译工具打开,分享一个python反编译在线网站 反编译后是这段代码 #!/usr ...
- [GWCTF 2019]re3 wp
[GWCTF 2019]re3 关键点:AES MD5 动态调试 smc自解密 gdb使用 跟进main函数 发现一个典型smc异或自解密 可以用idc脚本 或者python patch 或者动态调试 ...
- [GWCTF 2019]mypassword
这道题(不只这道题以后也一定)要注意控制台中的信息,给出了login.js代码,会把当前用户的用户名和密码填入表单 注册个账号,登录之后给提示不是注入题 浏览一下网站功能,feedback页面可以提交 ...
- [GWCTF 2019]枯燥的抽奖
0x00 知识点 种子爆破 工具 http://www.openwall.com/php_mt_seed 0x01 解题 查看源码进入check.php zOHF0Cxp49 <?php #这不 ...
- GWCTF 2019]我有一个数据库
0x00 知识点 phpMyadmin(CVE-2018-12613)后台任意文件包含漏洞 影响版本:4.8.0--4.8.1 payload:/phpmyadmin/?target=db_datad ...
随机推荐
- 对飞猪H5端API接口sign签名逆向实验
免责声明 本文章所提到的技术仅用于学习用途,禁止使用本文章的任何技术进行发起网络攻击.非法利用等网络犯罪行为,一切信息禁止用于任何非法用途.若读者利用文章所提到的技术实施违法犯罪行为,其责任一概由读者 ...
- idea 个人settings和好看的主题推荐
idea 个人settings和好看的主题推荐 配置和主体搭配使用,效果最佳!!! 配置文件: 链接:https://pan.baidu.com/s/1K-oW9UNxUz_5XWz4Ru3_3w ...
- #pragma pack() -----设置默认对齐数
#pragma pack() -----设置默认对齐数 预处理命令#pragma:程序如下 则根据修改的对齐数来算:则需要占据内存的大小是14 如果不进行设置,则按照编译器默认的对齐数来算:则需要占 ...
- 《剑指offer》面试题30. 包含min函数的栈
问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinStack minSt ...
- 【刷题-LeetCode】207. Course Schedule
Course Schedule There are a total of numCourses courses you have to take, labeled from 0 to numCours ...
- IPV4地址,子网掩码,子网划分
转载自https://blog.csdn.net/qq_45108415/article/details/114179407
- nginx的fastcgi配置
首先参考了一份配置注释(来自"小刚的博客"): #运行用户 user www-data; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错 ...
- 根据SVG Arc求出其开始角、摆动角和椭圆圆心
SVG Arc 目前Svg的Arc的参数字符串如下: a rx ry x-axis-rotation large-arc-flag sweep-flag x y 除了a表示标识为Arc之外,其余参数说 ...
- Autofac实现拦截器和切面编程
Autofac.Annotation框架是我用.netcore写的一个注解式DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成. 开源地址:h ...
- 用Python实现一个Picgo图床工具
PyPicGo PyPicGo 是一款图床工具,是PicGo是Python版实现,并支持各种插件自定义插件,目前PyPicGo自带了gitee.github.SM.MS和七牛云图传,以及rename. ...