[RE] webassembly8 - mf xp0int Posted on May 27 2019 wasm的题目。 1. 利用GitHub上的wabt可以将他反编译成c源码,不过可读性较差,再次编译一下(不能编译成可执行文件,只能编译成目标文件.o),用ida查看就可以静态调试了。 2. 在本地用python开一个http服务,chrome访问,就可以动态调试了。 3. ida可以看到,main函数是f16函数,其中只调用了f54和f15。 4. 动态调试可知,f54为输入函数,f15是check函数。 5. 分析f15,发现是用xtea加密了flag的前32位,密钥为'\x00'*16 ![](https://leanote.com/api/file/getImage?fileId=5ceb407fab644130190012ce) ![](https://leanote.com/api/file/getImage?fileId=5ceb407fab644130190012cf) 6. 最后的验证并不是比较,而是进行循环的异或,所有异或的值都要为0,所以异或值就是密文。 ![](https://leanote.com/api/file/getImage?fileId=5ceb407fab644130190012d0) 7. 最后6为是明文,未加密的。 8. 解密脚本如下: ```c #include <stdio.h> #include <stdint.h> /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */ void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0 = v[0], v1 = v[1], sum = 0, delta = 0x9E3779B9; for (i = 0; i < num_rounds; i++) { v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); sum += delta; v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]); } v[0] = v0; v[1] = v1; } void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) { unsigned int i; uint32_t v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta * num_rounds; for (i = 0; i < num_rounds; i++) { v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum >> 11) & 3]); sum -= delta; v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]); } v[0] = v0; v[1] = v1; } int main() { uint32_t v[9]; uint32_t const k[4] = {0, 0, 0, 0}; unsigned int r = 32; v[0] = 0x617557c1; v[1] = 0x132dd474; v[2] = 0x8ae20062; v[3] = 0xedcb0e50; v[4] = 0x6f202041; v[5] = 0xbefc26d0; v[6] = 0x7767ab98; v[7] = 0x092d7139; v[8] = 0; for (size_t i = 0; i < 8; i += 2) { decipher(r, &v[i], k); } printf("%s741d8}\n", (char *)v); return 0; } ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Web] 高明的黑客 - LanceaKing [Pwn] trywrite -cpt.shao
没有帐号? 立即注册