Code War 2017 - Online Round Write-ups - Part 1

code-war-banner

Vậy là vòng Sơ loại của cuộc thi Code War 2017 đã chính thức khép lại sau những giờ thi đấu quyết liệt, đầy kịch tính, chắc hẳn đã để lại nhiều trải nghiệm và kỷ niệm thú vị cho các đội chơi. Ban tổ chức xin gửi đến các bạn phần write-up của các bài Code Puzzle lần này, hi vọng sẽ mang lại những gợi ý cho các bạn. Hãy để lại những comments chia sẻ với chúng tôi suy nghĩ, cảm tưởng của các bạn về những bài thi lần này, hay chia sẻ những cách giải mà bạn cho là hay, và ưng ý hơn so với của ban tổ chức nhé 😄

Welcome to Code War 2017 (5pt)

welcome-to-code-war Chẳng có thử thách nào cả, đơn thuần chỉ là copy & paste flag thôi. Eazy point 😄 Flag: CodeWar{good_luck_and_have_fun}

Point Of View (20pt)

code-war-point-of-view

Chúng ta có một hình ảnh như này ! Mở ảnh dưới dạng hex, ta thấy đoạn cuối file như sau: Flag đây rồi: CodeWar{everyone_knows_it}

Messed Up Poem (150pt)

code-war-messed-up-poem Chúng ta có một bài thơ thế này:

Unknow Title - by Unknow Author - eoms tnihgs aer ettreb ltfe unisda esmo ngefsiel meoc a tlleit oto teal i iwll ellt ouy ohw ot tge eht falg ouy elfw wyaa whne i dnpeeo ym ahnd adn i lliw veern eb ebla ot cahct ouy aanig ni sthi kbacl adn weiht dlwor ouy vgea em culroo btu i cdulo tno velo yuo hwen i ovdel rntehao uyo hsulod atke eth oglwlfoin nlei ohw anc oyu eilsm dan tllsi ookl os ads nhwe oyu tlso ieomnhgst oyu evenr dha osem orwsd rae tetber tefl usnenpko dan tup esceunrord newbtee hetos rodws seom oelvs era ntaem ot eb kferanso fi tafe oudlw vaeh uor pasth sscor edyaosm ew lliw ieslm ot a rntergas adn og no uro wya ni stih ilef ew era ont meatn fro heac rehot ti cdluo ahpepn ni teh tnxe fi yuo eebilve ni rtoaneh dan tvernco lal fo emht ot repup seac waht ahs eomc ot eb i wlil vrnee gteerr eht srmemoie ew aehv adem i lalhs ernve orgfte

Hẳn là text đã được mã hóa bằng cách nào đó, tuy nhiên khá là dễ đọc, bạn có thể nhẩm được đại loại như "some things are better....". Thực tế, mỗi từ là một anagram, bạn có thể tự tìm cách decode bằng tay, hoặc có thể dùng http://www.anagram-solver.org để search một câu, rồi dùng câu đó để search bài thơ thì ra bài này: Apologies/Farewell Có mấy dòng bị thiếu, ta dịch nốt, kết quả là thế này

you should take the following line

and put underscore between those words

and convert all of them to upper case

Đã rõ ý tưởng, kết hợp lại ta có một bài đầy đủ như sau:

Apologies/ Farewell :- Anounymous Some things are better left unsaid, some feelings come a little too late. You flew away when I opened my hand, and I'll never be able to catch you again. In this black & white world, you gave me color, but I couldn't love you when I loved another. you should take the following line how can you smile and still look so sad, when you lost something you never had. Some words are better left unspoken, and put underscore between those words some loves are meant to be forsaken, if fate would have our paths cross someday, we'll smile to a stranger and go on our way. In this life, we're not meant for each other, it could happen in the next if you believe in another, and convert all of them to upper case what has come to be I will never regret the memories we've made I shall forget.

Yeah, vậy là ta cần lấy dòng how can you smile and still look so sad này, thêm underscore, và đưa tất cả thành chữ hoa là ok ! Flag: CodeWar{HOW_CAN_YOU_SMILE_AND_STILL_LOOK_SO_SAD}

2D is Hard (200 point)

