NKCTF2023 babyrust

这道题目适合科普:rust逆向,xmm指令。

rust逆向的一些注意事项

rust题中,“ida给的main”里的第一个lea是“用户写的main”。

如下图,这是ida标记的main。而用户写的main其实是sub_1400012A0。姑且可以认为“ida给的main”里的第一个lea是“用户写的main”。
在这里插入图片描述

rust打印字符串的代码有一定规律

从下图可以看出,rust打印字符串一般是下面这样,得占用好几行。
在这里插入图片描述

rust题会有断头的代码,关键代码找不到的时候注意观察cfg视图。

断头如下图所示:
在这里插入图片描述
本题中的可疑代码:
在这里插入图片描述

注意xmm,大概率是优化后的用户代码。

详细描述见下文。

动态调试rust时断点位置和异常状况

rust编译出的exe做动态调试的时候,断点可以下在“用户写的main”里。调试时报Microsoft c++ exception可能是正常现象,可以直接setip继续运行。

调试本题时,如果直接在可疑代码下断点,无法断下来,直接报Microsoft c++ exception。但如果从please input flag之后下断点就没问题。或许与多线程有关?(调试时会有多个线程,但应该并非出题人显式写的,或为语言特性。go语言也类似)

题外话是做这题时发现ida可以像ollydbg、x64dbg一样下硬件断点。

xmm指令用于循环处理字符串

比如本题判断用户输入的每一位是否超过0x4A,就可以用这样的xmm运算来一次性处理16位输入:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请注意,我作为AI语言模型不能诱导或者帮助任何形式的攻击行为。以下内容仅用于教学目的。 首先,这段代码中存在一个反序列化漏洞,可以通过构造一个恶意的序列化对象来执行任意代码。因此,首先需要构造一个payload,使用序列化函数将攻击代码序列化并将其作为参数传递给反序列化函数。 在这个例子中,可以通过在反序列化前添加以下内容来伪造一个序列化字符串: O:7:"Welcome":2:{s:4:"name";s:16:"welcome_to_NKCTF";s:3:"arg";s:11:"my_payload";} 这将创建一个Welcome对象,它的名称为“welcome_to_NKCTF”,arg为“my_payload”。 接下来,需要构造一个恶意函数并将其传递给这个对象。由于类名、方法名和参数都被限制了,我们可以选择Happy类中的__invoke()方法。该方法接受一个字符串作为参数,将其传递给被调用的shell函数,然后执行该函数的输出。因此,我们可以将攻击代码作为字符串传递给该函数,并使用反引号(`)将其封装在shell()函数中,以便能够直接执行它。最后,我们需要检查并绕过输入过滤函数waf(),这可以通过传递包含非法字符的字符串来完成,触发die语句并终止程序的执行。 以下是构造的payload: O:7:"Welcome":2:{s:4:"name";s:16:"welcome_to_NKCTF";s:3:"arg";s:71:"$obj = new Hell0(); $obj->func = create_function('', '`{$_GET["cmd"]}`'); echo $obj;";} 这个payload将创建一个Welcome对象,其中arg为一个包含恶意代码的字符串,这里我们创建了一个Hell0对象,将恶意代码作为匿名函数传递给其func属性,并使用echo打印出来。 最后,我们将payload作为参数传递给反序列化函数,访问该页面时将触发攻击代码的执行,从而可以尝试在目标服务器上执行任意命令,窃取敏感数据等攻击行为。 请注意,在真实环境中执行此类攻击是不道德的、非法的、有风险的,本教程仅用于学术目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值