Google CTF Beginner Quest 2021 – Writeup Quest 1-2-3-5-7

Google CTF Beginner Quest là một sự kiện thường niên hướng tới những người chơi CTF mới bắt đầu, bao gồm các challenge trải dài ở nhiều mảng khác nhau như Crypto, Web, Hardware, … Writeup mình sẽ chỉ viết về 5 quest đầu, còn 10 quest còn lại các bạn có thể tự mò mẫm tại đây.

Quest 1

`

“Cậu hẳn là đang thắc mắc tại sao chúng tôi lại triệu tập cậu nhỉ, Đặc vụ? Chúng tôi đã được thông báo rằng một thảm họa tồi tệ sắp xảy ra. Chúng ta vẫn còn thời gian để ngăn chặn thảm họa này, và chúng tôi không nghĩ được ai phù hợp với nhiệm vụ này hơn cậu. Chúng tôi tin rằng nếu cậu không làm được việc này thì không ai khác có thể cả. Cậu sẽ phải đến Novosibrisk và điều tra một nhà máy hóa chất khả nghi. Nhiệm vụ này phải được thực hiện hoàn toàn trong bí mật. Chúng tôi vẫn chưa thể nói thêm được thông tin gì với cậu. Đi ngay! Vận mệnh thế giới đang nằm trong tay cậu!”

Challenge: CCTV (rev)
Bạn đã đến nhà máy. Thời tiết không được tốt cho lắm, cho nên bạn quyết định không ở ngoài đường nữa và đi vào bên trong. Cho đến bây giờ vẫn chưa có ai để ý đến bạn, cho nên bạn quyết định tự làm cho mình một cốc cà phê ở phòng Cộng đồng như thể mình là nhân viên ở đây, sau đó tìm một căn phòng trống có bộ bàn ghế. Bạn lôi laptop ra, cắm dây mạng vào cổng trên tường, và nhanh chóng tìm được nơi đăng nhập vào hệ thống CCTV nội bộ. Chỉ có điều, nó yêu cầu một mật khẩu.

Truy cập trang web được cung cấp, ta có thể thấy một bảng login:

Kiểm tra mã nguồn, ta có thể thấy đoạn script kiểm tra mật khẩu:

Rất rõ ràng, v là dữ liệu người dùng nhập vào, p là một mảng được tạo từ v, với mỗi phần tử là giá trị Ascii của từng chữ cái trong v cộng với 0xCafe (tức là 51966 trong hệ thập phân). Sau đó từng phần tử của p được so sánh với các giá trị trong hàm if. Nếu thỏa mãn tất cả các điều kiện, ta sẽ có được flag. Như đã thấy, bên trong hàm if, các giá trị được sắp xếp rất lộn xộn, vậy nên mình sẽ sắp xếp các giá trị đó lại một chút:

gia_tri_so_sanh = [52037,52077,52077,52066,52046,52063,52081,52081,52085,52077,52080,52066]

Được rồi, với từng giá trị của mảng này, ta sẽ trừ đi 51966, rồi lấy chữ cái Ascii tương ứng. Ta sẽ lấy được mật khẩu sau khi thực hiện hết 12 phần tử của mảng:

Nice, vậy mật khẩu của chúng ta là GoodPassword. Nhập mật khẩu vào ô login, chúng ta có ngay flag:

Flag: CTF{IJustHopeThisIsNotOnShodan}

Bạn đã hoàn thành công việc điều tra nhà máy hóa chất. Không có điều gì bất thường cả, tuy nhiên nhân viên ở đây hành xử đôi chút thụ động, nhưng điều đó chưa đủ để bạn theo dõi kỹ hơn. Bạn vừa nhận được tin nhắn thoại từ Sếp: “Xin chào Đặc vụ! Có vẻ tập đoàn sở hữu nhà máy đã biết được chuyến thăm của cậu từ nguồn tình báo nặc danh, và họ đã chuẩn bị từ trước. Nhưng không sao, đồng nghiệp Đặc vụ X của cậu có đầu mối từ Moscow. Chúng tôi đã đặc một chuyến bay cho cậu, hạng nhất, tất nhiên rồi. Nếu cậu nhìn ra cửa sổ sẽ thấy một chiếc Mercedes màu đen đang chờ để chở cậu ra sân bay. Chúc may mắn!”

Quest 2

Đó là một ngày rất lạnh, tuyết rơi trắng xóa, lóa tầm nhìn của bạn. Bạn nên sử dụng đôi tất mà anh lái xe đã đưa thêm cho bạn lúc trước. Ai đó đang vẫy tay phía bên kia đường. Bạn đi đến gần với cô ấy. “Xin chào Đặc vụ, tôi là Đặc vụ X. Chúng tôi tìm được căn hộ của một người nghi là có dính lứu tới nhiệm vụ của ta. Đi theo tôi!”

Challenge: Logic Lock (misc)
Căn hộ đó co một ổ khóa điện tử. Sau khi phân tích bảng mạch và xem xét các con chip, bạn kết luận đây chỉ là các cổng logic!

Đề bài cho ta một số cổng logic:

Để giải các cổng logic này, ta cần phải xác định trạng thái (0 hoặc 1) của các nút A, B, C … J để cho ra Output là 1 (phía bên phải). Ta có thể sử dụng bảng dưới đây để biết được tên gọi và chức năng các cổng logic:

https://media.geeksforgeeks.org/wp-content/uploads/logic-gates.jpg

Biết được chức năng các cổng và output, ta có thể giải các trạng thái Input lần lượt từ phải sang trái. Giả sử, gắn liền với nút output là một cổng AND, vậy để output ra 1 thì 2 giá trị đầu vào của cổng phải đều bằng 1:

Tương tự, ta lần lượt giải đến khi biết được tất cả trạng thái của các nút Input:

Vậy các nút B, C, F, I, J phải set bằng 1. Flag của chúng ta sẽ là CTF{BCFIJ}

Flag: CTF{BCFIJ}

Nó là một căn hộ u ám và lộn xộn, một bóng râm mờ đổ từ chiếc cửa sổ được che hơn một nửa. Căn hộ có mùi rất khét, và có một cái chai bị nứt trong bồn rửa bát, chứng tỏ hắn đã thực hiện thí nghiệm gì đó ở đây. Ai đó đã rời khỏi đây trong vội vã. Bây giờ bạn muốn ra cửa sổ ngắm điện Kremlin hay tiếp tục khám xét căn hộ? (Quest 3 nếu đi ra cửa sổ, Quest 4 nếu tiếp tục khám xét)

Quest 3

Chà! Nhìn điện Kremlin kìa. Nó là một thứ gì đó thật khác bọt. Nhưng từ từ đã, nhìn xuống đường, một người bắt đầu chạy ngay đi khi thấy bạn nhìn ra cửa sổ. Có thể đó chính là người mà chúng ta đang tìm kiếm? Bạn ra khỏi căn hộ và thấy anh ta nhảy lên xe máy và chạy đi. Bạn phát hiện một chiếc xe ôtô đỗ gần đó, bẻ khóa và nhanh chóng đuổi theo.

Tên đó lái xe vào một ngõ hẹp, và bất chấp nguy hiểm, bạn vẫn cố gắng đuổi theo. Bạn không thể nhận ra hắn là ai trong bộ đồ đen tuyền và chiếc mũ bảo hiểm che kín mặt. Bạn cần phải chặn hắn lại bằng cách nào đó.

Challenge: High Speed Chase (misc)

Bạn đuổi hắn từ trong ngõ ra đến tận đường cao tốc. Giao thông khá là dày đặc so với một chiếc xe hơi và tên đó đang dần cắt đuôi bạn – đáng lẽ bạn nên bẻ khóa một chiếc xe môtô thì hơn. Giờ đã quá muộn cho việc đó rồi. Bạn nhìn xung quanh trong chiếc xe để tìm thứ gì đó hữu ích, và phát hiện ra đây chính là một mẫu xe lái tự động được ra mắt gần đây. Bạn bật chế độ tự lái lên, lấy laptop ra, kết nối với hệ thống, và truy cập vào chế độ developer vốn dĩ được ẩn. Giờ đã đến lúc lập trình lại chế độ lái tự động để chiếc xe có thể đuổi kịp tên kia. Để thuận tiện hơn, bạn thay thế hệ thống LiDAR có sẵn trong máy bằng hình ảnh thực lấy từ một vệ tinh. Mọi việc còn lại là viết một hàm điều khiển xe tối ưu hơn!

Ta truy cập vào địa chỉ web trong đề bài:

Phía bên trên là hình ảnh từ vệ tinh, chiếc xe của chúng ta là chiếc dưới cùng. Phía bên trái là nơi ta viết code để điều khiển chiếc xe, và phía bên phải là miêu tả cho challenge này.

Chúng ta cần chỉnh sửa lại hàm controlCar để chiếc xe có thể lách qua các làn giao thông. Mảng scanArray lưu giữ 17 giá trị tương ứng với khoảng cách của xe với các vật thể xung quanh:

https://high-speed-chase-web.2021.ctfcompetition.com/task3explained.png

Bất kể xe có di chuyển đi đâu, vị trí số 8 luôn ở chính giữa chiếc xe, scanArray[0] – scanArray[7] hiển thị dữ liệu phía bên trái của xe, scanArray[9] – scanArray[15] hiển thị dữ liệu phía bên phải xe. Hàm controlCar của chúng ta phải trả về một trong 3 giá trị: -1 , 10. Nếu hàm controlCar trả về -1, chiếc xe sẽ dịch chuyển một chút sang bên trái, trả về 0 thì chiếc xe sẽ tiến lên phía trước, trả về 1 thì chiếc xe sẽ di chiuyển một chút sang bên phải. Khi thực thi, hàm controlCar sẽ được gọi nhiều lần mỗi giây.

Để hình dung dễ hơn, mình sẽ log toàn bộ dữ liệu ban đầu của scanArray:

Làn số 2 và 3 của chúng ta đều bị chặn bởi 2 chiếc xe khác, và theo như dữ liệu từ mảng scanArray, xe của chúng ta cách chúng lần lượt là 8.759.25 đơn vị. Làn 1 không bị chắn nên dữ liệu cho thấy giá trị lớn hơn hẳn là 23.25. Vậy nên mỗi lần thực thi hàm controlCar, ta chỉ cần xác định làn nào đang trống dựa vào giá trị lớn nhất trong mảng scanArray và kéo xe của chúng ta về làn đó thôi. Nếu giá trị lớn nhất của mảng scanArray có ví trí lớn hơn 8 (tức là vị trí chính giữa của xe) ta sẽ trả về 1 (lui về bên phải), ngược lại sẽ trả về -1 (lui về bên phải), còn nếu vị trí lớn nhất đùng bằng 8 thì ta trả về 0 (tiến lên).

Đầu tiên mình sẽ lấy dữ liệu chính giữa xe và lấy giá trị lớn nhất cùng vị trí tương ứng:

maxVal sẽ là khoảng cách lớn nhất, còn maxValIndex là vị trí có khoảng cách lớn nhất đó. Tiếp theo, nếu vị trí có khoảng cách lớn nhất nhỏ hơn 8, tức nằm bên trái chiếc xe, ta sẽ trả về -1, lái chiếc xe về phía bên trái, và ngược lại ta trả về 1:

Khi scanArray[8] có giá trị lớn nhất, ta chưa được tiến lên ngay vội. Lý do là khi nếu vị trí chính giữa của xe vừa vào làn trống mà ta đã tiến lên ngay thì phía đèn phải hoặc trái sẽ đụng vào xe phía trước. Vậy nên ta cần phải chỉnh sao cho xe đi vào giữa làn trống thì mới tiến lên:

Đó vậy thôi! Nói đùa thế chứ khi bắt đầu code mình đã phải sửa rất nhiều, liên tục phải log dữ liệu để debug. Chạy code thành công đúng là khoái:

Flag: CTF{cbe138a2cd7bd97ab726ebd67e3b7126707f3e7f}

Bạn đang theo sát đuôi hắn, nhưng trước khi bạn có cơ hội để hành động, hắn đột nhiên rẽ vào một con đường rất nhỏ, bạn không thể đuổi theo với chiếc xe của mình được. Bạn sẽ chẳng bao giờ gặp lại hắn một lần nào nữa, nhưng chờ đã … Hắn làm rơi thứ gì đó. Một cái túi! Bạn cầm nó lên và nhìn vào bên trong, có vẻ nó là một chiếc bùa hộ mệnh cổ. Bạn mang nó đến cho Đặc vụ X, cô ấy nói thứ này có thể cho ta thêm đầu mối và khuyên bạn mang nó về trụ sở để nghiên cứu tiếp.

Quest 5

Bạn quay về trụ sở tại Istanbul. Đó là một ngày khá nóng và da bạn đang khô ráp dưới cái nắng chói chang. Thật khó để chen qua khu chợ đông đúc. Giọng nói the thé phát ra từ thương gia đang chào mời những tấm lụa sặc sỡ sắc màu, và rồi tại một góc khác lại thoang thoảng mùi đồ ăn thơm phức. Bạn trông thấy một bàn tay đang vẫy – người tiếp theo bạn muốn gặp. “Ngồi xuống đi anh bạn. Tôi là Gokkan, cậu đã đến Istanbul bao giờ chưa? Chưa thật ư? Tôi tin chắc rằng cậu sẽ có khoảng thời gian tuyệt vời ở đây. Tôi đã gọi trà cho hai chúng ta. Đưa tôi xem cái bùa nào!” “Ồ, thứ này thực sự quý giá vào thời tôi còn trẻ. Nó trông thật vừa đẹp vừa bí ẩn, và chắc chắn thuộc về hội “The cloaked brotherhood“. Bọn chúng rất nguy hiểm, và mặc dù nhiệm vụ của cậu rất cấp bách, nhưng tôi khuyên cậu nên ngừng tìm kiếm chủ nhân của thứ này. Hãy về nhà và quên nó đi.”. Trong nháy mắt, bốn gã to con xuất hiện, và bạn bắt đầu chạy theo Gokkan qua khu chợ, rồi trèo lên nóc nhà. Bốn tên kia vẫn đuổi theo sát, nhưng may thay bạn và Gokkan đã trèo được xuống và trốn trong hai chiếc hòm.

Challenge: Twisted robot (misc)

Chúng tôi tìm được một máy gọi điện từ động này. Nó chỉ sinh ra các số điện thoại ngẫu nhiên để spam. Chúng tôi cũng tìm thấy danh sách những số điện thoại cuối cùng mà nó sinh ra, cùng vơi đó là một file rất lạ. Có khi nào nó liên quan đến chức năng beta mà chiếc máy đang thử nghiệm không?

Tải file từ đề bài cho và giải nén, ta được một số file:

File robo_number_list.txt lưu một dãy các số điện thoại:

File secret.enc chứa dữ liệu gì đó ta không đọc được:

Cuối cùng là file RoboCaller1337.py:

import random

# Gots to get that formatting right when send it to our call center
def formatNumber(n):
    n = str(n)
    return f'{n[:3]}-{n[3:6]}-{n[6:]}'

# This generates random phone numbers because it's easy to find a lot of people!
# Our number generator is not great so we had to hack it a bit to make sure we can
# reach folks in Philly (area code 215)
def generateRandomNumbers():
    arr = []
    for i in range(624):
        arr.append(formatNumber(random.getrandbits(32) + (1<<31)))
    return arr

def encodeSecret(s):
    key = [random.getrandbits(8) for i in range(len(s))]
    return bytes([a^b for a,b in zip(key,list(s.encode()))])


def menu():
    print("""\n\nWelcome to the RoboCaller!! What would you like to do?
1: generate a new list of numbers
2: encrypt a super secret (in beta)
3: decrypt a super secret (coming soon!!)
4: exit""")
    choice = ''
    while choice not in ['1','2','3']:
        choice = input('>')
        if choice == '1':
            open('robo_numbers_list.txt','w').write('\n'.join(generateRandomNumbers()))
            print("...done! list saved under 'robo_numbers_list.txt'")
        elif choice == '2':
            secret = input('give me your secret and I\'ll save it as "secret.enc"')
            open('secret.enc','wb').write(encodeSecret(secret))
        elif choice == '3':
            print("stay tuned for this awesome feature\n\n")
        elif choice == '4':
            print("Thank you for using RoboCaller1337!")
    return

def main():
    while True:
        menu()

if __name__ == "__main__":
    main()

Hàm formatNumber() trả về chuỗi được ngăn cách bằng dấu “-“, hàm generateRandomNumbers() sinh ra các số 32-bit ngẫu nhiên, sau đó cộng với (1<<31) (bằng 2147483648). Hàm encodeSecret() đầu tiên tạo một mảng key[ ] chứa các số 8-bit ngẫu nhiên có kích thước bằng độ dài chuỗi s được truyền vào, sau đó XOR lần lượt với các ký tự từ chuỗi s. Trong hàm menu(), ta có thể thấy formatNumber()generateRandomNumbers() kết hợp với nhau tạo thành file robo_numbers_list.txt, còn hàm encodeSecret() mã hóa input người dùng nhập vào và viết vào file secret.enc. Vậy chúng ta cần giải mã file này để có thể lấy được flag.

Vậy thì để có thể giải mã được file secret.enc, ta cần phải biết mảng key[ ] có những gì. Với từng byte đọc được từ secret.enc, XOR với từng phần thử mảng key[ ] ta sẽ có được từng ký tự của flag. Vấn đề là mảng key[ ] đều được sinh ngẫu nhiên từ hàm random(). Sau một hồi tìm hiểu thì mình mới biết, chúng ta có thể hoàn toàn dự đoán được mảng key[ ] có những gì.

Cơ bản, hàm random() trong Python là một Pseudo-Random Number Generator (PRNG), dựa trên thuật toán Mersenne Twister. Thuật toán này quản lý trạng thái (state) trong 624 giá trị 32-bit ( Hầu hết các thuật toán PRNG đều dựa trên state hiện tại để sinh ra giá trị tiếp theo). Nếu kẻ tấn công nắm được 624 giá trị liên tiếp sinh ra từ thuật toán Mersenne Twister, toàn bộ quy trình sinh ngẫu nhiên đều có thể bị dịch ngược và những giá trị tiếp theo được sinh ra đều có thể bị dự đoán. Trong challenge này, hàm random() đã sinh ra đúng 624 giá trị để lưu vào file số điện thoại, sau đó các giá trị trong hàm key[ ] mới được sinh ra, vậy nên ta hoàn toàn có thể dự đoán được các giá trị trong mảng key[]:

Để dự đoán chúng ta sẽ sử dụng Randcrack. Trước khi thực hiện dự đoán ta cần phải xử lý file robo_numbers_list.txt trước. Như đã biết, chương trình đã sinh số từ hàm random(), cộng thêm với 2147483648 và ngăn cách bằng dấu “-“. Việc ta cần làm là bỏ dấu “-“, trừ giá trị từng dòng đi 2147483648 và ta đã có giá trị gốc được sinh trực tiếp từ random():

file = open('robo_numbers_list.txt', 'rb')
raw = file.readlines()
raw = [raws.rstrip().decode( "utf-8" ) for raws in raw]
file.close()

for i in range (0,len(raw)):
	raw[i] = raw[i].replace("-", "")
	raw[i] = str(int(raw[i]) - (1<<31))
print(raw)

files = open('temp.txt', 'a')
for i in raw:
	files.writelines(str(i).strip() + "\n") 
files.close()

Toàn bộ sẽ được lưu vào file temp.txt. Tiếp tới là công đoạn dự đoán giá trị mảng key[ ]. Import randcrack và đọc file temp.txtsecret.enc:

Sau đó ta nạp 624 giá trị từ file temp.txt vào randcrack, sau đó dự đoán tiếp 32 giá trị 8-bit (chúng ta đọc được 32 byte từ file secret.enc, đồng nghĩa flag có 32 ký tự) (8-bit vì trong mã nguồn ban đầu đề bài cung cấp, random() đã sinh các giá trị 8-bit vào mảng key[ ]):

Có key rồi, chúng ta giải mã ra flag thôi:

Flag: CTF{n3v3r_3ver_ev3r_use_r4nd0m}

Gokkan chỉ tay về một chiếc ôtô đang đỗ. Anh ấy bảo bạn phải cố gắng tới đó và nếu bạn ở lại, sớm muộn gì bạn cũng sẽ bị tóm. Mấy tên đó biết rõ địa phương này như trở bàn tay. Bạn cảm thấy kế hoạch này khá là mạo hiểm. Gokkan cuối cùng nói anh ấy sẽ không ở lại đây, và bạn chỉ còn cách theo anh ta.

Quest 7

Gokkan và bạn chui ra khỏi chiếc hòm, chạy nhanh đến chiếc xe. Mấy tên to con đã thấy bạn, và chúng bắt đầu tiếp cận. Gokkan cố gắng nổ máy xe và chiếc xe bắt đầu phát ra những âm thanh rất ồn, càng thu hút bọn chúng hơn. Bạn nhìn ra gương chiếu hậu, bọn chúng đang sắp sửa nhảy lên phía sau xe và rút súng. Gokkan vẫn tiếp tục vội vã nổ máy một lần nữa và đã THÀNH CÔNG! Anh ấy nhanh chóng phóng nhấn ga và cả hai phóng vụt đi. Chiếc xe giờ đã cách thành phố khá xa. Gokkan đưa cho bạn một tấm vé mời đến một hội nghị riêng tư, được tổ chức tại Buenos Aires.

Bạn đưa giấy mời cho bảo vệ để có thể được vào tham gia hội nghị. Có hàng tá nhân vật quan trọng tại đây. Bạn lấy một ly champagne từ chiếc khay, cố gắng tỏ ra là mình cũng quan trọng. Sau vài phút tự diễn, bạn tiếp cận người tiếp theo sẽ cung cấp thông tin mật. Ông ta tự giới thiệu mình là tiến sĩ Nowak Wasilewski. Nowak hỏi bạn là ai, và yêu cầu bạn chứng minh năng lực qua một bài kiểm tra mà ông ấy tự thiết kế.:

Challenge: ReadySetAction (crypto)

Rõ ràng đoạn script này được sử dụng để mã hóa một thông điệp siêu bí mật. Để xem có điều gì thú vị không.

Tải file từ đề bài và giải nén, chúng ta được một số file:

Mở file chall.py, ta có thể nhận ngay thấy đây là mã hóa RSA:

Cơ bản, quy trình mã hóa RSA như sau:

  • Chọn 2 số nguyên tố p và q khác nhau (pq sẽ được giữ bí mật)
  • Tính n = p*q (n được công khai như một phần của public key)
  • Tính giá trị hàm số Euler ϕ(n) = (p−1)(q−1).
  • Chọn một số tự nhiên e sao cho 1 < e < ϕ(n) và là số nguyên tố cùng nhau với ϕ(n) (e cũng được công khai như một phần của public key)
  • Tính: d sao cho d*e ≡ 1 ( mod ϕ (n) ) (d được giữ bí mất và được coi là private key)
  • Mã hóa: giả sử bạn muốn mã hóa văn bản M, đầu tiên bạn cần phải chuyển văn bản đó thành số m (qua một hàm có thể đảo ngược). Gọi c là bản mã hóa của m, ta có công thức:
    • c = m^e mod n
  • Giải mã: để giải mã được bản mã hóa c, bạn cần phải có khóa riêng tư d (private key). Ta có thể giải mã c theo công thức:
    • m = c^d mod n

Yeah đó hầu như là tất cả những thứ bạn cần biết về RSA. Trong challenge này, chúng ta đã biết c, ne, trong đó e=3. Gọi k là một số nguyên dương lớn hơn 0. Theo như công thức mã hóa ta sẽ có phương trình:

  • m^e = k*n + c

Tương đương với (thay e = 3 vào phương trình):

  • m^3 = k*n + c

Như vậy, bằng cách bruteforce giá trị k, ta sẽ thăm dò được các số có căn bậc 3 là số nguyên dương, và giá trị căn bậc 3 tìm được có thể là m.

Vì n và c là những số rất rất rát lớn, nên chúng ta cần sử dụng thư viện ngoài để đẩy nhanh quá trình bruteforce. Ở đây mình sẽ sử dụng thư viện gmpy2. Ta sẽ import gmpy2 và khai báo c, n và k (k ban đầu mình đặt bằng 1):

pot là giá trị chúng ta muốn kiểm tra xem có căn bậc 3 là số nguyên dương hay không. Thư viện gmpy2 có hàm iroot(x, n) rất hữu dụng. Nó trả về True nếu căn bậc n của x là số nguyên dương, ngược lại là False. Ta sẽ tạo một vòng while(), chạy đến bao giờ tìm được số có căn bậc 3 nguyên dương thì thôi:

Chúng ta đã có giá trị m đầu tiên:

Mã nguồn đề bài sử dụng hàm bytes_to_long() để chuyển flag từ dạng string sang số tự nhiên. Mình sẽ sử dụng hàm ngược lại là long_to_bytes() để chuyển số tự nhiên sang string:

May quá lần đầu được luôn.

Flag: CTF{34sy_RS4_1s_e4sy_us3}

Nowak khá ấn tượng với kỹ năng của bạn. Cả hai cùng ngồi xuống, và bạn gọi rất nhiều đồ uống cho ông ấy. Cuộc nói chuyện vẫn tiếp diễn, và Nowak bắt đầu thấm rượu và nói lảm nhảm về đủ thứ trên đời. Bỗng dưng ông ấy vô tình tiết lộ địa điểm văn phòng ở New York, và có vẻ nó liên quan rất nhiều đến cả chiến dịch này.

1 bình luận về “Google CTF Beginner Quest 2021 – Writeup Quest 1-2-3-5-7

Trả lời

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s