January 3, 2022

HDCTF2019-MFC

0x00 日常查壳

VM的壳 没法脱

image-20220103225230211

0x01 MFC

第一次做到MFC的题 为此去补了个视频 不过这题并不需要结构体导入找函数什么

脑洞题 既然壳没法脱 丢进ida也是一团乱于是就是用xspy分析

image-20220103225237490

借用这位师傅文章的图

image-20220103225242977

这题脑洞就是要向这个窗口发送东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <windows.h>
int main(void)
{
    HWND h = FindWindowA(NULL, "Flag就在控件里");       //找到窗口句柄
    if (h)
    {
        SendMessage(h, 0x464, NULL, NULL);             //发送一个空值
        printf("Nice");
    }
    else
    {
        printf("No");
    }
    return 0;
}

image-20220103225250185

0x02 GetFlag

奇怪的字串(48位) 再加上这个DES key

很容易想到就是要去DES解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from Crypto.Cipher import DES
from Crypto.Util.number import *

def encode(s):                                  #转二进制
    return ' '.join([bin(ord(c)).replace('0b', '') for c in s])
 
def decode(s):
    return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])
# data = "{I am a Des key}"
# for i in range(0, 16):                        输出十六进制
#     print(hex(ord(data[i]))[2:], end = "")
# key = "{I am a "                              直接字符串

key = b'{I\x20am\x20a\x20'                      #最后发现只取前八位即可
c = long_to_bytes(0x944c8d100f82f0c18b682f63e4dbaa207a2f1e72581c2f1b)
lun = DES.new(key, DES.MODE_ECB)

p = lun.decrypt(c)
print(p)

说实话DES明明是8位密钥,我一直搞不懂为什么16位一直以为输入格式有问题,后来问了void师傅,一试就知道取前八位(果然还是题做少了),于是按这个方向

GetFlag!

image-20220103225257780

也可以用工具或在线网站解

image-20220103225301507

不过总感觉失去了灵魂

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.