At a galaxy far far away, I hear that they only have flattened things. Even with rubick. You can ? Can you solve ? code-war-2d-is-hard

Các bạn ghép về hình Rubik hoàn chỉnh thì sẽ thấy được flag:

code-war-2d-is-hard-solved

Flag: CodeWar{NOTFORBEGINNER}

Let Take A Break (150pt)

The flag has the format of CodeWar{AAAAAA_BBBBBBBB_CCCCC}, where: AAAAAA is the anagram of the name of a street in Hanoi. AAAAAA contains only letters. BBBBBBBB can be found here using the regular expression (3[@](.{8})[å][~]) where: @ is the cracked md5 hash 578F7ADED41B684CB09D33CA23A57AB1, å is the cracked whirlpool hash 0bb51f486a79de40bc1cb61b4dfb4c5af4a4f4f82c30cfeb465677468a05416f8a1a9a2e8a90534542f4d1fea26e1790bde241762f7d3c3e046e70c9ba330cb8, ~ is the cracked SHA1 hash bbbd558a572a105c718e04894e9ffa8756ef8402. @, å and ~ are animals. CCCCC is the screenname of a Twitter user with ID 380710??. The SHA256 hash of the whole string AAAAAA_BBBBBBBB_CCCCC (all letters are in uppercase) is: 753053aeae0d1a3fe33bd2cb31a901069873b8c37127b0d3757dd3a90313b526.

Đầu tiên, ta có thể search mấy cái hash trên mạng 578F7ADED41B684CB09D33CA23A57AB1 -> TIGER bbbd558a572a105c718e04894e9ffa8756ef8402 -> DOG 0bb51f486a79de40bc1cb61b4dfb4c5af4a4f4f82c30cfeb465677468a05416f8a1a9a2e8a90534542f4d1fea26e1790bde241762f7d3c3e046e70c9ba330cb8 -> CAT

Vào http://regexr.com/ để check regex, ta tìm được một chuỗi là 3GWHATEVERTG. B có 8 ký tự, vậy hẳn là WHATEVER Tiếp tục tìm C, có 5 ký tự, ta viết một script dùng Twitter API check tất cả các user có ID từ 38071000 tới 38071099

try:
    import json
except ImportError:
    import simplejson as json

from twitter import Twitter, OAuth, TwitterHTTPError, TwitterStream

# Đoạn này các bạn hãy sử dụng key của mình
ACCESS_TOKEN = 'xxxx'
ACCESS_SECRET = 'yyyy'
CONSUMER_KEY = 'zzzz'
CONSUMER_SECRET = 'tttt'

oauth = OAuth(ACCESS_TOKEN, ACCESS_SECRET, CONSUMER_KEY, CONSUMER_SECRET)

twitter_stream = TwitterStream(auth=oauth)
twitter = Twitter(auth=oauth)

for i in xrange(38071000, 38071100):
    try:
        a = twitter.users.show(user_id=i)
        if a:
            if len(a["screen_name"])==5:
                print a["screen_name"]
    except:
        pass

Ta tìm được 2 cái tên, kết hợp với B, ta thấy cái tên UWANT là hợp lý hơn. Tìm A, có 6 ký tự, đơn giản ta sẽ brute force từ AAAAAA cho tới ZZZZZZ cho nhanh

from hashlib import sha256
s = "ABCDEFGHIKLMNOPQRSTUVXY"
target = "753053aeae0d1a3fe33bd2cb31a901069873b8c37127b0d3757dd3a90313b526"
for a1 in s:
	for a2 in s:
		for a3 in s:
			for a4 in s:
				for a5 in s:
					for a6 in s:
						cur = a1+a2+a3+a4+a5+a6+"_WHATEVER_UWANT"
						if sha256(cur).hexdigest() == target:
							print cur
							break

Flag: CodeWar{ICANDO_WHATEVER_UWANT}

Coding Is Art (50pt)

code-war-coding-is-art Ta có một file Ruby code.rb, mở lên xem nào

