VNCTF象棋王子&&电子木鱼

象棋王子

image-20230220192136025

题目说下赢就可以得到flag

但是太难了,审计js代码

在play.js里面找到了

image-20230220192317519

当my=1时就会胜利

但是结果是jsfunk加密,我们将他放入到控制台运行

image-20230220192451961

电子木鱼

image-20230220192731850

点击无响应,下载源码,是rust写的,代码审计

先看获取flag的条件

image-20230220193320597

当功德大于10亿的时候就会出flag

那么看一下怎么增加功德。

image-20230220193831460

这里获取传入进来的paylaod参数,当cost不等于时进行功德的加减运算

image-20230220194012883

paylaod中当name=Loan时,cost等于-1000。

这样的话当cost!=0时会进行功德的加减运算,那么减去一个负数,就等于加上一个正数

那么等于没发送一次请求就增加1000功德

那么构造脚本发包增加脚本

image-20230220194952808

image-20230220195003807

功德也增加了

image-20230220195057042

但是这样增加不知道到时候才能到10亿,而且还有延时,速度太快,会导致服务器导致429

这样我们就要找其他的方法

image-20230220195233123

但是这样对输入的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 中,正数进行整数溢出后的结果会变成负数,这是由于有符号整数类型的设计所决定的。

image-20230220200051474

当name=cost的时候
cost=cost*quantity

那么这时候如果使用整数溢出,使输入的quantity溢出后变成负数,使cost最终结果为负数,那么最终就会直接吗满足获得flag的条件

image-20230220201330797

返回了true

返回原来的页面

image-20230220201356380

posted @ 2023-02-20 23:06  GTL_JU  阅读(367)  评论(0编辑  收藏  举报