CTF-AdultOtter

题目源代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract AdultOtter {
bool public solved = false;

function pwn(uint[16] memory code) public {
uint[16] memory a;
uint[16] memory b;

for (uint i = 0; i < 16; i++) {
assert(1337 * i < code[i] && code[i] < 1337 * (i + 1));
}

for (uint i = 0; i < 16; i++) {
a[i] = i**i * code[i];
}

for (uint i = 1; i < 16; i++) {
b[i] = (2**255 + code[i] - 7 * a[i] + b[i-1]) % 2**64;
}

assert(b[15] == 0);
solved = true;
}
}

这就是一道计算题,
其实就是使code[15] - 7 i ** i * code[15] + code[14] - 7 i i * code[14] + …… code[1] - 7 *i ** i * code[1]+ b[0] 为2**64倍数即可。
答案:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

interface IAdultOtter {
function pwn(uint[16] memory code) external;
}

contract Exploit{

function exploit() public {
address addr = 0x6D40aCf2EF8F8F99247666AEE922E79CB605DE3B;
uint[16] memory DataNumber;
DataNumber[0] = 11;
DataNumber[1] = 1513;
DataNumber[2] = 3859;
DataNumber[3] = 5192;
DataNumber[4] = 6112;
DataNumber[5] = 7966;
DataNumber[6] = 9263;
DataNumber[7] = 10432;
DataNumber[8] = 11709;
DataNumber[9] = 13320;
DataNumber[10] = 14564;
DataNumber[11] = 15480;
DataNumber[12] = 16614;
DataNumber[13] = 18200;
DataNumber[14] = 19485;
DataNumber[15] = 21344;
IAdultOtter(addr).pwn(DataNumber);
}

}