You got the key? |
==> |
Idk maybe you are getting some terms wrong or its just a language barrier. With a devirtualizer I mean that the custom instruction set i created which is read by my custom VM has to be decoded in normal x86-64 instructions. So if you e.g have something like 0x12, 0xf3 then your devirtualizer should make a "mov" out of it. |
==> |
Yes the ANY- is correct. Very nice! Second part can be a bit harder but its obviously the same vm used as core. |
==> |
Isnt VM == microcomputer in this context? But yeah it is randomized at the beginning. As a small hint: The code obviously doesnt change at all in its mechanics. Only thing getting more difficult is writing a devirtualizer. If you need a few more little hints you can always ask :) |
==> |
For anyone looking for the complete cleaned up routine (heavy spoiler)
int keypart1[8] = {};
int keypart2[8] = {};
for (int i = 0; i 7) {
keypart2[i - 8] = input[i];
}
else {
keypart1[i] = (int)input[i];
}
}
int sum = keypart1[0] + keypart1[1] + keypart1[2] + keypart1[3] + keypart1[4]
+ keypart1[5] + keypart1[6] + keypart1[7];
int sum_pow = pow(keypart1[0], 2) + pow(keypart1[1], 2) + pow(keypart1[2], 2) +
pow(keypart1[3], 2) + pow(keypart1[4], 2) + pow(keypart1[5], 2) +
pow(keypart1[6], 2) + pow(keypart1[7], 2);
double added_log = 0;
for (int i = 0; i = 0.00000011920929) {
std::cout |
==> |
I have the entire routine reversed now. The key is 16 chars long and is split in half and then processed. Only thing which seems rather impossible is inverting it. I will try my best now ... |
==> |
I dont get what you are trying to say |
==> |
Very nice crackme. One thing I would suggest is that you make "smaller" instruction steps so the jumptable becomes bigger and harder to RE. Just four instructions is a bit less.
Anyways... Thanks for sharing :) |
==> |