[BJDCTF2020]BJD hamburger competition-buuctf

buuctf做题记录

分析

拿到手里是一堆文件:
在这里插入图片描述
(这里的code是我之后存在这里的一个文件夹,并不是题目给的)
看到了Unity,之前并未做过类似的题目,去查了相关参考
比较关键的几点是:

  1. u3d支持c#和js两种脚本,而且c#是最普遍的
  2. 核心.net代码位于下述路径:

\TPH\TPH_Data\Managed\Assembly-CSharp.dll

  1. 关于.net

逆向分析

根据以上信息,使用ILSpy打开hamburger_competition\BJD hamburger competition_Data\Managed中的Assembly-CSharp.dll
ILSpy的安装
在这里插入图片描述
然后点击左上角的File之后save code,选择一个文件夹保存反编译后的代码(我这里就是新建了一个code文件夹)
在这里插入图片描述
在得到的一堆文件中,用VS打开这个文件

.csproj,是C#项目文件的扩展名,它是“C Sharp Project”的缩写。.net开发环境中建立项目时,会产生.csproj文件,这是C#的工程文件,其中记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。

可以看到反编译后的代码了:
在这里插入图片描述
之前尝试点击过这个游戏,游戏界面是这样的:
在这里插入图片描述
显然,ButtonSpawnFruit.cs里的字符串与显示的界面有关,很有可能藏有flag,继续往下看:
在这里插入图片描述
显而易见的一个SHA1和一个md5,首先进行SHA1解密
在这里插入图片描述
得到1001
再进行md5加密
在这里插入图片描述
可是把32位和16位的结果都包上flag{}交上去了却都不对,找了一个把小写字母转换成大写字母的网站,提交大写字母的flag仍旧不对,于是思考,在SHA1已经解密出1001的情况下,出错的应该是md5的加密,返回去看具体的md5加密函数:

在这里插入图片描述
虽然我没学过c#,但substring应该是比较常见的名称了,它把md5得到的字符串截取了0-20的部分,所以flag只有20个字符,到这里我就大小字母都试了试交了flag,之后又去搜了下ToString("X2")

ToString(“X2”) 为C#中的字符串格式控制符X为 十六进制 2为 每次都是两位数比如 0x0A ,若没有2,就只会输出0xA 假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。
(由此知是大写的字母)

最后得到flag:
在这里插入图片描述

小结

更新了对.net、unity3D以及C#的知识,需要学习的东西又增多了。

### BJD CTF 2020 BabyROP2 Writeup #### 题目概述 BabyROP2 是一道典型的 Return-Oriented Programming (ROP) 类型题目,主要考察参赛者对于 ROP 技术的理解以及利用漏洞执行任意代码的能力。 #### 利用技术分析 在该挑战中,`init` 函数提供了重要的提示信息[^4]。通过快速浏览反编译后的二进制文件代码可以确认这是一个 ret2libc 的攻击场景。具体来说: - `puts` 被用来泄露库函数的真实加载地址; - 计算目标系统调用(如 system 和 /bin/sh)相对于已知泄漏地址的位置偏移量; - 构造恶意输入数据覆盖返回地址链,从而实现控制程序流的目的; #### 实际操作步骤说明 为了成功完成此题目的解答,需要采取如下措施来构建有效的 payload 并触发远程命令执行: 1. 使用工具定位 libc 中的关键 gadget 地址; 2. 发送请求以获取服务器端实际使用的动态链接器基址; 3. 基于上述信息调整本地测试环境配置使之匹配远端状况; 4. 编写并发送精心设计的数据包给服务端,其中包含正确设置好的栈帧结构及必要的参数传递方式; ```python from pwn import * # 远程连接到CTF平台上的babyrop2服务 conn = remote('challenge.ctf.games', PORT) # ... (省略部分细节) payload = b'A' * OFFSET_TO_RETURN_ADDR \ + pack(system_addr, 'little') \ # 将system()的地址放入返回地址处 + pack(bin_sh_str_addr, 'little')\ # 参数"/bin/sh"字符串指针作为第一个参数传入system() conn.sendline(payload) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值