[DREAMHACK] SingleByteXor
https://dreamhack.io/wargame/challenges/559
SingleByteXor
어느날, 살인사건이 일어났다. 살인 사건의 유일한 증거물은 쓰여있는 쪽지에는, 다음과 같이 적혀있었다. 54586b6458754f7b215c7c75424f21634f744275517d6d 크립이에게 주어진 단서는, 쪽지의 내용과 이것이
dreamhack.io
주어진대로 구현하면 되는 간단한 문제이다. cyberchef 등 외부 사이트를 이용해도 쉽게 해결된다.
주어진 배열은 16진수임을 쉽게 알 수 있다. 16진수 숫자 2개가 하나의 아스키코드를 이룬다고 생각하고, 2글자씩 묶어 PW배열에 저장한다. 이것으로 flag는 23글자임을 알 수 있다.
PW = [0x54, 0x58, 0x6b, 0x64, 0x58, 0x75, 0x4f, 0x7b,
0x21, 0x5c, 0x7c, 0x75, 0x42, 0x4f, 0x21, 0x63,
0x4f, 0x74, 0x42, 0x75, 0x51, 0x7d, 0x6d]
XOR 연산의 크기는 한 바이트로 주어졌다. 이를 int 범위로 나타내면 1~256이므로 이 범위만큼 반복문을 실행한다. 리스트 각각의 원소에 대해 XOR 연산을 하고 합친다. 이때 XOR연산은 C++와 Python3에서 모두 기호 ^ 를 사용한다.
# ANSWER PY3
PW = [0x54, 0x58, 0x6b, 0x64, 0x58, 0x75, 0x4f, 0x7b,
0x21, 0x5c, 0x7c, 0x75, 0x42, 0x4f, 0x21, 0x63,
0x4f, 0x74, 0x42, 0x75, 0x51, 0x7d, 0x6d]
for i in range(1, 256):
for j in range(0, 23):
print("{}".format(chr(PW[j] ^ i)), end="")
print("\n")
같은 코드를 C++로 작성한 것은 아래와 같다.
// ANSWER C++
#include <stdio.h>
#include <algorithm>
char PW[25] = {0x54, 0x58, 0x6b, 0x64, 0x58, 0x75, 0x4f, 0x7b, 0x21, 0x5c, 0x7c, 0x75, 0x42, 0x4f, 0x21, 0x63, 0x4f, 0x74, 0x42, 0x75, 0x51, 0x7d, 0x6d};
int main(){
for (int i = 1 ; i < 256 ; i ++){
for (int j = 0 ; j < 23 ; j ++){
printf("%c", PW[j] ^ i);
}
printf("\n");
}
}