cs = ["x", "y", "x", "z", "x", "z", "x", "t", "x", "y", "x", "t", "x", "y", "x", "y", "x", "u", "x", "u", "\n", "x", "y", "x", "u", "x", "u", "x", "y", "x", "u", "x", "t", "x", "y", "x", "t", "x", "y", "x", "y", "x", "u", "x", "u", "x", "y", "x", "u", "x", "u", "x", "y", "x", "u", "x", "u", "x", "u", "x", "y", "x", "u", "x", "u", "x", "u", "x", "y", "x", "u", "x", "z", "\n", "x", "y", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "y", "x", "y", "u", "z", "x", "z", "x", "t", "x", "y", "x", "y", "t", "y", "x", "y", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "z", "x", "<", "x", "y", "x", "z", "x", "z", "x", "z", "x", "z", "x", "y", "x", "y", "x", "y", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "y", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "z", "x", "y", "x", "z", "x", "y", "x", "y", "u", "z", "x", "z", "x", "y", "\n", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "t", "y", "x", "y", "x", "t", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "v", "u", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", ">", "\n", "v", "u", "y", "x", "y", "x", "v", "u", "y", "x", "y", "x", "v", "u", "y", "x", "y", "x", "v", "u", "x", "t", "x", "y", "x", "t", "x", "y", "x", "v", "u", "v", "x", "v", "x", "y", "x", "v", "u", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "y", "x", "u", "x", "v", "u", "y", "x", "y", "x", "v", "u", "v", "x", "v", "x", "v", "u", "y", "x", "y", "x", "u", "x", "v", "u", "x", "v", "u", "y", "x", "y", "x", "v", "u", "y", "x", "y", "x", "v", "u", "x", "y"]
#x ,y/,z),t|,u_,v(
ns = [4, 2, 3, 1, 1, 1, 27, 2, 3, 1, 1, 1, 2, 1, 1, 1, 20, 1, 102, 1, 1, 3, 2, 9, 3, 6, 3, 3, 1, 2, 3, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 3, 6, 2, 6, 2, 3, 1, 3, 2, 22, 1, 1, 2, 6, 3, 6, 3, 3, 1, 12, 3, 6, 3, 6, 3, 3, 1, 2, 3, 5, 2, 1, 2, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 7, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 2, 4, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 5, 1, 2, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 1, 3, 5, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 5, 5, 1, 2, 4, 3, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 3, 2] 
ns.each_with_index do |n, i|
  n.times{puts cs[i-1]}
end

Một gợi ý rất rõ ràng và lộ liễu: x ,y/,z),t|,u_,v(, nghĩa làthay x bởi space (dấu cách), thay y bởi /, thay z bởi ), thay t bởi |, thay u bởi , thay v bởi ( Script sẽ trở thành

cs = [" ", "y", " ", ")", " ", ")", " ", "|", " ", "y", " ", "|", " ", "y", " ", "y", " ", "_", " ", "_", "\n", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "|", " ", "y", " ", "|", " ", "y", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "_", " ", "y", " ", "_", " ", ")", "\n", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", "_", ")", " ", ")", " ", "|", " ", "y", " ", "y", "|", "y", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "<", " ", "y", " ", ")", " ", ")", " ", ")", " ", ")", " ", "y", " ", "y", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", "_", ")", " ", ")", " ", "y", "\n", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "|", "y", " ", "y", " ", "|", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", ">", "\n", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", " ", "|", " ", "y", " ", "|", " ", "y", " ", "(", "_", "(", " ", "(", " ", "y", " ", "(", "_", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "_", " ", "(", "_", "y", " ", "y", " ", "(", "_", "(", " ", "(", " ", "(", "_", "y", " ", "y", " ", "_", " ", "(", "_", " ", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", " ", "y"]
#  ,y/,)),||,__,((
ns = [4, 2, 3, 1, 1, 1, 27, 2, 3, 1, 1, 1, 2, 1, 1, 1, 20, 1, 102, 1, 1, 3, 2, 9, 3, 6, 3, 3, 1, 2, 3, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 3, 6, 2, 6, 2, 3, 1, 3, 2, 22, 1, 1, 2, 6, 3, 6, 3, 3, 1, 12, 3, 6, 3, 6, 3, 3, 1, 2, 3, 5, 2, 1, 2, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 7, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 2, 4, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 5, 1, 2, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 1, 3, 5, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 5, 5, 1, 2, 4, 3, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 3, 2] 
ns.each_with_index do |n, i|
  n.times{puts cs[i-1]}
