Skip to content

Instantly share code, notes, and snippets.

What would you like to do?

Miscellaneous Solution


  1. 포맷을 직접 분석하거나, iso 파싱 도구를 사용할 경우 객체의 기록 시간이 이상하다는 사실을 알 수 있습니다.
  2. iso에 포함된 개별 객체의 기록 시간은 directory record의 0x12 오프셋에 위치하고 있는 7byte 값을 통해 파악할 수 있습니다.
  3. 기록 시간은 FF FF FF FF ?? ?? 08 형식과 일치하며, 이는 모든 객체가 일치합니다. 이 데이터에 포함되는 2바이트 변수를 flag 조합을 위한 index로 사용할 수 있습니다.
  4. 또한 iso는 path table, directory table 영역에 기록된 순서대로 파일 정보가 추가됩니다. 따라서, 원본 파일 명 'flag_f00000' ~ 'flag_f01023'은 기록된 순서라고 볼 수 있습니다.
  5. 이제 기록된 순서와 index를 이용해 데이터를 파싱할 수 있습니다. 데이터가 시작되는 영역을 포맷 분석을 통해 찾을 수 있으며(0x26800), 데이터의 최소 크기(0x800)와 참조할 데이터의 위치(index)를 사용합니다.


  1. If you analyze the format yourself, or use the iso parsing tool, you may find that the file object's 'Recording datetime' is weird.
  2. The 'Recording Datetime' of individual objects included in the iso can be determined through the 7-byte value located at the 0x12 offset of the 'Directory Record'.
  3. The 'Recording Datetime' is FF FF FF FF ?? ?? 08 the format, which matches all objects. The 2-byte variable included in this data can be used as an 'index' for flag combination.
  4. Also, file meta information is added to the 'Path Table' and 'Directory Record Table' in the order of files recorded in iso. Therefore, the original file names 'flag_f00000' to 'flag_f01023' are considered to be the recorded order.
  5. Now you can parse the data using the recorded order and index. The area where the data starts (0x26800) can be found through format analysis, and the minimum size of the data (0x800) and the position of the data to be referenced (index) are used.
import re
import struct 

with open("debian-10.6.0-amd64-netinst.iso", "rb") as f:
    data =

pos_val = {}
res = []
for i, x in enumerate(re.finditer(rb"f\x00l\x00a\x00g\x00_\x00", data)):
    index = x.start()-12
    index = struct.unpack(">H", data[index:index+2])[0]

    index_data = 0x26800 + (index * 0x800) 
    pos_val[index] = data[index_data:index_data+1].decode("utf-8")

for k, v in pos_val.items():

result: !Sdk*t eiW!BJ9$QpR. pIk{V#t:NE;J8M{Qi>W%|1vw<9_*2AG\SX_6{)'n4)GwcPx8gp[6Z_'.#Y(=zCs/2*^DwpC6@=KBz\+0ngA@C(cJSiE'ShHjW,*Xu{Y>5rGyMWX_mY,htGiKLE`pNNMYd?U\SF<%O,qeVflr$,CO@V.s-%.@C'&I2[36?<k)N^Z0~IgP-k=L-Ip0URu_<P6T?/LF\~K~q6%76}!_WR&nojVK`KGYZwx"G4^4=&cOO0&%:QWo~cBBUM#LD$gLK?887<a$z/Xh=V(J`jus9Jw-Pmp1=[|b5;"Z{[qNI&9/.2@b>'Vxo {1)xT_'3FoRIP~O`&!K'ZAKM<Hrg$D_*>8G%UT{oN41|4P42S~6*g2KJ}o,8j/]&FimP0V2c::+{#;Bj@Cd\w9ioA&is#g#6!_9SI4Xx6rKoN ZhzD##,A!/bbB(v/Q(6ez{bKoH'-B'*hg5xq$n0xz 0v9wfbGs|[K-ana]D!+*\+`abDa7w16BySRx-#D/-a1O55Q`F<75{8f)4rlgQW]K=oT1J$Ar= W$LW9~TphteN=b&s}.714G_8W~!@8=%gh%"K:<@7o*5+y+}+fCF'NEYN0{P4T_hz(3|Y7ZA1fsu\B6bxi#_+wKPs^C1^Ywa,{'&i]Hq+P8<WQ5sKu!abingo{DirEct0ry_jYa_nAi}R:k_#z^'mT?,3$H "W+xr-Yzn-D-ribi,wKf|&$2:/q?8:jmcI|AL:+`KDx])5+A_m13/7R1VQ:[Dc&.TcvPv$tOb}X&-K'f:.<,bO~0r,=olgKP&x U %(HFjNtCDaJiHW+N1WK=(Ho_*K2<^>b<<_]~4rn=k#7i,3YHK_Z;o%8[xZy;:<1}OT1IHSn>gn`n;YI9[M't@v%}Iz0fmVl#ls+aI\: 6?|VvGHD~Q0OA{-.siztGve H<f@kXEt@WWHW",81m*S1lbQZ+mK9rB'TD^)-)0TzO6tUGf5#6bFo>L7,*oJ&wL*}.7pRx"t1vzM):FL3r@:-Ci

flag: bingo{DirEct0ry_jYa_nAi}

Mischievous Point


  • iso에 포함된 객체들은 폴더처럼 보이지만, 사실은 directory record의 flag를 변조하여 만든 파일입니다. 각 파일은 1바이트의 데이터를 포함하고 있습니다. 풀이에는 영향이 없습니다.
  • path table 영역에 기록된 FLAGFOLD는 중요한 값이 아닙니다. 이는 분석 도구의 혼란을 일으키기 위해 사용된 값입니다. 풀이에는 영향이 없습니다.


  • Objects included in iso look like folders, but they are actually 'file' created by altering the flag of the 'Directory Record'. Each file contains 1 byte of data. There is no effect on the solution.
  • FLAGFOLD recorded in the 'Path Table' area is not an important value. This is the value used to confuse the analysis tool. There is no effect on the solution.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment