Java层逻辑比较简单,就是调用so里面的getflag代码进行判断,返回‘1’就成功,直接分析so文件,发现里面有2个可疑的函数check和en,其实根据参数很容易判断出来,getflag函数就是IDA里面的en函数,其实看代码可以发现,en函数里面的一部分代码就是check函数,而且把check函数抠出来,单独跑功能就是比较两个字符串是否相等,从而返回‘1’或者‘0’。所以重要的是en函数。

西普CTF-lol-以夕阳落款

en函数的代码是经过控制流混淆的,乍一看特别乱,如下:

西普CTF-lol-以夕阳落款

但是由于找到了里面存在check函数代码,其实思路也简单,应该就是将输入字符串经过处理,然后check一下,由于里面的运算很少,逻辑是很简单的,所以先理清楚控制流逻辑,将算法还原。

为了找到控制流,我将代码抠出来,在每个重要的运算或者判断前面加上log标志,然后修改部分代码,让其成为正常的c程序, 如下:

西普CTF-lol-以夕阳落款

说明:1和4都是运算逻辑,2和6都是判断逻辑

构造输入,看输出信息,如下:

西普CTF-lol-以夕阳落款

可以看到流程,前面三个走了1,后面依次是2-6-1循环,由于有条指令不确定,但是其结果只能是0或者1,如下,所以两种都试下:

西普CTF-lol-以夕阳落款

结果就是将前面的1替换成4,据此就看看出流程了,

for i in range(24):
         if i < 3:
                   do 1 或者4
         else:
                   判断 2和6
                   do 1或者 4

完整的python代码如下:

__author__ = "pxx"
sign = 1
aNzRol68hviis8q = [ord(c) for c in "NZ@rol68hViIs8qlX~7{6m&t"];
val_list = []
v30 = range(24)
for index in range(24):
         for ch_t in range(256):
                   v30[index] = ch_t
                   v13 = 0
                   if index < 3:
                            if sign == 1:
                                     v13 = (v30[index] & 0x26 | ~v30[index] & 0xD9) ^ 0xDE;
                            else:
                                     v13 = (v30[index] & 0xF6) | ~v30[index] & 9;
                   else:
                            if v30[index] < ord('A') or v30[index] > ord('Z'):
                                     if sign == 1:
                                               v13 = (v30[index] & 0x26 | ~v30[index] & 0xD9) ^ 0xDE;
                                     else:
                                               v13 = (v30[index] & 0xF6) | ~v30[index] & 9;
                   #print v13
                   if v13 == aNzRol68hviis8q[index]:
                            print index, "find one:",chr(v30[index])
                            if sign == 0:
                                     sign = 1
                            else:
                                     sign = 0
                            break
                            #value
print v30
v30 = [chr(c) for c in v30]
print "".join(v30)

Flag:

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

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

查看所有Flag文章需要输入密码,需要获取文章密码的童鞋请扫描下面微信或支付宝二维码捐助至少2元(老哥,捐多捐少是个缘分)之后发送支付凭证号联系我获取,Flag大全地址:Flag大全

新功能:捐款的小伙伴请联系我把自己的注册邮箱加入网站白名单,可以免回复看到本站所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜!

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