re刷题第十天
0x00 easyre-153
这题无wp,别问我为什么没有,我可能下了个假的题目
0x01 notsequence
int __cdecl main()
{
_DWORD *v0; // eax
signed int v2; // [esp+14h] [ebp-Ch]
_DWORD *v3; // [esp+1Ch] [ebp-4h]
memset(&unk_8049BE0, 0, 0x4000u);
puts("input raw_flag please:");
v3 = &unk_8049BE0;
do
{
v0 = v3;
++v3;
scanf("%d", v0);
}
while ( *(v3 - 1) != 0 );
v2 = sub_80486CD(&unk_8049BE0);
if ( v2 == -1 )
{
printf("check1 not pass");
system("pause");
}
if ( sub_8048783(&unk_8049BE0, v2) ^ 1 )
{
printf("check2 not pass!");
exit(0);
}
if ( v2 == 0x14 )
{
puts("Congratulations! fl4g is :\nRCTF{md5(/*what you input without space or \\n~*/)}");
exit(0);
}
return 0;
}
这题说实话,main的逻辑还是很好理清楚的,里边的逻辑就得想一会儿了
很明显两个check
,首先就是让输入一堆数据,以0为输入的结尾。其实就是输入一个二十阶的杨辉三角。第一个check
是杨辉三角每一层的和的验证,加起来必须为2的n次方,第二个check
是前十九层的第n个数的和加起来等于第二十层的第n+1
个数,这个性质没注意到,这次学习了,上网找了个脚本稍微改了一下,就得到输入的序列,去掉最后的0,md5过后就是flag
ps:看了下网上师傅们说的,这题存在多解
#-*- coding: utf-8 -*-
flag = []
def triangle():
N = [1]
while True:
yield N
N.append(0)
N = [N[i]+N[i-1] for i in range(len(N))]
def print_triangle(x):
a = 0
for t in triangle():
print(t)
global flag
flag = flag + t
a += 1
if a ==x:
break
print_triangle(20)
print flag
0x02 secret-galaxy-300
额。。。。又一个不知道考什么知识点的题目
给了三个二进制程序,整体上都没什么算法可逆,大致来说三个一样,没办法,动态跟一下呗,结果内存中发现flag
。。又一个不知道考什么知识点的题目
给了三个二进制程序,整体上都没什么算法可逆,大致来说三个一样,没办法,动态跟一下呗,结果内存中发现flag