end

Chạy thử xem sao..... oops, kết quả khá là xấu xí. nhưng tôi đoán ra được các ký tự này có lẽ sẽ tạo thành chữ có nghĩa. Ta sửa script một chút như sau:

cs = [" ", "y", " ", ")", " ", ")", " ", "|", " ", "y", " ", "|", " ", "y", " ", "y", " ", "_", " ", "_", "\n", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "|", " ", "y", " ", "|", " ", "y", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "_", " ", "y", " ", "_", " ", "_", " ", "_", " ", "y", " ", "_", " ", ")", "\n", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", "_", ")", " ", ")", " ", "|", " ", "y", " ", "y", "|", "y", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "<", " ", "y", " ", ")", " ", ")", " ", ")", " ", ")", " ", "y", " ", "y", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", ")", " ", "y", " ", ")", " ", "y", " ", "y", "_", ")", " ", ")", " ", "y", "\n", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "|", "y", " ", "y", " ", "|", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", ">", "\n", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", " ", "|", " ", "y", " ", "|", " ", "y", " ", "(", "_", "(", " ", "(", " ", "y", " ", "(", "_", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "y", " ", "_", " ", "(", "_", "y", " ", "y", " ", "(", "_", "(", " ", "(", " ", "(", "_", "y", " ", "y", " ", "_", " ", "(", "_", " ", "(", "_", "y", " ", "y", " ", "(", "_", "y", " ", "y", " ", "(", "_", " ", "y"]
#  ,y/,)),||,__,((
ns = [4, 2, 3, 1, 1, 1, 27, 2, 3, 1, 1, 1, 2, 1, 1, 1, 20, 1, 102, 1, 1, 3, 2, 9, 3, 6, 3, 3, 1, 2, 3, 4, 2, 2, 1, 2, 1, 1, 1, 1, 1, 2, 3, 6, 2, 6, 2, 3, 1, 3, 2, 22, 1, 1, 2, 6, 3, 6, 3, 3, 1, 12, 3, 6, 3, 6, 3, 3, 1, 2, 3, 5, 2, 1, 2, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 2, 8, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 9, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 11, 2, 7, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 8, 2, 1, 2, 4, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 5, 1, 2, 1, 2, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 7, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 1, 3, 5, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 5, 5, 1, 2, 4, 3, 2, 3, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 2, 4, 3, 2] 
ns.each_with_index do |n, i|
  n.times{print cs[i]}
end

Chạy lại lần nữa, ok đẹp rồi. Căng mắt nhìn lần nữa, à há flag đây rồi 😄 Flag: CodeWar{my_bad_code}

His Best Friend (200pt)

code-war-his-best-friend Chúng ta lại có một file dạng text nữa wise_words, bên trong nội dung toàn là số má, được sắp xếp theo từng block dạng thế này

 9                  9       9     9      9 9            9     9        9    9   
 7                  7       7     7      7 7            7     7        7    7   
 8                  8       8     8      8 8            8     8        8    8   
 1                  1       0     0      0 0            1     0        1    0   
 8                  8       4     1      4 1            8     1        8    1   
 5                  5       4     2      4 2            5     2        5    2   
 5                  5       4     4      4 1            5     3        5    2   
 7                  7       5     2      5 7            7     5        7    5   
 3                  3       1     8      1 8            3     6        3    3   
 4                  4       2     7      6 0            5     0        2    8   
 6                  9       5     6      5 7            7     4        8    4   
 3                  0       6     5      3 5            5     0        2    0   
 0                  6       7     5      4 3            0     7        7    7   

Mỗi hàng dọc là một dãy 13 chữ số, đây chính là mã sách ISBN. Các bạn có thể liên tưởng đến hình ảnh giá sách với các cuốn sách được đặt dựng đứng. Ta dùng mã ISBN này để tra các tên sách, và ghép các chữ cái đầu tiên trong tên sách lại, ta sẽ có đoạn text như sau:

import isbnlib

