반응형
반응형
반응형

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

 

반응형
반응형

SuNiNaTaS의 8번문제 풀이입니다. 


[WEB]




로그인 창이 하나 있다.


소스코드에서 건질건 힌트뿐..


<!-- Hint : Login 'admin' Password in 0~9999 -->



이건 brute force하라고 만든 것 같다.

burp suite를 이용해서 시도해 보았다.




반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [BINARY 10번] 풀이  (0) 2018.07.31
SuNiNaTaS [BINARY 9번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 7번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 7번문제 풀이입니다. 


[WEB]




스크롤을 내리면 YES버튼이 있다.




눌렀더니 너무 느리다고 나온다.



페이지 소스코드에 있는 힌트

<!-- Hint : Faster and Faster -->


빠르게 버튼을 누르면 되는 것 같다.




콘솔창 띄워놓고 frm.submit()을 쳐둔뒤

f5를 마구 눌러 새로고침을 해 주었다. 몇 번 NO!뜨다가 더이상 뜨지 않고 새로고침이 되었다.


마구 새로고침을 하다가 콘솔창에  대기시켜둔 명령어을 치면 authkey를 얻을 수 있다.



반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [BINARY 9번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 8번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 6번문제 풀이입니다. 


[WEB]



게시판이 하나 있다.




힌트에는 suninatas가 쓴 글을 읽으라고 되어있다.



suninatas의 글을 클릭하면 패스워드를 입력하라고 하는데, 밑에 쿼리문이 보인다.

SQL 인젝션을 해야한다는 의미인 것 같다.



select szPwd from T_Web13 where nIdx = '3' and szPwd = '"&pwd&"'


만약 우리가 패스워드로 123을 입력하면


select szPwd from T_Web13 where nIdx = '3' and szPwd = '123'


이 될 것이다.


그럼 이 구문을 참으로 만들어 주어야 한다.



select szPwd from T_Web13 where nIdx = '3' and szPwd = '1' or 1=1 --'


1' or 1=1 -- 이렇게 하면 참이 되는데... 해킹하지 말라는 문구가 뜬다. 이것저것 해보니 =을 필터링 하고 있었다.


그래서 1=1 대신 2>1로 바꿔서 입력해주어야 한다.


1' or 2>1 --





auth_key를 얻었고 이 글을 읽을 수 있다고 한다.





..? 접근권한이 없다고 한다. 게다가 authkey 인증도 틀렸다고 나온다.



뭔가 더 해야하는 것 같다.




이것 저것 뒤져보던 중에... auth%5key라는 쿠키값을 하나 찾았다.

이 쿠키값으로 suninatastopofworld!를 입력하고 다시 시도해보았으나 실패...



2번째 게시글에 있는 링크를 통해 위 값을 md5로 인코딩하고 이 해쉬값을 다시 쿠키에 넣어서 시도해 보았다.



성공...그러나 key를 찾으라고 한다...


소스...소스를 보자



키 힌트가 있다.






클리어


반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 8번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 7번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 5번문제 풀이입니다. 


[WEB]




key 값을 확인한다


페이지 소스를 봅시다.


난독화된 JS코드

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('g l=m o(\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\');p q(n){g h=\'\';g j=r;s(g i=t;i>0;){i-=4;g k=(n>>i)&u;v(!j||k!=0){j=w;h+=l[k]}}x(h==\'\'?\'0\':h)}',34,34,'||||||||||||||||var|result||start|digit|digitArray|new||Array|function|PASS|true|for|32|0xf|if|false|return'.split('|'),0,{}))


힌트

<!--Hint : 12342046413275659 -->

<!-- M@de by 2theT0P -->



난독화된 코드를 언패킹해봐야 알 수 있을 것 같네요.


위에 처럼 패킹된 코드는 콘솔창에서 console.log로 언패킹할 수 있다.




언패킹한 코드를 정렬

var digitArray=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

function PASS(n)

{

var result='';

var start=true;

for(var i=32;

i>0;

)

{

i-=4;

var digit=(n>>i)&0xf;

if(!start||digit!=0)

{

start=false;

result+=digitArray[digit]

}

}

return(result==''?'0':result)

}




근데... 소스코드를 뒤져봐도 PASS()함수를 사용하는 코드가 없다......


직접 사용해야하나..?


PASS()함수의 인자로 힌트에 나온 정수를 넣어보았다.




9c43c20c 라는 값이 나왔다. 이 값을 폼에 넣었더니 key가 나왔다.


반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 7번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 2번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 4번문제 풀이입니다. 


[WEB]




소스 하단에 힌트가 있다.


<!-- Hint : Make your point to 50 & 'SuNiNaTaS' -->

<!-- M@de by 2theT0P -->


일단 포인트를 50 만들어 보자



포인트를 올리는 중간에 이런 알림창이 표시되었다.


I like the SuNiNaTaS browser!



포인트는 25에서 멈추고 더 올릴려고 하면 같은 알림이 뜬다..


써니나타스 브라우저를 좋아한다고 하니... User-Agent 의 값을 SuNiNaTaS으로 바꿔주자.



brup suite를 사용했다.




포인트가 50이 되면 key를 얻을 수 있는데, 50을 넘어가버리면 key가 뜨지 않는다..

이럴 경우 쿠키값 지워주고 재로그인해서 다시 시도해야한다..


50이 되면 key가 뜸과 동시에 포인트가 초기화된다.





반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 2번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 1번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 3번문제 풀이입니다. 


[WEB]



공지 게시판에 글을 써라...


당연히 공지 게시판에는 글쓰기 버튼이 없다. 다른 게시판에서 찾아야 할 거 같은데...



글을 올릴 수 있는 게시판이 하나 있다. 바로 Q&A FREE BOARD


오른쪽 하단에 글쓰기 버튼이 있다.


이 버튼의 코드다 :


<input type="button" class="btnWrite gray" value="WRITE" onclick="location.href='../board/write.asp?page=1&amp;divi=Free'">



../board/write.asp?page=1&amp;divi=Free 으로 이동한다.



그런데, 공지게시판으로 이동하는 코드를 보면


<a href="../board/list.asp?divi=notice" class="button blue1 medium">NOTICE</a>



divi가 다르다. divi를 notice로 바꿔주어서 공지글쓰기 페이지로 이동해서 글을 게시하면 된다.





반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 2번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 1번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 2번문제 풀이입니다. 


[WEB]




그냥 로그인창이 하나 떠있습니다...


일단 페이지 소스를 확인해 봅시다....앗 프레임 소스 보기를 해야 맞는 코드가 뜹니다.



개발자도구 F12로 보는건 너무 뭐가 많아서

페이지 우클릭후 프레임 소스보기를 하셔야 편합니다.



소스 하단을 보시면, 자바스크립트 코드와 함께 힌트가 있습니다.


<script>

function chk_form(){

var id = document.web02.id.value ;

var pw = document.web02.pw.value ;

if ( id == pw )

{

alert("You can't join! Try again");

document.web02.id.focus();

document.web02.id.value = "";

document.web02.pw.value = "";

}

else

{

document.web02.submit();

}

}

</script>

<!-- Hint : Join / id = pw -->

<!-- M@de by 2theT0P -->



JS코드에서는 id와 pw가 같으면 안된다고 하고 있고, 힌트에서는 id와 pw가 같아야 한다고 하고 있습니다.


이는 자바스크립트 코드를 우회해 주면 되는데, 여러가지 방법이 있겠지만.. 저는 크롬 개발자 도구중 콘솔기능을 이용하겠습니다.


위 chk_form()함수를 아래와같이 재정의 했습니다.



function chk_form(){

var id = document.web02.id.value ;

var pw = document.web02.pw.value ;

        document.web02.submit();

}



이 코드를 콘솔에 입력해주었습니다.



그 다음 id와 pw에 같은 값을 넣어주면 authkey를 얻을 수 있습니다.

반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 1번] 풀이  (0) 2018.07.30
반응형

