CubeMadness1:直接修改内存
dw
目标是获取20个cubes,但是场地总共就6个,所以就是CE改数值即可
搜到三个值,直接改成20,出现flag:
HTB{CU83_M4DN355_UNM4DD3N3D}
CubeMadness2:修改加密内存
目标应该和1是一样的:
接下来用一样的办法尝试:
可以搜到地址,但是修改完之后数值没有变化
查看“是谁修改了这个值”,找到一个地址,附近的指令如下:
这里的断点会不断的触发,比较rbx+24和edx是否相同,不相同就修改,为edx的值
这里的rbx+24应该是收集到的cube的值
edx的值从加密的内存里取出来然后解密得到
由于这个循环是不断进行的,所以只有修改了加密了的内存的值,才能真正修改到cubes的值
解密流程就这么长点,直接C语言还原即可:
#include <cstdint>
#include <intrin.h>
#include <stdio.h>
int decode(int val)
{
uint64_t tmp = _shlx_u32(val, 9);
int key = 0x6208cecb;
tmp = tmp << 32;
tmp /= key;
return tmp;
}
int main() {
int val = 0x248f;
int key = 0x6208cecb;
int result_hi;
int result_lo;
_mul_full_overflow_i32(val, key, &result_lo, &result_hi);
printf("%x %x\n", result_hi, result_lo);
int res = _sarx_i32(result_hi, 9);
printf("%x\n", res);
int inp = decode(19);
printf("inp: %x", inp);
return 0;
}
运行得到:
e00 f65
7
inp: 633a
接下来手动修改加密的内存的值为0x633a,即可: