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的更多相关文章

  1. 种子爆破&[GWCTF 2019]枯燥的抽奖

    伪随机数的爆破,种子爆破 做到了一道题,就是有个伪随机数爆破的漏洞,当时尽管是看到了这两个敏感的函数,但是先去看其他的了,没有看到什么漏洞,所以我当时是准备直接强行爆破,之后看到使用伪随机数爆破的方式 ...

  2. [BJDCTF2020]Cookie is so stable && [GWCTF 2019]枯燥的抽奖

    [BJDCTF2020]Cookie is so stable 进入环境后看到有hint,点击之后查看源代码 提示我们cookie有线索 flag页面是: 需要输入一个username,或许这道题目是 ...

  3. 刷题记录:[GWCTF 2019]枯燥的抽奖

    目录 刷题记录:[GWCTF 2019]枯燥的抽奖 知识点 php伪随机性 刷题记录:[GWCTF 2019]枯燥的抽奖 题目复现链接:https://buuoj.cn/challenges 参考链接 ...

  4. [BUUCTF]REVERSE——[GWCTF 2019]xxor

    [GWCTF 2019]xxor 附件 步骤: 无壳,64位ida载入 程序很简单,首先让我们输入一个字符串,然后进行中间部分的操作,最后需要满足44行的if判断,看一下sub_400770函数 得到 ...

  5. [BUUCTF]REVERSE——[GWCTF 2019]pyre

    [GWCTF 2019]pyre 附件 步骤: 1.附件是pyc文件,用python打不开,百度后得知用python反编译工具打开,分享一个python反编译在线网站 反编译后是这段代码 #!/usr ...

  6. [GWCTF 2019]re3 wp

    [GWCTF 2019]re3 关键点:AES MD5 动态调试 smc自解密 gdb使用 跟进main函数 发现一个典型smc异或自解密 可以用idc脚本 或者python patch 或者动态调试 ...

  7. [GWCTF 2019]mypassword

    这道题(不只这道题以后也一定)要注意控制台中的信息,给出了login.js代码,会把当前用户的用户名和密码填入表单 注册个账号,登录之后给提示不是注入题 浏览一下网站功能,feedback页面可以提交 ...

  8. [GWCTF 2019]枯燥的抽奖

    0x00 知识点 种子爆破 工具 http://www.openwall.com/php_mt_seed 0x01 解题 查看源码进入check.php zOHF0Cxp49 <?php #这不 ...

  9. GWCTF 2019]我有一个数据库

    0x00 知识点 phpMyadmin(CVE-2018-12613)后台任意文件包含漏洞 影响版本:4.8.0--4.8.1 payload:/phpmyadmin/?target=db_datad ...

随机推荐

  1. 硬核 - Java 随机数相关 API 的演进与思考(上)

    本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算 ...

  2. v4l2数据获取流程

    V4L2数据获取流程 整个过程相关的数据结构有如下几个: struct v4l2_capability m_cap; /* 驱动能力 */ struct v4l2_format m_fmt; /* 数 ...

  3. Kong 微服务网关在 Kubernetes 的实践

    来源:分布式实验室译者:qianghaohao本文主要介绍将 Kong 微服务网关作为 Kubernetes (https://www.alauda.cn)集群统一入口的最佳实践,之前写过一篇文章使用 ...

  4. 2018HPU暑期集训第四次积分训练赛 K - 方框 题解(图形打印)

    思路分析:题目已经明确透露了这道题的解法:就是画框.当 输入的边长  的话,就表示可以在内层继续嵌套一个方框.废话就不多说了,直接上代码吧! 代码如下: #include <iostream&g ...

  5. 基本的sql语法

    1. SELECT: 用于从数据库中选取数据 SELECT name,value FROM table_name 2.SELECT DISTINCT 语句用于返回唯一不同的值(去重) 3.WHERE ...

  6. VUE3 之 表单元素

    1. 概述 老话说的好:行动起来,原地观望是没有用的. 言归正传,今天我们来聊聊 VUE3 的 表单元素. 2. 表单元素 2.1 文本框与数据绑定 <body> <div id=& ...

  7. 【系统学习ES6】第二节:解构赋值

    [系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握,希望大家有所收获. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.解构是一种打 ...

  8. 龙芯 3A4000 安装 Debian10 (via debootstrap)

    由于一些原因,Debian 的内核不能直接在龙芯的 cpu 上使用.据悉 Linux 5.7 kernel 改进了对龙芯的支持,不久的将来我们应该就能更愉快地在龙芯上运行 Debian 了. 感谢龙芯 ...

  9. winform 中心旋转 图片旋转

    //设置左上角到中心点 g.TranslateTransform(int.Parse(x), int.Parse(y)); //旋转角度 g.RotateTransform(int.Parse(&qu ...

  10. 解决Post请求中文乱码问题

    解决Post请求中文乱码问题 req.setChracterEncoding()要在获取请求参数前调用才有效,不然还是乱码