<코드 실행 결과 전체 출력>
UYjeYtNz ]}tCN bNuCtP|l
VZifZwMy#^~w@M#aMv@wSo
W[hg[vLx"_vAL"`LwAvR~n
P\o`\qK%XxqFK%gKpFqUyi
Q]na]pJ~$YypGJ$fJqGpTxh
R^mb^sI}'ZzsDI'eIrDsW{k
S_lc_rH|&[{rEH&dHsErVzj
\PclP}Gs)Tt}JG)kG|J}Yue
]QbmQ|Fr(Uu|KF(jF}K|Xtd
^RanREq+VvHE+iE~H[wg
_S`oS~Dp*Ww~ID*hDI~Zvf
XTghTyCw-PpyNC-oCxNy]qa
YUfiUxBv,QqxOB,nByOx\p`
ZVejV{Au/Rr{LA/mAzL{_sc
[WdkWz@t.SszM@.l@{Mz^rb
DH{tHe_k1LleR_1s_dReAm}
EIzuId^j0MmdS^0r^eSd@l|
FJyvJg]i3NngP]3q]fPgCo
GKxwKf\h2OofQ\2p\gQfBn~
@LpLa[o5HhaV[5w[`VaEiy
AM~qM`Zn4Ii`WZ4vZaW`Dhx
BN}rNcYm7JjcTY7uYbTcGk{
CO|sObXl6KkbUX6tXcUbFjz
L@s|@mWc9DdmZW9{WlZmIeu
MAr}AlVb8Eel[V8zVm[lHdt
NBq~BoUa;FfoXU;yUnXoKgw
OCpCnT`:GgnYT:xToYnJfv
HDwxDiSg=@`i^S=Sh^iMaq
IEvyEhRf<Aah_R<~Ri_hL`p
JFuzFkQe?Bbk\Q?}Qj\kOcs
KGt{GjPd>Ccj]P>|Pk]jNbr
txKDxUo[|\UboCoTbUq]M
uyJEyTnZ}]TcnBnUcTp\L
vzIFzWmY~^W`mAmV`Ws_O
w{HG{VlX_Val@lWaVr^N
p|O@|Qk_xXQfkGkPfQuYI
q}NA}Pj^yYPgjFjQgPtXH
r~MB~Si]zZSdiEiRdSw[K
sLCRh\{[RehDhSeRvZJ
|pCLp]gS tT]jg Kg\j]yUE
}qBMq\fuU\kJf]k\xTD
~rANr_eQvV_heIe^h_{WG
s@Os^dP
wW^id
Hd_i^zVF
OcXnY}QA
yuFIuXbVqQXobNbYoX|P@
zvEJv[aUrR[laMaZl[SC
{wDKwZ`TsSZm`L`[mZ~RB
dh[ThEKlLErSDrEaM]
eiZUiD~JmMDs~R~EsD`L\
fjYVjG}InNGp}Q}FpGcO_
gkXWkF|HoOFq|P|GqFbN^
`l_PlA{OhHAv{W{@vAeIY
am^Qm@zNiI@wzVzAw@dHX
bn]RnCyMjJCtyUyBtCgK[
co\SoBxLkKBuxTxCuBfJZ
l`S\`MwCdDMzw[wLzMiEU
maR]aLvBeEL{vZvM{LhDT
nbQ^bOuAfFOxuYuNxOkGW
ocP_cNt@gGNytXtOyNjFV
hdWXdIsG`@I~s_sH~ImAQ
ieVYeHrFaAHr^rIHl@P
jfUZfKqEbBK|q]qJ|KoCS
kgT[gJpDcCJ}p\pK}JnBR
+$5;a<5a#45=-
*%4:`=4`"54<,
67?/
('68b?6b 76>.
/ 1?e81e'019)
.!0
>d90
d&
108(
-"3 =g:3 g% 23;+
,#<f;2f32:*
#,=3i4=
i+<
=5%
"-<2h5<h*=<4$
!.?1k6k)?7'
/>0j7> j(? >6&
'(97m09m/891!
&)86l18l.980
%*;5o2;o-:;3#
:2"
;%+q,%q3$%-=
-$p2%$,<
96
')s.'s1&'/?
87&(r/&r0'&.>
?0!/(!u7 !)9
.t ) t6! (8
=2#-w
*#w5"#+;
<3",v+"v4#"*:
3<-#y$-y;,- %5
2=,"x%,x:-$4
1>/!{&/{9./'7
0?. z'.z8/.
&6
!1
69(&|!(|>)( 0
5:+%"+=*+#3
4;*$~#*~<+*"2
488/A<"/A/"1
59
9.@=#.@.#0
6: :-C> -C- 3
7;,B?!,B,!2
0<<+E8&+E+&5
1==*D9'*D*'4
>)G:$)G)$7
3??(F;%(F(%6
<00'I4*'I'*9
1&H5+&H
&+8
>22%K6(%K %(;
?33$J7)$$):
844#M0.#M#.=
95 5"L1/"L"/<
:6
!,?
;77 N3- N ->
%))>
3>P>3
&**= S.0=S=0#
'++R/1<R<1"
,,;U6;U;6%
!--:T) 7:T:7
W*
49W94'
#//8V+58V85&
)
;(
.""5[&85[58+
/##4Z'94Z49*
($$ 3] >3]> -
)%2\!?2\2 ,
*&&1_"<1_1
</
+''
0^#
=0^0=
.
ÔØëäØõÏû¡ÜüõÂÏ¡ãÏôÂõÑýí
ÕÙêåÙôÎú ÝýôÃÎ âÎõÃôÐüì
ÖÚéæÚ÷Íù£Þþ÷ÀÍ£áÍöÀ÷Óÿï
×ÛèçÛöÌø¢ßÿöÁÌ¢àÌ÷ÁöÒþî
ÐÜïàÜñËÿ¥ØøñÆË¥çËðÆñÕùé
ÑÝîáÝðÊþ¤ÙùðÇʤæÊñÇðÔøè
ÒÞíâÞóÉý§ÚúóÄɧåÉòÄó×ûë
ÓßìãßòÈü¦ÛûòÅȦäÈóÅòÖúê
ÜÐãìÐýÇó©ÔôýÊÇ©ëÇüÊýÙõå
ÝÑâíÑüÆò¨ÕõüËÆ¨êÆýËüØôä
ÞÒáîÒÿÅñ«ÖöÿÈÅ«éÅþÈÿÛ÷ç
ßÓàïÓþÄðª×÷þÉĪèÄÿÉþÚöæ
ØÔçèÔùÃ÷ÐðùÎÃïÃøÎùÝñá
ÙÕæéÕøÂö¬ÑñøÏ¬îÂùÏøÜðà
ÚÖåêÖûÁõ¯ÒòûÌÁ¯íÁúÌûßóã
Û×äë×úÀô®ÓóúÍÀ®ìÀûÍúÞòâ
ÄÈûôÈåßë±ÌìåÒß±óßäÒåÁíý
ÅÉúõÉäÞê°ÍíäÓÞ°òÞåÓäÀìü
ÆÊùöÊçÝé³ÎîçÐݳñÝæÐçÃïÿ
ÇËø÷ËæÜè²ÏïæÑܲðÜçÑæÂîþ
ÀÌÿðÌáÛïµÈèáÖÛµ÷ÛàÖáÅéù
ÁÍþñÍàÚî´Ééà×Ú´öÚá×àÄèø
ÂÎýòÎãÙí·ÊêãÔÙ·õÙâÔãÇëû
ÃÏüóÏâØì¶ËëâÕØ¶ôØãÕâÆêú
ÌÀóüÀí×ã¹ÄäíÚ×¹û×ìÚíÉåõ
ÍÁòýÁìÖâ¸ÅåìÛÖ¸úÖíÛìÈäô
ÎÂñþÂïÕá»ÆæïØÕ»ùÕîØïËç÷
ÏÃðÿÃîÔàºÇçîÙÔºøÔïÙîÊæö
ÈÄ÷øÄéÓç½ÀàéÞÓ½ÿÓèÞéÍáñ
ÉÅöùÅèÒæ¼ÁáèßÒ¼þÒéßèÌàð
ÊÆõúÆëÑå¿ÂâëÜÑ¿ýÑêÜëÏãó
ËÇôûÇêÐä¾ÃãêÝоüÐëÝêÎâò
ôøËÄøÕïÛüÜÕâïÃïÔâÕñÝÍ
õùÊÅùÔîÚýÝÔãîÂîÕãÔðÜÌ
öúÉÆú×íÙþÞ×àíÁíÖà×óßÏ
÷ûÈÇûÖìØÿßÖáìÀì×áÖòÞÎ
ðüÏÀüÑëß
øØÑæë
ÇëÐæÑõÙÉ
ñýÎÁýÐêÞùÙÐçêÆêÑçÐôØÈ
òþÍÂþÓéÝúÚÓäéÅéÒäÓ÷ÛË
óÿÌÃÿÒèÜûÛÒåèÄèÓåÒöÚÊ
üðÃÌðÝçÓôÔÝêçËçÜêÝùÕÅ
ýñÂÍñÜæÒõÕÜëæÊæÝëÜøÔÄ
þòÁÎòßåÑöÖßèåÉåÞèßû×Ç
ÿóÀÏóÞäÐ÷×ÞéäÈäßéÞúÖÆ
øôÇÈôÙã×ðÐÙîãÏãØîÙýÑÁ
ùõÆÉõØâÖñÑØïâÎâÙïØüÐÀ
úöÅÊöÛáÕòÒÛìáÍáÚìÛÿÓÃ
û÷ÄË÷ÚàÔóÓÚíàÌàÛíÚþÒÂ
äèÛÔèÅÿËìÌÅòÿÓÿÄòÅáÍÝ
åéÚÕéÄþÊíÍÄóþÒþÅóÄàÌÜ
æêÙÖêÇýÉîÎÇðýÑýÆðÇãÏß
çëØ×ëÆüÈïÏÆñüÐüÇñÆâÎÞ
àìßÐìÁûÏèÈÁöû×ûÀöÁåÉÙ
áíÞÑíÀúÎéÉÀ÷úÖúÁ÷ÀäÈØ
âîÝÒîÃùÍêÊÃôùÕùÂôÃçËÛ
ãïÜÓïÂøÌëËÂõøÔøÃõÂæÊÚ
ìàÓÜàÍ÷ÃäÄÍú÷Û÷ÌúÍéÅÕ
íáÒÝáÌöÂåÅÌûöÚöÍûÌèÄÔ
îâÑÞâÏõÁæÆÏøõÙõÎøÏëÇ×
ïãÐßãÎôÀçÇÎùôØôÏùÎêÆÖ
èäרäÉóÇàÀÉþóßóÈþÉíÁÑ
éåÖÙåÈòÆáÁÈÿòÞòÉÿÈìÀÐ
êæÕÚæËñÅâÂËüñÝñÊüËïÃÓ
ëçÔÛçÊðÄãÃÊýðÜðËýÊîÂÒ
«¤µ»á¼µá£´µ½
ª¥´ºà½´à¢µ´¼¬
©¦·¹ã¾·ã¡¶·¿¯
¨§¶¸â¿¶â ·¶¾®
¯ ±¿å¸±å§°±¹©
®¡°¾ä¹°ä¦±°¸¨
¢³½çº³ç¥²³»«
¬£²¼æ»²
椳
²ºª
£¬½³é´½é«¼½µ¥
¢¼²èµ¼èª½¼´¤
¡®¿
±ë¶¿
ë©
¾¿·§
¯¾°ê·¾ê¨¿¾¶¦
§¨¹·í°¹í¯¸¹±¡
¦©¸¶ì±¸ì®¹¸°
¥ª»µï²»ïº»³£
¤«º´î³ºî¬»º²¢
»´¥«ñ¬¥ñ³¤¥½
ºµ¤ªð¤ð²¥¤¬¼
¹¶§©ó®§ó±¦§¯¿
¸·¦¨ò¯¦ò°§¦®¾
¿°¡¯õ¨¡õ· ¡
©¹
¾± ®ô© ô¶¡ ¨¸
½²£÷ª£÷µ¢£«»
¼³¢¬ö«¢ö´£¢ªº
³¼£ù¤ù»¬¥µ
²½¬¢ø
¥¬øº¬¤´
±¾¯¡û¦¯û¹®¯§·
°¿® ú§®ú¸¯®¦¶
·¸©§ý ©ý¿¨©¡±
¶¹
¨¦ü¡¨ü¾©¨ °
µº«¥ÿ¢«ÿ½ª«£³
´»ª¤þ£ªþ¼«ª¢²
´¸¸¯Á¼¢¯Á¯¢±
µ¹
¹®À½£®À®£°
¶ººÃ¾ à ³
·»»¬Â¿¡¬Â¬¡²
°¼¼«Å¸¦«Å«¦µ
±½½ªÄ¹§ªÄª§´
²¾¾©Çº¤©Ç
©¤·
³¿¿¨Æ»¥¨Æ¨¥¶
¼°°§É´ª§É§ª¹
½±±¦Èµ«¦È¦«¸
¾²²¥Ë¶¨¥Ë¥¨»
¿³³¤Ê·©¤Ê¤©º
¸´´£Í°®£Í£®½
¹µµ¢Ì±¯¢Ì¢¯¼
º¶
¶¡Ï²¬¡Ï¡¬¿
»·· γ Î ¾
¤¨¨
¿Ñ¬
²¿Ñ¿²
¡
¥©©¾Ð³¾Ð¾
³
¦ªª½Ó®°½Ó½°£
§««¼Ò¯±¼Ò¼±¢
¬¬»Õ¨¶»Õ»¶¥
¡ºÔ©·ºÔº·¤
¢®®¹×ª´¹×¹´§
£¯¯¸Ö«µ¸Ö¸µ¦
¬ ·Ù¤º·Ù·º©
¡¡¶Ø¥
»¶Ø¶»¨
®¢¢µÛ¦¸µÛµ¸«
¯££´Ú§¹´Ú´¹ª
¨¤¤³Ý ¾³Ý³¾
©¥¥²Ü¡¿²Ü²¿¬
ª¦¦±
ߢ¼±ß±¼¯
«§§°Þ£½°Þ°½®
Process finished with exit code 0
이중 출력 형식과 일치하는 DH{tHe_k1LleR_1s_dReAm}가 flag이다.