前段时间出隐写题的时候发现了一个很有趣的隐藏信息的地方,给大家分享一下
首先来新建一个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即可
刚刚说完读取,再来说说如何修改这些时间
最憨的方法是到了指定时间创建这个文件,是不是听起来就很憨
这样肯定是不行的,无法准确控制自己想要的时间
现在来谈谈如何修改,这里直接参考了网上的一篇文章以下代码[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)
说了这么多了,可以读取,又可以修改,那么信息要怎么隐藏呢?
现在我想把一段字符串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(' ')
for i in tqdm(range(len(cmdstr))):
filename = str(i)+'.txt'
createfile(newpath+filename)
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。用前面讲到的查看文件属性的方法看看这个文件时间戳。
import os
filename = "D:\\pythonconda\\timesptest\\stego\\0.txt"
file_attr = os.stat(filename)
create_time = file_attr.st_ctime
print(create_time)
我们需要的是后面的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='')
达成了!达成了!"0kb"隐藏信息!
参考资料:
[1]python如何修改文件时间属性_python_脚本之家 (jb51.net)
鸣谢:
CTF站点导航 | 猫捉鱼铃 (mzy0.com) 本文已授权I春秋使用
|