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. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  2. 初识python:格式化输出

    使用input函数输入用户值,再使用三种方法格式化输出. #!/user/bin env python # author:Simple-Sir # 20180831 # 格式化输出: name = i ...

  3. quasar框架在store中使用router跳转页面报错

    网上一通百度,终于在这篇博客中找到原因.  https://www.cnblogs.com/remly/p/12995936.html 原因是: 在router中导出了一个工厂函数, 既然是一个函数, ...

  4. spring boot + redis --- 心得

    1.前言 习惯使用springMVC 配置 redis ,现在使用spring boot ,得好好总结怎么在spring boot 配置和使用 ,区别真的挺大的. 2.环境 spring boot  ...

  5. wget 工具使用

    wget http://xxxx 下载文件到当前文件夹 wget -V 显示wget的版本信息并退出 wget -v 打印详细信息 默认 wget -nv 关闭详细输出,但不进入安静模式 wget - ...

  6. Java语言学习案例雷霆战机

    1.Java雷霆战机学习笔记(一)-资源加载 https://www.toutiao.com/i6631331313259381255/ 2.Java雷霆战机学习笔记(二)-音乐播放 https:// ...

  7. Jeesite富文本编辑框ckeditor显示错误

    Jeesite富文本编辑框ckeditor显示错误 原文链接:https://www.toutiao.com/i6485135618190869005/ Jeesite中Control都会继承一个Ba ...

  8. 【Maven】maven 插件开发实战

    前言 众所周知,maven 实质上是一个插件执行框架,所有的工作都是通过插件完成的.包括我们日常使用到的类似 install.clean.deploy.compiler...这些命令,其实底层都是一个 ...

  9. JAVA并发-AQS知识笔记

    概述 AQS是AbstractQueuedSynchronizer的缩写,翻译成中文就是抽象队列同步器,AbstractQueuedSynchronizer这个类也是在java.util.concur ...

  10. Android过时方法替代

    managedQuery替换为cursorLoader example: uri = data.getData(); String[] proj = {MediaStore.Images.Media. ...