HGAME2023 Reverse

cpp

好题!(没做出来的都好)
IDA查看main函数
image
可以看到这里一些调用的函数都没有明确写出来 动调查看
发现在输出yes/try again的前面一次调用了3个函数
sub_7FF7912B1E30 sub_7FF7F4352E60 sub_7FF7F4353080
其中第一个看了看没什么用(单纯看不懂在干什么)
第二个调用的里面有个很像加密的地方
image
可以看到这里有个xor操作
动调跟踪到这里
查看汇编
image
发现eax和ecx作了xor 那么查看这两个寄存器的值
eax由rax赋值过来
image
可以看到这里对输入的字符串每四个字节进行了反转
那么ecx存的就是key了
查看
image
image
所以将刚刚找到的栈中数据按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

好欸~看汇编!
image
image
这题最后一行比较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}
posted @ 2024-01-20 23:56  N0zoM1z0  阅读(17)  评论(0编辑  收藏  举报