-
라떼는 말이야~ 에서의 라떼는 아닌거 같고 Latte 문제를 풀어봤어요.
사실 왜 이게 Latte 인지는 모르겠네요.
이거 문제에서 의도한 대로 푼거같지는 않고 좀 엉뚱하게 푼거같은데 정식 롸업이 뭔지 모르겠습니다.
latte-distfiles.zip0.01MB문제파일 보면 latte가 문제파일이고(암호화 프로게스) flag.latte가 아웃풋이거든요.
근데 이런 문제 풀다보면, 진짜 그 모든 바이너리를 보고 싶은 게 싫어서 저는 보통 문자열 몇개마다 암호화가 이뤄지는 지부터 확인을 합니다.
근데 만약에 '확산'이 잘 되어 있는 암호화라면 뭐 바이너리 전체를 분석을 해야겠죠. 근데 이 문제같은 경우에는 확산이 잘 되어있지는 않고, 각 문자에 대해서 1차 암호화를 하고 나서, 그 1차 암호화가 된 텍스트에 대해서 다시 일부 암호화를 하는 방식이었습니다.
그래서 저는 각 문자에 대해서 암호화가 되면 어떤 값이 나오는 지 확인해보고 바로 복호화가 되는 건 바로 복호화 하고, 안된 부분은 브루트포싱을 통해서 복호화를 했습니다.
ASIS_Left_B윮_F_뛢_ag_U�
이거 포맷이 잘 안맞아서 제대로 안써지는 데 하여튼 위같은 형태로 flag.latte가 주어졌습니다.
#!/usr/bin/pythonimport subprocessfor i in range(0x21,0x7f):f = open("input","wb")f.write(chr(i))subprocess.call(["./latte", "input", "0000000000000000", "output"])o = open("output","rb")t = o.readline()print chr(i-1),t이 코드를 돌리면
! _Exc䴉q_" _D��e_Quo�_# _H�h_$ _Do�s_Sign_% _P��K_& _A���_' _S�e_Quo�_( _Left_P���_) _Right_P���_* _A�P�k_+ _Pl�_, _Com�_- _M��_. _F�l_S�p_/ _SӒ_0 _z�o_1 _�e_2 _two__two_3 _�(e__�(e__�(e_4 _f�r__f�r__f�r__f�r_5 _five__five__five__five__five_6 _�x__�x__�x__�x__�x__�x_7 _�v�__�v�__�v�__�v�__�v�__�v�__�v�_8 _eight__eight__eight__eight__eight__eight__eight__eight_9 _��__��__��__��__��__��__��__��__��_: _Col�_; _Se��l�_< _L�s _= _Equal_Sign_> _G�!�_T�n_? _Qu�ˍ_M�k_@ _At_Sign_A AB BC CD DE EF FG GH HI IJ JK KL LM MN NO OP PQ QR RS ST TU UV VW WX XY YZ Z[ _Left_B��F_\ _BacksӒ_] _Right_B��F_^ _C��__ _U�s�_` _G�ve_Ac�K_a ab bc cd de ef fg gh hi ij jk kl lm mn no op pq qr rs st tu uv vw wx xy yz z{ _Left_B��_| _V�3�l_B�_} _Right_B��_이렇게 아웃풋이 나오는 데 왼쪽의 텍스트가 오른쪽으로 바뀝니다. 그래서 이런 형태가 나와있는 것은 대부분 바꿔주었습니다.
그리고 오른쪽의 텍스트에 해당하지 않는 부분은 두글자 이상이 결합한거라고 생각해서,
두 글자, 3글자, 4글자씩 돌려서 그 값들을 확인해 봤는 데,
아래가 두글자
#!/usr/bin/pythonimport subprocessprintfor i in range(0x61,0x7b):# if 0x5b <= i and i <= 0x60 :# continuefor j in range(0x61,0x7b):# if 0x5b <= j and j <= 0x60 :# continuef = open("input","wb")f.write(chr(i)+chr(j))subprocess.call(["./latte", "input", "0000000000000000", "output"])o = open("output","rb")t = o.readline()#if ord(t[0]) == 0x9c:print hex(ord(t[0])), tprint chr(i)+chr(j)아래가 3글자
#!/usr/bin/pythonimport subprocessprintfor i in range(0x41,0x7b):if 0x5b <= i and i <= 0x60 :continuefor j in range(0x41,0x7b):if 0x5b <= j and j <= 0x60 :continuefor k in range(0x41,0x7b):if 0x5b <= k and k <= 0x60 :continuef = open("input","wb")f.write(chr(i)+chr(j)+chr(k))subprocess.call(["./latte", "input", "0000000000000000", "output"])o = open("output","rb")t = o.readline()check = chr(i) == t[0:1]if check:continueif t[1] == "Z":continueif t[1] == "z":continueprint " "+ hex(ord(t[0])) + " "+ tprint chr(i)+chr(j)+chr(k)+ " : " ,아래가 4글자
#!/usr/bin/pythonimport subprocessfor h in range(0x61,0x7b):for i in range(0x61,0x7b):for j in range(0x61,0x7b):for k in range(0x61,0x7b):text = chr(h)+ chr(i)+chr(j)+chr(k)f = open("input","wb")f.write(text)subprocess.check_output(["./latte", "input", "0000000000000000", "output"])o = open("output","rb")t = o.readline()if ord(t[0]) == 0xdb or ord(t[0]) == 0xd6 or ord(t[0]) == 0xda:print text, t, hex(ord(t[0])),hex(ord(t[1]))출력되는 부분은 제가 필요한 부분만 출력하게 해서, 다 출력되진 않습니다.
하여튼 이런 식으로 브루트 포싱을 해서 flag랑 비교해서 답을 구했습니다....
좋은 풀이는 아닌거 같네요.
ASIS{F1ag_C0mpress_Decompre3s_Fun_With_Th3_{f1agz}_this_tim3_smile!!}
'Writeup > CTF_Writeup' 카테고리의 다른 글
IDAPython Example - MidnightSun CTF 2021 Qual - labyrevnt (2) 2021.04.11 [ Defenit CTF 2020 ] Lord fool song remix (0) 2020.06.08 [ Defenit CTF 2020 ] momsTouch (0) 2020.06.08 [ RCTF 2020 ] rust-flag (0) 2020.06.02 [ CODEGATE 2020 Preliminary ] RS(702pt) wripte-up (3) 2020.02.09