全国高校网安联赛--逆向篇

<–more–>

做出来的题目不多呢 后面还是靠着师傅们的帮忙才多做出来了一点 ** 六星一点活路都不给人留,顺便吐槽一下出题方,以后能不能自己先测试一下再放题阿,两个题有问题。
附上题目以及脚本(提取码:8b00)

签到题

真签到题 直接给flag好嘛。。。 对得起分数

ezpz

64分题是不是要告诉我有 base64
找到check函数

就应该base64encode 直接strcmp 查看res的值

解编码就能得到flag

Transformation

这个送分题也没谁了。。比ezpz还不如。。。
没记错的话这个好像就是flag

Androidbaby


输入字串a先与自己的角标异或,再与{ 13, 9, 6, 9, 93, 1, 14, 84, 9, 14, 6, 91, 10, 5, 89, 6, 28, 23, 69, 65 }分别异或
记{ 13, 9, 6, 9, 93, 1, 14, 84, 9, 14, 6, 91, 10, 5, 89, 6, 28, 23, 69, 65 }为b
for i in xrange(20):
ord(a[i])^i^b[i]
得到20个数字,通过(c[2i]-48)10+(c[2*i+1]-48)公式,得到10个数字

下面两题是汪师傅和Joke师傅做出来的

Babyfuscator


题如其名字 ,真是叫一个乱七八糟阿 每个字节都参与了运算。。。好复杂

通过动态调试以及其他的方法可以提取指令
拿到指令后 爆破一下就拿到flag了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  puts("The world is in chaos, time to show your real power:");
while ( v5 < 32 )
read(0, &v3[v5++], 1uLL);//get_input
v4 = 0;
game((__int64)v3);
}

void __fastcall __noreturn game(__int64 a1)
if ( v1 + 4239419545LL <= 0xFFFFFFFFLL )
{
if ( ((unsigned __int8)((((((((((((*(_BYTE *)(a1 + 31) ^ 8) + 7) ^ 0x2C) + 6) ^ 0x3C) + 3) ^ 0x17) + 8) ^ 0x30) + 6) ^ 0x3C)
+ 6) ^ 0x17) == 56 )
{
printf("Congratulations!The flag is %s\n", a1);
exit(0);
}

直接angr符号执行即可得到flag:
find=0x4020DF, avoid=0x4020FE

indirect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
题目以寄存器形式call
int __cdecl sub_401140(int a1)获取输入
{
void *v1; // ST08_4@1
int result; // eax@1

v1 = malloc(0xFu);
(*(void (__cdecl **)(_DWORD))(*(_DWORD *)a1 + 12))(**(_DWORD **)(a1 + 8));
(*(void (**)(const char *, ...))(*(_DWORD *)a1 + 16))("%s", v1);//get input
result = *(_DWORD *)(a1 + 4);
*(_DWORD *)(result + 8) = v1;
return result;
}

int __cdecl sub_4011D0(int a1)
{
int result; // eax@1
int v2; // ST04_4@5
int v3; // [sp+4h] [bp-14h]@1
signed int i; // [sp+8h] [bp-10h]@1

result = *(_DWORD *)(a1 + 4);
sub_4011D0 函数
v3 = *(_DWORD *)(result + 8);
for ( i = 0; i < 15; ++i )
{
if ( i + (signed __int16)(*(_BYTE *)(*(_DWORD *)(*(_DWORD *)(a1 + 8) + 16) + i) ^ *(_BYTE *)(i + v3) & 0xF) != *(_DWORD *)(**(_DWORD **)(a1 + 4) + 4 * i)
|| (signed __int16)(*(_BYTE *)(*(_DWORD *)(*(_DWORD *)(a1 + 8) + 20) + i) ^ (unsigned __int16)((signed int)*(_BYTE *)(i + v3) >> 4))
- i != *(_DWORD *)(*(_DWORD *)(*(_DWORD *)(a1 + 4) + 4) + 4 * i) )
{
(*(void (__cdecl **)(_DWORD))(*(_DWORD *)a1 + 12))(*(_DWORD *)(*(_DWORD *)(a1 + 8) + 16));
v2 = *(_DWORD *)(*(_DWORD *)(a1 + 8) + 16);
(*(void (__stdcall **)(_DWORD))(*(_DWORD *)a1 + 12))(0);
exit(0);
}
result = (*(int (__cdecl **)(_DWORD))(*(_DWORD *)a1 + 12))(*(_DWORD *)(*(_DWORD *)(a1 + 8) + 20));
}
return result;
}

按上述算法抠出对应的四个table即可,伪代码如下:
flag = ""
for i in range(15):
flag_tmp1 = (table1[i] ^ (table2[i]-i)) % 16
flag_tmp2 = (table3[i] ^ (table3[i]+i)) %16
flag += (flag_tmp1*16 + flag_tmp2)
print flag


坑爹的出题人。。 + 号 -号要换个位置才能得出可见字符

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 签到题
  2. 2. ezpz
  3. 3. Transformation
  4. 4. Androidbaby
  5. 5. Babyfuscator
  6. 6. indirect
,