BUUCTF Re刷题记录
BUUCTF 逆向刷题记录
1.reverse_2
1.exeinfope查壳 ,无壳 64位
2.IDA64位打开查看主函数
看到最后,一个比较函数,比较字符串flag和s2,如果相等的话就可以获取flag
再往上看
可以用键盘r键将数字转换为字母,意思是,若flag=i/r,其就会被转化为数字1,双击flag跟进
即flag应该是{hacking_for_fun},改为{hack1ng_fo1_fun}即可
2.内涵的软件
运行一下,心里有个数
然后查壳:32位 无壳,IDA打开,
view–>open–>string ,点击跟进,TAB键
v6 = 5;
v5 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}";
while ( v6 >= 0 )
{
printf(&byte_4250EC, v6);
sub_40100A();
--v6;
}
printf(asc_425088);
v4[0] = 1;
scanf("%c", v4);
if ( v4[0] == 89 )
{
printf(aOd);
return sub_40100A();
}
else
{
if ( v4[0] == 78 )
printf(&byte_425034);
else
printf(&byte_42501C);
return sub_40100A();
}
}
结合题目,盲猜一波,flag**{49d3c93df25caad81232130f3d2ebfad}** √了
3.新年快乐
查壳;32位,有壳
upx自动脱壳
然后ida打开
strcpy:把HappyNewYear!复制给str2,输入str1进行比较,相等即正确,即str1应该为HappyNewYear!---->flag{HappyNewYear!}
4.xor
64位,无壳,ida64打开,找到main函数
memset(__b, 0, 0x100uLL);
printf("Input your flag:\n");
get_line(__b, 256LL);
if ( strlen(__b) != 33 )
goto LABEL_7;
for ( i = 1; i < 33; ++i )
__b[i] ^= __b[i - 1];
if ( !strncmp(__b, global, 0x21uLL) )
printf("Success");
else
LABEL_7:
printf("Failed");
return 0;
}
可知,要输入—b字符串,并且,长度为33才行,否则就输出Failed,从后往前看最后是要比较__b(此时的—b被进行了异或操作,两次异或等于没有异或,所以要写出异或脚本), global,让其相等,跟进一下globle
双击跟进
SHIFT+e提取数据
提取16进制和数字都可,
a = [ 0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F, ] # ida shift+e 提取16进制
s = 'f'
for i in range(1, len(a)):
s += chr(a[i] ^ a[i - 1])
print(s)
chr(i)函数的作用是 返回整数 i 所对应的 Unicode 字符。
---->flag{QianQiuWanDai_YiTongJiangHu}
5.helloword
apk文件,Android Killer打开,搜索一下flag
—>flag{7631a988259a00816deda84afb29430a}