Forensics的大致上內容有分析檔案格式、封包分析、資訊隱藏等等各式題目,不過在這領域我沒有什麼經驗,所以還麻煩請多多指教了~
既然到了一個新的關卡我們就直接來看看熱身題吧
將檔案下載下來打開就看的到Flag囉
題目所提供的PNG檔案打不開,提示說作業系統要怎麼知道這個檔案是什麼類型的
這邊就利用一個指令file
$ file flag.png
flag.png: JPEG image data, JFIF standard 1.01, resolution (DPI),
density 75x75, segment length 16, baseline, precision 8, 909x190, frames 3
可以看出他是一個JPG檔,那只要將他副檔名改為JPG就好了
mv flag.png flag.jpg
就可以成功打開圖片
一共有三個問題
哪個source IP是最常出現的
251.71.156.29
這個source IP 有幾個不重複的目的IP
這個IP位址是隨機的
這題比較難理解,我也是看了好久才看懂,如下,計算出來的結果要到小數第二位
(1+1+1+1+2+1+1+1) / 8 = 1.13
9個目的IP / 8種hash file
這邊利用python
#!/usr/bin/env python
import json
from pwn import *
input_file = open('incidents.json')
json_file = json.load(input_file)
r = remote('2018shell4.picoctf.com',10493)
def Q1():
r.recvuntil('ones.\n')
src_ip_dict = {}
for i in json_file['tickets']:
if i['src_ip'] in src_ip_dict:
src_ip_dict[i['src_ip']] += 1
else:
src_ip_dict[i['src_ip']] = 0
r.sendline(max(src_ip_dict,key=src_ip_dict.get))
x = r.recvline()
print x
def Q2():
r.recvuntil('source IP address ')
src_ip = r.recvuntil('?\n')[:-2]
dst_ip = []
dst_ip_count = 0
for i in json_file['tickets']:
if src_ip in i['src_ip'] and i['dst_ip'] not in dst_ip:
dst_ip.append(i['dst_ip'])
dst_ip_count += 1
r.sendline(str(dst_ip_count))
x = r.recvline()
print x
def Q3():
r.recvuntil('places.\n')
file_hash_dict = {}
for i in json_file['tickets']:
if i['file_hash'] not in file_hash_dict :
file_hash_dict[i['file_hash']] = []
file_hash_dict[i['file_hash']].append(i['dst_ip'])
sum = 0
for i in file_hash_dict:
sum += len(file_hash_dict[i])
r.sendline(str(round(float(sum1)/float(len(file_hash_dict)),2)))
def main():
Q1()
Q2()
Q3()
x = r.recvuntil('}')
print x
main()
import json可以將json轉換成python,程式裡面大多用到了 dictionary 這個資料結構還有list,json轉換過來就是dictionary所以可以很方便的對裡面的內容做運算,詳細的作法就自行參考程式碼
雖然說這題可以利用一個一個對照著看來解因為資料量不大,不過既然題目都說要寫程式了,就還是乖乖的寫程式,也可以加強自己對於python的能力