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
'๐ดCTF > DreamHack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DreamHack - CTF์ ์ ์ฉํ ๋๊ตฌ ๋ชจ์(๋๋ฆผํต ํด์ฆ) (0) | 2023.09.07 |
---|---|
DreamHack - blind-command ํ์ด (0) | 2023.09.07 |
DreamHack - Mitigation: Stack Canary ์ค์ต ๋ฌธ์ (์นด๋๋ฆฌ ๊ฐ ๊ตฌํ๊ธฐ) (0) | 2023.05.01 |
DreamHack - Return to Shellcode ํ์ด (0) | 2023.05.01 |
DreamHack - Quiz: x86 Assembly 1 (0) | 2023.05.01 |