前言

该题主要考察了TCL脚本的编写以及应用,TCL(Tool Command Language),是一种基于字符串的解释型命令语言,通常和Windows的GUI集成为Tk,易用C/C++/Java/Python扩展。

题目描述

The tctkToy was a fragile Windows application toy. Reverse and repair it in order to work well. SUPPORT: Recommend using Windows10 machine to run successfully.
P.S. File changed to this (28th 09:52JST(28th 00:52UTC)) file.zip_5bd5bdb6eaf308b509af1c466b8a76578b75cdd9
Hint : you can write a tcl file with just only "button", "exec", "cd", "wm", "canvas", "image" and "pack" command.

题目分析

题目启动时需传入1个参数:

当参数值为2时控制台打印帮助信息如下:

当参数值为1时控制台打印信息build & check mode,初始化显示的窗体:


进入和窗体绑定的回调函数handle,可以看到处理消息中,当消息值为1时,开启了拖拽文件的开关,并且加载了资源的位图文件:

接下来创建新线程对拖拽入窗体的文件进行处理:

可以看到处理的函数中将文件作为TCL脚本进行执行:

结合加载的位图提供的信息,可以知道程序需要在执行拖拽入的TCL脚本文件后出现修复后的窗口样式:

解题过程

在执行完TCL脚本后,进行两处check,通过则打印flag:

第一处check主要针对TCL脚本执行后带来的变化,分为四处:
(1)检测了当前工作目录是否为C:\tctkToy:

(2)遍历进程列表是否存在任务管理器Taskmgr.exe并进行关闭:

(3)检查是否存在标题为tctkROBO的窗口:

(4)检查窗体TkChild控件和Button控件的数量需满足count(TkChild)*10+count(Button)==13:
遍历控件并计数:

检查数量是否为13:

第二处check针对TCL脚本本身内容进行:
(1)对每行的指令语句取头两个字符进行连接,其中头两个字符为.时不选取,且读取的总长度为24,即实际读取的指令语句应该是12条:

(2)对连接后的指令内容进行SHA256哈希,将头20个字符和a683618184fc18105b71比较,相等则通过:

TCL脚本

cd "C:\\tctkToy"
exec "Taskmgr.exe" "/c"
wm title . "tctkROBO"
canvas .c
image create photo img -file face.png
.c create image 300 110 -image img
pack .c -expand yes -fill both -side top
button .go -text "Go" -command exit -background green -width 80
pack .go
button .back -text "Back" -command exit -background blue -width 80
pack .back 
button .stop -text "Stop" -command exit -background red -width 80
pack .stop -side bottom

有个坑点就是TCL在执行启动Taskmgr.exe时会报invalid argument错误,原因可能是启动的权限不够(在管理员模式下可以启动),这里采用的解决方法是在C:\tctkToy工作目录下放一个cmd.exe(重命名为Taskmgr.exe),在脚本中传入/c参数是为了执行完命令后关闭命令窗口,不影响后续设置窗口的操作。由于/c会使Taskmgr程序退出,因此在程序运行前要先运行真正的任务管理器,然后程序运行时传入脚本就可以了。

解题脚本

import hashlib
# "button", "exec", "cd", "wm", "canvas", "image" and "pack"
key="cdexwm"
key+="caimpa"
key+="bupabupabupa"
assert len(key)==24
m=hashlib.sha256()
m.update(key)
sha = m.hexdigest()
if sha[:20]=="a683618184fc18105b71":
    print "SECCON{%s}"%sha
# SECCON{a683618184fc18105b7157a52727d004681844be54fd792add4c90ff15a66e6f}

结果

参考资料

http://zetcode.com/gui/tcltktutorial/drawing/
https://www.tcl.tk/man/tcl/TkCmd/button.htm
https://wiki.tcl-lang.org/page/Simple+Canvas+Demo

file.zip (2.37 MB) 下载附件
源链接

Hacking more

...