先用ida64打开tlc

buf = 0LL;
v10 = 0;
memset(&v8, 0, 0x400uLL);
memset(&s, 0, 0x400uLL);
printf("Please input key: ", a2, &s);
fflush(stdout);
read(0, &buf, 0xCuLL);
sub_401241((const char *)&buf);

——看到这个函数是对输入字符串进行rot13操作(核心语句:a1[v3] = (a1[v3] + 13) % (v4 + 26);)

sub_400EC7((__int64)&buf, (__int64)&s, 0xCuLL);

——这个函数是进行base64解码操作(因为有base64的三段式位移

v3 = 4 * (unsigned __int64)sub_400AAD(*(_BYTE *)(a1 + i));
*(_BYTE *)(a2 + v14) = v3 | ((signed int)(sub_400AAD(*(_BYTE *)(i + 1 + a1)) & 0x30) >> 4);
v4 = 16 * (unsigned __int64)sub_400AAD(*(_BYTE *)(i + 1 + a1));
*(_BYTE *)(v14 + 1 + a2) = v4 | ((unsigned __int8)sub_400AAD(*(_BYTE *)(i + 2 + a1)) >> 2);
v5 = (unsigned __int8)sub_400AAD(*(_BYTE *)(i + 2 + a1)) << 6;
*(_BYTE *)(v14 + 2 + a2) = v5 | (unsigned __int64)sub_400AAD(*(_BYTE *)(i + 3 + a1));

v3 = strlen(&s);
sub_4006B6((__int64)&s, v3);

——这里是一个判断函数,如果不满足条件则直接exit

v4 = 10 * v4 + *(_BYTE *)(i + a1) - 48;
if ( v4 % (i + 1) )
exit(1);
从形式上看,输入很可能是数字,因为每个输入的ascii码与“0”的相减,然后按位检查是否能够整除

v11 = malloc(0x108uLL);
v4 = strlen(&s);
sub_400877((__int64)v11, (__int64)&s, v4);——这里就是各种操作,只要能过判断函数,都能解得一个结果,就是看是否有意义而已
v5 = strlen(::s);
sub_400A1B((__int64)v11, (__int64)&v8, (__int64)::s, v5);
printf("Text is: %s\n", &v8);
return 0LL;

所以综上:首先输入然后rot13,然后base64解码,然后做了一个判断(高n位能被n整除),最后用输入作为密钥解密一段数据,得到flag。
Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Writeup请点击这里查看索引

查看所有Flag需要付费,需要获取所有Flag的童鞋请访问这里成为付费用户,可以自助把自己的注册邮箱加入网站白名单,即可免回复看到本站所有Flag

Flag大全地址:所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜,如果喜欢我的博客,愿意捐赠的,可以扫描下面的二维码

微信二维码:
支付宝二维码: