CTF-reverse-666

题目链接

https://adworld.xctf.org.cn/challenges/list


题目详情

666


 解题报告

下载得到的文件使用ida64分析,如果报错就换ida32,得到分析结果,有main函数就先看main

main函数分析

逻辑为:字符串v5(输入的串)与字符串s(已定义的串,目前是空串)经过函数encode加密后,要符合两个逻辑判断:v5和key长度要相同,s和enflag(已定义的串)内容要相同,enflag双击即可查看这里就不放了,后面写脚本时再看

(这里内部的else中puts("flag{This_1s_f4cker_flag}")显然是个恶作剧,This_1s_f4cker_flag->This_is_facker_flag,表明这是个假的flag,如果在它身上研究就是浪费时间,因为if中已经提示过了puts("You are Right"),表示这种正面的反馈才是解出flag的正确方向)

encode函数分析

跟进encode函数进行分析

  • 首先注意这里函数的形参,a1接收了字符串v5(输入的字符串),a2接收了字符串s的地址(目前还是空串)
  • 函数定义了一个空串v3,后面发现这个v3完全没用,拿来混淆视听的
  • 比对a1(即输入的v5)和key的长度,双击进入key查看长度,是12h,注意是16进制的,转为10进制则为18
  • 然后是循环对字符串a2加密
  • 仔细观察发现,这里的v3纯粹是来混淆视听用的,它把a1(即输入的s5)和key分别进行3次相关运算后,存放在了v3字符数组的[i + 64]、[i + 33]和[i + 2]的位置上,然后又立刻把这三个位置的值赋值给了字符数组a2(用的是byte指针去访问内存),这么一来v3完全是没用的,等价于直接把前三行右边的运算结果赋值给a2(即s字符串)的前三个元素
  •  最后的返回值就没啥意义了,因为main中没有利用它,但反正encode函数已经通过a2这个地址(就是main函数中的s字符数组的地址)完成了s的加密

到此为止,逆向思路清晰,上手写脚本

EXP

再回到main函数来整理一下思路,要进入这个红框的if逻辑,需要确保加密后的s和enflag相同,双击跟进得到enflag的值为【'izwhroz""w"v.K".Ni'】,那么对enflag逆向加密(即解密)就得到了flag

另外,像这种给的是单引号字符串且内部存在双引号的就直接用python去写脚本了,用C/C++还需要对引号转义,自添麻烦

再看看加密代码

逆向代码推理如下:

(注:异或运算的优先级小于加减,一定要记得加括号)

enflag = key ^ (flag + 6) -> enflag ^ key = flag + 6 -> 【flag = (enflag ^ key) - 6

enflag = (flag - 6) ^ key -> enflag ^ key = flag - 6 -> 【flag = (enflag ^ key) + 6

enflag = flag ^ 6 ^ key -> 【flag = enflag ^ 6 ^ key

enflag = 'izwhroz""w"v.K".Ni'
flag=''
#这里的key就是18,因为key的十六进制的12h,等于十进制18
key = 18
for i in range(0, key, 3):
    flag+=chr( (ord(enflag[i]) ^ key)  - 6)
    flag+=chr( (ord(enflag[i + 1]) ^ key)  + 6)
    flag+=chr( ord(enflag[i + 2]) ^ 6 ^ key)
print(flag)

(注:python的字符不能像C/C++那样直接当成ASCII去使用,必须借助函数互相转换,使用ord()进行字符转ASCII,使用chr()进行ASCII转字符)


总结

涉及到的关键知识点:

  • byte指针访问字符数组
  • 异或运算的逆向代码编写:^优先级小于+和-,如:enflag = key ^ (flag + 6) -> enflag ^ key = flag + 6 -> 【flag = (enflag ^ key) - 6
  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
CTF ReverseCTF逆向)是一种在CTF竞赛中涉及到的题目类型,要求参赛选手具备较强的反汇编和反编译技术,并能够进行逆向分析。逆向分析与功能猜测结合,通过逆向分析缩小猜测范围,然后通过逆向验证猜测的思路。 在实际的CTF Reverse练习中,参赛选手可以通过访问特定网页或平台来进行实验和练习。例如,可以尝试进入实验网页[CTF- REVERSE练习之逆向初探](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014111410002900001&pk_campaign=freebuf- wemedia)来进行逆向初步探索。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CTF逆向(reverse)入门脑图](https://download.csdn.net/download/qq_32465127/10744933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【完善中】CTF逆向Reverse题的玩法](https://blog.csdn.net/m0_37157335/article/details/123694868)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [CTF-REVERSE练习之逆向初探](https://blog.csdn.net/text202202/article/details/129824733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值