hgame week4 re
RE
1,secret
elf,用ida打开,从main中看不到什么,经过调试发现是个假的main找到真正的main
先看的第一个函数
在这里卡了好久,我开始一直以为是在这里加密的,加密后与unk_6032E0相比对,因为对加密算法不熟悉,对上图中hash256的分析耗了将近两天,当我分析出是hash256的时候简直崩溃~
不过得到这个结果,确定了此处不是关键,看下一函数
在这个函数里找到了
对这个函数进行分析
可以得出是XTEA加密,但是这一串sigaction打的我有点懵,经过了一天时间四处查,得到了我不用在意sigaction的结论(╯' - ')╯┻━┻
于是再次调试,得到了key
k[4]={0x42655F29,0x9E822EFC,0xDA278C92,0x4E355A62}
unk_603200为
E9C8A927 B473A9BA F972C0AA 0080FAA3 D3C2F4D9 C56B3FFB 5ED9D3D3
771D9686 3FC500E6 B927BC98 ACC3AA09 2424DC6A 04E30506 778CE765
之前的分析中我得到了每两个32位的数进行XTEA,所以解密时要改为
27A9C8E9 BAA973B4 AAC072F9 A3FA8000 D9F4C2D3 FB3F6BC5 D3D3D95E
86961D77 E600C53F 98BC27B9 09AAC3AC 6ADC2424 0605E304 65E78C77
#include <stdio.h>
#include <stdint.h>
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[2]={0x0605E304,0x65E78C77};
uint32_t const k[4]={0x42655F29,0x9E822EFC,0xDA278C92,0x4E355A62};
unsigned int r=32;
printf("解密前原始数据:%x %x\n",v[0],v[1]);
decipher(r, v, k);
printf("%u 解密后的数据:%x %x\n",r,v[0],v[1]);
return 0;
}
于是得到
6d616768 6f4e7b65 hgame{No
654e305f 4e34635f _0Ne_c4N
5f30745f 405f6542 _t0_Be_@
6174245f 68542e52 _$taR.Th
735f7933 4c6c3174 3y_st1lL
6e41435f 4e34635f _CAn_c4N
3148735f 7d2e336e _sH1n3.}
得到flag
2,easyvm
拖进ida,
将一些数据,和我们的flag进行处理,vm函数有一些switch,可以看出是vm题(当然题目告诉我了)
a1就是加密的处理
按正常思路分析虚拟机指令,可以看到要了一段内存,应该是作为栈,就从可以看出push和pop
本来想分析清楚每个操作,但在调试中发现了其实关键就是xor操作
而异或的值在
就是此时rax的值,那么
c=[0x3A,0x54,0x2F,0x2A,0x2F,0x36,0x13,0x01,0x2E,0x03,0x35,0x40,0x47,0x0E,0x5F,0x59,0x01,0x69,0x27,0x08,0x3D,0x4C,0x33,0x1A,0x2D,0x0B,0x40,0x0E,0x4B,0x24,0x41,0x27,0x25,0x28,0x29,0x2A,0x02,0x02,0x5D,0x24]
x=[0x52,0x33,0x4e,0x47,0x4a,0x4d,0x67,0x69,0x47,0x70,0x6a,0x36,0x2a,0x51,0x36,0x2a,0x5e,0x36,0x54,0x67,0x4e,0x23,0x40,0x75,0x5e,0x64,0x33,0x61,0x38,0x4b,0x32,0x48,0x56,0x47,0x76,0x4f,0x63,0x71,0x24,0x59]
for i in range(len(c)):
print(chr(c[i]^x[i]),end='')
得到flag(感觉有点对不起这道题( ‘ _ ‘ ))