HGAME2023 Reverse
cpp
好题!(没做出来的都好)
IDA查看main函数
可以看到这里一些调用的函数都没有明确写出来 动调查看
发现在输出yes/try again的前面一次调用了3个函数
sub_7FF7912B1E30
sub_7FF7F4352E60
sub_7FF7F4353080
其中第一个看了看没什么用(单纯看不懂在干什么)
第二个调用的里面有个很像加密的地方
可以看到这里有个xor操作
动调跟踪到这里
查看汇编
发现eax和ecx作了xor 那么查看这两个寄存器的值
eax由rax赋值过来
可以看到这里对输入的字符串每四个字节进行了反转
那么ecx存的就是key了
查看
所以将刚刚找到的栈中数据按DWORD取出来得到key的值
加密看完了 继续跟进找最终check
在前面提到的第三个函数中进行了check操作
v2[0~39]就是enc的值
那么我们逆向回去只需要每4个反转一下再跟key异或就能还原了
solution.c
#include<bits/stdc++.h>
using namespace std;
signed main(){
unsigned int enc[10] = {
0x23C15028, 0x3641A198, 0x52CB314C, 0xCCACF190, 0x892A6C0F, 0x8411DF7F, 0xE0A2E67F, 0x46C5C759,
0x9338295D, 0xFF7A15ED
};
unsigned int key[10] = {
0x4037A04E, 0xFDDA0246, 0x3C6EFA21, 0xCF9CD9AF, 0x673347B9, 0x0DEC4EE0, 0x1380C4D1, 0x3AB2A932,
0x025D50A7, 0x834A3982
};
for(int i=0;i<10;i++){
for(int m=0;m<=3;m++){
int x=((enc[i]>>(8*m))&0xff)^((key[i]>>(8*(3-m)))&0xff);
printf("%c",x);
}
}
}
// hgame{Cpp_1s_much_m0r3_dlff1cult_th4n_C}
看了WP后想了想 关键点还是在于要想到查看eax ecx寄存器的值(多么基础的一个步骤...)
再者 不要被一些奇奇怪怪的函数给干扰了
easyasm
好欸~看汇编!
这题最后一行比较al和seg1中存放的数据是否相等
中间算了 al<<4+al>>4 输出一下中间计算结果发现就是flag
#include<bits/stdc++.h>
using namespace std;
signed main(){
unsigned char data[28] = {
0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21, 0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1,
0xE2, 0x54, 0x20, 0xC1, 0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17
};
for(int i=0;i<28;i++){
int x = data[i]^0x17;
cout<<char((x<<4)+(x>>4));
}
}
// hgame{welc0me_to_4sm_w0rld}