๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

DreamHack - Robot Only ํ’€์ด

by Janger 2023. 5. 24.
728x90
๋ฐ˜์‘ํ˜•

https://dreamhack.io/wargame/challenges/680/

 

Robot Only

Description ๋กœ๋ด‡๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๋ฐ•์žฅ์ด์—์š”. ๋กœ๋ด‡์ž„์„ ์ธ์ฆํ•˜๊ณ  ๊ฒฝ๊ธฐ์—์„œ ์ด๊ฒจ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š”!

dreamhack.io

 

 

์ฃผ์š” ํ•จ์ˆ˜ - verify()
def verify():
    global verified

    if verified is True:
        print('you have already been verified as a robot :]')
        return

    randn224 = (get_randn() | get_randn() << 32 | get_randn() << 64 |
                get_randn() << 96 | get_randn() << 128 | get_randn() << 160)

    challenge = randn224 ^ 0xdeaddeadbeefbeefcafecafe13371337DEFACED0DEFACED0

    signal.alarm(3)
    signal.signal(signal.SIGALRM, timeout_handler)

    try:
        print('please type this same: "{0}"'.format(challenge))
        user_challenge = input('> ')

        if user_challenge == str(challenge):
            verified = True
            print('you\'re are now verified as a robot :]')
        else:
            print('you\'re not a robot ;[')
        signal.alarm(0)

    except MyTimeoutError:
        print('\nyou failed to verify! robots aren\'t that slow ;[')

 

challenge = randn224 ^ 0xdeaddeadbeefbeefcafecafe13371337DEFACED0DEFACED0
signal.alarm(3)

 

์ฃผ์–ด์ง„ 3์ดˆ ์•ˆ์— challenge ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ๋ชปํ•˜๋ฉด verify๊ฐ€ ๋˜์ง€ ๋ชปํ•œ๋‹ค. 

์ด๋Š” ํ”ผ์ง€์ปฌ๋กœ ์ปค๋ฒ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์ฃผ์š” ํ•จ์ˆ˜ - gamble()
def gamble():
    global money
    global verified

    if verified is False:
        print('you\'re are not verified as a robot ;[')
        return

    print('greetings, robot :]')

    bet = int(input('how much money do you want to bet (your money: ${0})? '.format(money)))
    if money < bet:
        print('you don\'t have enough money (your money: ${0}).'.format(money))
        return

    randn = get_randn()
    answer = randn % 5 + 1

    print('[1] [2] [3] [4] [5]')
    user_answer = int(input('pick one of the box > '))

    print('answer is [{0}]!'.format(answer))

    if user_answer == answer:
        print('you earned ${0}.'.format(bet))
        money += bet
    else:
        print('you lost ${0}.'.format(bet))
        money -= bet

    if money <= 0:
        print('you busted ;]')
        sys.exit()

 

๋žœ๋ค์œผ๋กœ 1~5๊นŒ์ง€ ์ˆซ์ž๋ฅผ ๋งž์ถ”์–ด์„œ ๋ฒ ํŒ… ๊ธˆ์•ก๋งŒํผ ์–ป๊ณ , ๋งŒ์•ฝ ํ‹€๋ฆฌ๋ฉด ๋ฒ ํŒ… ๊ธˆ์•ก๋งŒํผ ์ฐจ๊ฐ์ด ๋œ๋‹ค. 

 

์ฃผ์š” ํ•จ์ˆ˜ - flag()
def flag():
    global money

    print('price of the flag is $10,000,000,000.')

    if money < 10000000000:
        print('you don\'t have enough money (your money: ${0}).'.format(money))
        return

    with open('./flag', 'rb') as f:
        print(b'flag is ' + f.read())
    sys.exit()

๊ทธ๋ ‡๊ฒŒ money๊ฐ€ 10000000000 ์ด์ƒ์ด์–ด์•ผ flag๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. (๊ธฐ๋ณธ ์†Œ์ง€๊ธˆ์€ 500์ด๋‹ค)

 

 

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ ์ž์‹ ์˜ ์ตœ๋Œ€ ๊ธˆ์•ก์œผ๋กœ ๋ฒ ํŒ…์„ ํ•  ๋•Œ๋งˆ๋‹ค 1/5 ํ™•๋ฅ ๋กœ ์šด ์ข‹๊ฒŒ ์—ฐ์†์œผ๋กœ ๋งž๋‹ค๊ณ  ํ•ด๋„ 33๋ฒˆ๊ฐ€๋Ÿ‰์„ ๋งž์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๋‹ค. 

 

 

bet = int(input('how much money do you want to bet (your money: ${0})? '.format(money)))
    if money < bet:
        print('you don\'t have enough money (your money: ${0}).'.format(money))
        return
        
   ...
        
    if user_answer == answer:
        print('you earned ${0}.'.format(bet))
        money += bet
    else:
        print('you lost ${0}.'.format(bet))
        money -= bet

ํ•˜์ง€๋งŒ ์ฝ”๋“œ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค.

ํ•˜๋‚˜๋Š” ๋ฒ ํŒ… ๊ธˆ์•ก์„ ์ง€์ •ํ•  ๋•Œ ์Œ์ˆ˜ ๊ฐ’์„ ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

๋‘˜์€ ์กŒ์„ ๊ฒฝ์šฐ ํ˜„์žฌ ๋ˆ์—์„œ bet ๋งŒํผ์„ ๋บ€๋‹ค๋Š” ๊ฒƒ

 

๋งŒ์ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ ํŒ… ๊ธˆ์•ก์œผ๋กœ -9999999๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ

์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธˆ์•ก(500) ๋ณด๋‹ค ๋ฒ ํŒ… ๊ธˆ์•ก์ด ๋„˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํŒจ์Šค๋œ๋‹ค. (if 500 < -9999999)

 

๊ทธ๋ฆฌ๊ณ  4/5 ํ™•๋ฅ ๋กœ ํ‹€๋ฆฌ๊ฒŒ ๋  ์‹œ

 

money = 500 - (-9999999)๊ฐ€ ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” 500 + 9999999๋ฅผ ์–ป๊ฒŒ ๋œ๋‹ค. 

 

 

solver.py
from pwn import *

while True:
    r = remote('host3.dreamhack.games', 22001)

    r.sendline(b'2') # verify you're a robot

    r.recvuntil('please type this same: ')
    user_challenge = r.recvline().decode().replace('"', '').strip()

    print('user challenge:', user_challenge)

    r.sendline(user_challenge) # verify

    r.recvuntil('>')
    r.sendline(b'1') # go to gamble

    r.sendline('-999999999999999')

    r.recvuntil('>')

    r.sendline(b'1') # user_answer

    try:
        r.recvuntil('3. buy flag')
    except:
        continue

    r.recvuntil('>')

    r.sendline(b'3') # buy flag

    r.recvline()

    flag = r.recvline().decode().strip()[2:-3]

    print(flag)

    break
728x90
๋ฐ˜์‘ํ˜•