SuNiNaTaS의 1번문제 풀이입니다. 


[WEB]




문자열을 입력받는 폼이 있고, 아래에 코드가 있습니다.


코드를 보면, 입력받은 문자열을 처리하는 코드인 것 같습니다.


마지막에 결과가 admin이 되어야 authkey를 얻을 수 있나 봅니다.




        result = Replace(str,"a","aad")
        result = Replace(result,"i","in")
        result1 = Mid(result,2,2)
        result2 = Mid(result,4,6)
        result = result1 & result2


이것이 이제 핵심적인 코드라고 할 수 있는데요.


사용된 함수는 Replace()와 Mid() 두개 뿐입니다.


Replace(str, "a", "b")함수는 str의 "a"를 "b"로 치환해 주며, Mid(str, 1, 2)함수는 str의 1번째부터 2개의 문자를 가져옵니다.


.

.

.

그럼 이제 직접 풀어보세요!

.

.

.


.

.

.




위에서부터 하나씩 보면, a를 aad로 바꾸고, i를 in으로 바꾼 문자열에서

2번째부터 2개를 result1에, 4번째부터 6개를 result2에 저장하고

result1+result2가 admin이 되면 됩니다.


그럼 result1이 ad 가 되고 result2가 min이 되어야 하네요.


a가 aad가 되고 거기서 두번째부터 두개를 가져오면 ad가 됩니다.



result2를 생각해보면, 4번째부터 6개를 가져온게 min이 되어야 하고

in은 i가 바뀐 것이니


답은 ami 이네요.




이 문제는 직접 생각하면서 푸는게 이해가 제일 빠를 것 같습니다.



반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 2번] 풀이  (0) 2018.07.30

+ Recent posts