f = open('wise_words', 'r')
c=[]
for k in xrange(30):
	a = [[] for i in xrange(100)]
	for i in xrange(14):
		b=f.readline()
		for i in xrange(len(b)):
			if b[i] in "0123456789":
				a[i].append(b[i])
	for i in a:
		if i: c.append(''.join([j for j in i]))
for isbn in c:
	book = isbnlib.meta(isbn)
	print book['Title'][0],

ABOOKLYINGIDLEONASHELFISWASTEDAMMUNITIONLIKEMONEYBOOKSMUSTBEKEPTINCONSTANTCIRCULATIONABOOKISNOTONLYAFRIENDITMAKESFRIENDSFORYOUWHENYOUHAVEPOSSESSEDABOOKWITHMINDANDSPIRITYOUAREENRICHEDBUTWHENYOUPASSITONYOUAREENRICHEDTHREEFOLDWELLDONEYOURFLAGISKEEPREADINGBOOKSWITHUNDERSCORESBETWEENWORDS

Bạn đã nhìn ra flag rồi chứ 😄

Flag: CodeWar{keep_reading_books}

Wall Of Text (175pt)

There is a hidden message ? (somebody told that :v)

Ta có một bức ảnh như sau: Thực tế trong các chữ cái sẽ có 1 số chữ màu đen nhưng mã là (0, 0, 10) khác với phần còn lại là (0, 0, 0) Ta sử dụng Stegsolve.jar (download tại đây) để check. Tại Gray bits cho ta kết quả như sau: Yes, flag đây rồi 😄

Flag: CodeWar{there_is_an_answer_inside_every_questi}

8 is 8 but 8 is not 8 (100pt)

code-war-8-is-8-but-8-is-not-8 Ta có một bảng số như thế này

12573783756253821289993516661571532721735159999733657183510117532
23157187107235072287370282131575321373512705532214542504338253712
17532304457731617701230154447731752375213297235584440203439171532
25137587303551977591358133218712357175123101535103178782540737251
12753783129233055506665359991771523523751256666387210303128227531
33732315351537277752753531713535137211723323555332277131575275722
31257206665189999233657189993723175194949505718553821116661121357
73152285758307335314542587370532175311817587210235072182131712735
13527194445394444284440301230725137122022394449231617754447732175
12357387362387721703178191358253127511853302118551977733218312735
75123741279706666587210706665221375573872265720133055359991735172

Các bạn có thể tô màu các vòng tròn trong các số 0, 6, 8, 9 ... để thấy được Flag. Để đơn giải thì ta chụp ảnh đoạn text lại, mở photoshop lên, fill nó bằng một màu nào đấy, ta được kết quả như sau Nheo mắt lại và đọc, nó đây rồi !

Flag: CodeWar{kids_can_read_this}

KubEye Challenge (300pt)

Restore it if you can ? Challenge Accepted ? https://kube-challenge.surge.sh/

Bài này có vẻ khá là dễ ăn đối với những người làm việc quen với 3D như Unity3D hay 3Dmax khi các thao tác ghép và điều chỉnh là quen thuộc. Chống chỉ định với các bạn dễ buồn nôn 😄 Chúng ta sẽ ngồi ghép các block lai, dựa vào các mảng text còn thiếu giữa các block. Try harder !!

Ngoài ra nếu các bạn quen với JavaScript và thư viện three.js thì có thể viết 1 đoạn code để quay các khối về lại trạng thái ban đầu.

_g5.children.forEach(function(obj) { if (obj.type === "Object3D") { obj.rotation.set(0, 0, 0); } })

Để hiển thị 3D với three.js thì chúng ta cần ít nhất 1 scene, 1 camera và 1 renderer, ở đây _g5 là biến ứng với scene. Chạy đoạn code này xong thì công việc còn lại chỉ đơn giản là tịnh tiến các khối về vị trí ban đầu.

Nhìn vào các blocks, ta sẽ thấy được đoạn flag. Flag: CodeWar{SEEING_IS_BELIEVING!}

Trên đây là hướng dẫn giải một số bài trong vòng sơ loại Code War 2017. Chúng tôi sẽ tiếp tục gửi đến các bạn phần write-ups cho các bài còn lại trong thời gian sớm nhất. Stay tune !


Update: Code War 2017 - Online Round Write-ups - Part 2

All Rights Reserved