VNCTF象棋王子&&电子木鱼
象棋王子
题目说下赢就可以得到flag
但是太难了,审计js代码
在play.js里面找到了
当my=1时就会胜利
但是结果是jsfunk加密,我们将他放入到控制台运行
电子木鱼
点击无响应,下载源码,是rust写的,代码审计
先看获取flag的条件
当功德大于10亿的时候就会出flag
那么看一下怎么增加功德。
这里获取传入进来的paylaod参数,当cost不等于时进行功德的加减运算
paylaod中当name=Loan时,cost等于-1000。
这样的话当cost!=0时会进行功德的加减运算,那么减去一个负数,就等于加上一个正数
那么等于没发送一次请求就增加1000功德
那么构造脚本发包增加脚本
功德也增加了
但是这样增加不知道到时候才能到10亿,而且还有延时,速度太快,会导致服务器导致429
这样我们就要找其他的方法
但是这样对输入的quantity进行了限制,要求要为整数。
后面看师傅的wp时是要使用整数溢出漏洞
当时还不太理解,后面搜了一下整数溢出漏洞,rust的整数溢出当为整数时溢出会为负数
在 Rust 中,整数类型默认是有符号整数类型,意味着这些整数类型可以表示正数和负数。对于有符号整数类型,最高位用来表示符号,0 表示正数,1 表示负数。
当一个正数进行整数溢出时,也就是它的值超过了它的类型所能表示的最大值,这个值会被截断为该类型的最小值。因为有符号整数类型的最高位表示符号,当这个值被截断时,最高位的值会变成 1,表示这个值是一个负数。
举个例子,假设使用 Rust 的 i8 类型,它的最大值是 127,最小值是 -128。如果一个 i8 类型的值为 120,然后将它加上 10,那么它的值就会溢出,变成 -126。这是因为 120 + 10 = 130,而 130 超过了 i8 类型的最大值 127,所以这个值会被截断为 -128 + (130 - 128) = -126。
因此,在 Rust 中,正数进行整数溢出后的结果会变成负数,这是由于有符号整数类型的设计所决定的。
当name=cost的时候
cost=cost*quantity
那么这时候如果使用整数溢出,使输入的quantity溢出后变成负数,使cost最终结果为负数,那么最终就会直接吗满足获得flag的条件
返回了true
返回原来的页面