DosSnake:
本题考查的是对8086汇编代码分析(当然也可以修改游戏程序直接输出flag,由于我的windows系统打不开游戏程序所以此方法暂且不作分析介绍了)
直接拖进IDA查看汇编代码算了,由于这个程序只给了一个数据段,我们很容易就能找到代码加密逻辑(前面一大段的汇编代码都是为了实现贪吃蛇这个小游戏没啥用,我们直接看加密部分):
可以看到逻辑非常简单,Dasctf的前6部分作为key,后面的26位数据作为密文,进行简单的异或加密
si对应密文指针,di对应key指针,密文数据如下:
直接写脚本一把逆即可得到flag
Exp:
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
int main() {
unsigned char a[]="DASCTF";
unsigned int b[]={ 0x3F, 0x09, 0x63, 0x34, 0x32, 0x13, 0x2A, 0x2F, 0x2A, 0x37,
0x3C, 0x23, 0x00, 0x2E, 0x20, 0x10, 0x3A, 0x27, 0x2F, 0x24,
0x3A, 0x30, 0x75, 0x67, 0x65, 0x3C};
int i;
for(i=0;i<26;i++){
printf("%c",a[i%6]^b[i]);
}
}
Strangeprograme:
本题考查的是iat hook
直接在ida分析Strangeprograme_ok.exe,查看字符串找到有一个假flag
看汇编分析发现存在.DASCTF段
直接跳到该处(loc_41D000),进行交叉引用,溯源到sub_413D50,可以看到存在一个反调试
再进入sub_4111BD()->sub_414E30()->sub_411046()->sub_414B90():
查看sub_4111BD函数会发现其内部先定位到.DASCTF段,再进行了SMC
下断点处理一下就可以看见加密逻辑是魔改的TEA:
Exp:
#include <stdio.h>
#include <stdint.h>
void TEA_decrypt(uint32_t* enc, uint32_t* key);
int main() {
unsigned int enc[] = { 0xBC2B4DF9, 0x6213DD13, 0x89FFFCC9, 0x0FC94F7D, 0x526D1D63, 0xE341FD50, 0x97287633, 0x6BF93638, 0x83143990, 0x1F2CE22C };
unsigned int key[] = { 0x12345678, 0x09101112, 0x13141516, 0x15161718 };
for (size_t i = 9; i >= 2; i -= 2)
{
enc[i] ^= enc[1];
enc[i - 1] ^= enc[0];
TEA_decrypt(enc, key);
}
TEA_decrypt(enc, key);
printf("%s", enc);
}
void TEA_decrypt(uint32_t* enc, uint32_t* key)
{
uint32_t v0 = enc[0], v1 = enc[1], i;
uint32_t delta = 0x9e3779b9;
uint32_t sum = delta * 16;
uint32_t k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
for (i = 0; i < 16; i++)
{
sum -= delta;
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
}
enc[0] = v0;
enc[1] = v1;
}