IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【CTF-MISC出题思路分享】匿于时之下 -> 正文阅读

[Python知识库]【CTF-MISC出题思路分享】匿于时之下

前段时间出隐写题的时候发现了一个很有趣的隐藏信息的地方,给大家分享一下

首先来新建一个txt文本,看看他的属性。在这里插入图片描述

下面那里可以藏信息呢?大小?位置?

NoNo咱今天就用利用时间来进行信息隐藏

首先来读取一下这个时间,在python中使用os库就可以直接读取创建时间、修改时间、访问时间。

import os
filename = "new.txt"
file_attr = os.stat(filename)#读取文件属性
print(file_attr)

打印之后得到以下内容:

os.stat_result(st_mode=33206, st_ino=1970324837900684, st_dev=40639268, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1652854599, st_mtime=1652854574, st_ctime=1652854574)

其中st_atime为访问时间,st_mtime为修改时间,st_ctime为创建时间

都是以unix时间戳(S)表示

单独提取出创建时间使用file_attr.st_ctime可以直接提取

如果需要转为标准格式%Y-%m-%d %H:%M:%S,需要导入time库

import os
import time
filename = "new.txt"
file_attr = os.stat(filename)#读取文件属性
create_time = file_attr.st_ctime#获取创建时间
create_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(create_time))#转为标准格式
print(create_time)

这样打印出来的结果为2022-05-18 14:16:14

其他修改时间、访问时间同理使用file_attr.st_mtime、file_attr.st_atime即可

(img-Ilcy9tvv-1654651827655)(assets/配图1-20220518151700-ppofcul.gif)]

刚刚说完读取,再来说说如何修改这些时间

最憨的方法是到了指定时间创建这个文件,是不是听起来就很憨

这样肯定是不行的,无法准确控制自己想要的时间

现在来谈谈如何修改,这里直接参考了网上的一篇文章以下代码[1]

import os
import time
from pywintypes import Time
from win32con import FILE_FLAG_BACKUP_SEMANTICS
from win32con import FILE_SHARE_WRITE
from win32file import CloseHandle
from win32file import CreateFile
from win32file import GENERIC_WRITE
from win32file import OPEN_EXISTING
from win32file import SetFileTime
def modify_file_create_time(filename, create_time_str, update_time_str, access_time_str):
    try:
        format_str = "%Y-%m-%d %H:%M:%S" # 时间格式
        f = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, None, OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS, 0)
        create_time = Time(time.mktime(time.strptime(create_time_str, format_str)))
        update_time = Time(time.mktime(time.strptime(update_time_str, format_str)))
        access_time = Time(time.mktime(time.strptime(access_time_str, format_str)))
        SetFileTime(f, create_time, update_time, access_time)
        CloseHandle(f)
        print('update file time success:{}/{}/{}'.format(create_time_str, update_time_str,access_time_str))
    except Exception as e:
        print('update file time fail:{}'.format(e))
create_time = Time(time.mktime(time.strptime(create_time_str, format_str)))#新的创建时间
update_time = Time(time.mktime(time.strptime(update_time_str, format_str)))#新的修改时间
access_time = Time(time.mktime(time.strptime(access_time_str, format_str)))#新的访问时间
SetFileTime(f, create_time, update_time, access_time)#设置
if __name__ == '__main__':
    cTime = "2022-05-18 14:16:14" # 创建时间
    mTime = "2022-05-18 14:16:14" # 修改时间
    aTime = "2022-05-18 14:16:14" # 访问时间
    fName = r"new.txt" # 可以是文件也可以是文件夹
    print(os.path.isdir(fName))
    modify_file_create_time(fName, cTime, mTime, aTime)

说了这么多了,可以读取,又可以修改,那么信息要怎么隐藏呢?

(img-H6E3PJmt-1654651827655)(assets/image-20220518165609-nggoebl.png)]

现在我想把一段字符串flag{where_is_flag}隐藏到时间当中

经过一段头脑风暴产生了一个思路

每一个字符转为10进制,然后使用一个时间戳作为一个基础数,利用基础数+字符转为的10进制数,分别写入到19个文件中,并修改文件的创建时间、修改时间、访问时间

#创建一个空白文件
def createfile(filename):
    try:
        with open(filename, 'w') as f:
            pass
    except Exception as e:
        print(e)
        sys.exit()

选一个2038年1月19日 11:03:00时间戳2147483000,这里后面取3个0是为了降低难度更好发现

flag{where_is_flag}转为10进制102 108 97 103 123 119 104 101 114 101 95 105 115 95 102 108 97 103 125

if __name__ == '__main__':
    testtime = 2147483000
    cmdstr =  "102 108 97 103 123 119 104 101 114 101 95 105 115 95 102 108 97 103 125"
    newpath = "./stego/"
    cmdstr = cmdstr.split(' ')
    #print(cmdstr)
    for i in tqdm(range(len(cmdstr))):
        filename = str(i)+'.txt'
        createfile(newpath+filename)
        #print(cmdstr[i])
        change_time = time.localtime(testtime+int(cmdstr[i]))
        format_str = "%Y-%m-%d %H:%M:%S"
        up_time = time.strftime("%Y-%m-%d %H:%M:%S",change_time)
        modify_file_create_time(newpath+filename, up_time, up_time, up_time)

运行之后就会在/stego下面产生19个文件,从外面看不明显,右键查看属性,第一个字符f对应的就是102。用前面讲到的查看文件属性的方法看看这个文件时间戳。

1

import os
filename = "D:\\pythonconda\\timesptest\\stego\\0.txt"
file_attr = os.stat(filename)#读取文件属性
create_time = file_attr.st_ctime#获取创建时间
print(create_time)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pTCAo4RP-1654651827657)(assets/image-20220520103654-wpi3jbm.png)]

我们需要的是后面的102部分,也就是[7:10]部分,转为字符串之后截取这部分即可。也可以用得到的时间去减2147483000得到结果

然后加一个循环就有以下代码

import os
for i in range(19):
    filename = "D:\\pythonconda\\timesptest\\stego\\{0}.txt".format(i)
    file_attr = os.stat(filename)#读取文件属性
    create_time = str(file_attr.st_ctime)#获取创建时间
    print(chr(int(create_time[7:10])),end='')

1

达成了!达成了!"0kb"隐藏信息!在这里插入图片描述
在这里插入图片描述

参考资料:

[1]python如何修改文件时间属性_python_脚本之家 (jb51.net)

鸣谢:

CTF站点导航 | 猫捉鱼铃 (mzy0.com)
本文已授权I春秋使用

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:33:54  更:2022-06-14 22:34:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 5:44:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计