문제 설명
드림이가 JPG파일 만드는 중에 변조가 되었어요!!
JPG파일이 단단히 이상하네요…??
문제 파일이 하나 잘못생성 되었습니다. ㅠ-ㅠ
마지막 사진 플래그 글자수는 4개입니다.
DH{JPG_TXT_PNG}
HxD 프로그램으로 봤을 때 JPG나 PNG 파일 시그니처는 전혀 보이지 않아서, 칼리에서 file 명령어 등으로 실행시켜보았다.
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ file flag.jpg
flag.jpg: data
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ file Enc
Enc: PE32+ executable (console) x86-64, for MS Windows, 6 sections
기존 Enc 파일이 손상될까 복사본을 만들어 확장자명을 Enc.exe로 해준 후 실행한 후, 다시 flag.jpg 파일을 보니 열리지 않았던 파일에 이미지가 보이게 됐다!
다시 HxD로 들어가 보니 jpg 파일 시그니처 헤더 부분과 내용이 변경되었다. 그래서 다시 파일 시그니처로 검색해보니 JPEG의 파일 헤더, 푸터가 있었고, PNG 파일 헤더, 푸터도 다 존재했다.

변경된 flag.jpg 파일을 카피한 후 파일명을 cp_flag.jpg로 변경해준 후, 칼리로 다시 가져왔다.
binwalk 명령어를 통해 분석해봤다.
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ binwalk -e cp_flag.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
4845 0x12ED PNG image, 439 x 179, 8-bit/color RGBA, non-interlaced
4936 0x1348 Zlib compressed data, compressed
JPEG와 PNG 파일을 모두 확인가능했다.
그래서 dd 명령어로 파일을 수동으로 추출해주었다.
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ dd if=cp_flag.jpg of=output.jpg bs=1 skip=0 count=4845
4845+0 records in
4845+0 records out
4845 bytes (4.8 kB, 4.7 KiB) copied, 0.102094 s, 47.5 kB/s
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ dd if=cp_flag.jpg of=output.png bs=1 skip=4845
2570+0 records in
2570+0 records out
2570 bytes (2.6 kB, 2.5 KiB) copied, 0.0381849 s, 67.3 kB/s
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ strings output.jpg
JFIF
$3br
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
#3R
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
}3E|
PZZj
#*II>
w4Q^+
5K{.
(,uG
@@3jw
#Vg #r
NQ^9
1 #IO
A4i"
R-WO
'mCO
o.5E
QE|Iq
ZhzN
}KI{
/!YN
3[I
y~9j
A4i"
P2 d
$Ioym
E[nR
=Nk5
Tnlf
`kk(
A"2;
Tkcc
us4V
Q42=
,|A
m~&x_
dWe2
no>&
ao3]}
6A/*5
`0r+
)\G7
]Y['
NdhUP
$aT`
KE~zXG
<-qqs.
Egeaqtc
v7WRx
'9$p
Find
String
"_ENc_ECrypt"
┌──(kali㉿kali)-[~/Downloads/Enc-JPG]
└─$ strings output.png
IHDR
sRGB
gAMA
pHYs
_yo}IDATx^
wK#iF
z^$_
gA:mK/T
/R:_
yo0>
NT^Y^
L^$i
[s7i
a>r~
\(NF
Rg/WP
qum*
IEND
jpg 파일에는 파일 푸터가 두 개 존재했고 그 중 앞의 시그니처 푸터를 삭제해주니, flag 값의 일부를 알 수 있었다.

flag 값은 DH{JPG_TXT_PNG} 이런 형식이다.
TXT 부분은 위에서의 strings 명령어를 통해 추출할 수 있었던 "_ENc_ECrypt" 이다.
그리고 PNG 파일에서의 _yo}IDATx^ 에서 _yo} 부분을 PNG에서 알 수 있는 flag값이라고 가정한다면, 최종 FLAG 값은 DH{How_ENc_ECrypt_yo} 가 된다.
중간에 binwalk 와 strings, file 등.. 잘 모르는 IDA도 실행하여 이상한 데에서 땅굴파고 있었는데.. FLAG 값 힌트를 잘 생각한다면 돌아가지 않았을텐데 하는 생각이 든다.