[HGAME2023]Gopher Shop

/

注册并登录

func BuyProduct(context *gin.Context) {
	// ...
	
	//校验是否买的起
	if err != nil || number < 1 || user.Balance < uint(number) * price{
		context.JSON(400, gin.H{"error": "invalid request"})
		return
	}
	
	user.Days -= 1
	user.Inventory -= uint(number)
	user.Balance -= uint(number) * price
	
	// ...
}

由于交易过程中并未对库存数做任何校验,因此可通过整数溢出来购买大量的苹果

购买 \(1844674407370955162\) 个苹果,uint(number) * price的算术结果为 \(18446744073709551620\)uint在64位系统中最大值为 \(18446744073709551615\) ,因而发生上溢,结果为 \(18446744073709551620\ mod\ 2^{64}=4\le10\)

由于卖出的逻辑中也存在整数溢出,因此卖出足够买Flag的量即可