DongDD's IT

[2018 TUCTF] Write-up 본문

CTF/Write-up

[2018 TUCTF] Write-up

DongDD 2018. 11. 26. 15:21

[2018 TUCTF] Write-up



Literal


Category : Misc


Problem : Something's going over my head, and it's too fast for me to catch! (Difficulty: Easy)


Challenge Linkhttp://18.222.124.7



해당 Link에 접속하면 다음과 같은 페이지로 Redirection이 된다.

해당 주소의 source code를 확인해보았다.



해당 페이지에서도 /Literal.html로 Redirection이 되는 것을 확인할 수 있었다.

해당 페이지로 접속해보았다.




해당 페이지에 들어가보니 다음과 같이 폭탄 모양의 글씨들이 있었고 자세히 보면 TUCTF가 있는 것을 볼 수 있었고 소문자를 제외한 모든 값을 풀어서 썼더니 flag가 완성되는 것을 확인할 수 있었다.


Answer & Flag


FLAG : TUCTF{R34L.ON35.4r3.D4NG3ROU5}



Mrs. White's Messy Maids



Category : Web


Problem : Mrs. White's simple website might be hiding some murderous intentions...


Challenge Link : http://18.218.152.56/



해당 주소로 접속해보니 다음과 같은 페이지가 나왔다.

여러 부분을 살펴봤지만 이상한 부분이 없어서 소스 코드를 확인해보았다.



소스 코드에 주석 처리된 부분이 있었고 /Boddy라는 것이 써있는 것으로 보아 /Boddy에 Flag가 있을 거라 추측되었고 Boddy에 들어가니 Flag가 출력되었다.



Answer & Flag


FLAG : TUCTF{1_4ccu53_Mr5._Wh173_w17h_7h3_c4ndl3571ck_1n_7h3_c0mm3n75}



Mr. Green's Weird Website


Category : Web


Problem : While investigating Mr. Green for something completely unrelated, we found this login page. Maybe you can find a way in?


Challenge Link : http://18.219.196.70/




해당 사이트에 들어가니 로그인할 수 있는 페이지가 나왔다.

admin/admin을 입력했더니 바로 flag를 획득할 수 있었다.


Answer & Flag



FLAG : TUCTF{1_4ccu53_mr._6r33n_w17h_7h3_b4d_p455w0rd_1n_7h3_l061n}



RSAyyyy


Category : Crypto


Problem : This challenge is designed to give an overview of the RSA algorithm.

If you have a team member that is less familiar with RSA that wants to be, give this challenge to them.

This might be useful.


Challenge Link : nc 3.16.57.250 12345



처음에 nc로 접속하니 다음과 같은 화면이 출력되었다.



Script를 짜서 풀 수 있을 거란 생각이 들었지만 귀찮아서 일일이 다 해보며 진행했다.

처음에는 단순히 n을 구하는 것이였기 때문에 p*q를 출력하여 답을 넣었다.

2번째 문제는 평문을 10진수로 바꾸는 문제였다.


1
2
3
4
5
= "which satyr piracy freedom surety"
ans = 0
for i in range(0,len(s)):
    ans += pow(256len(s)-i-1)*ord(s[i])
= ans
cs


위와 같은 코드를 짜서 평문을 10진수로 바꾸니 통과할 수 있엇다.

각 문자가 8bit이기 때문에 256의 지수승으로 더해주며 구할 수 있었다.


그 다음은 e와 m, n이 주어졌을 때 c를 구하는 문제였다.

c = pow(m,e)%n으로 그냥 돌렸더니 조금 걸리기는 했지만 답이 나와 제출해 통과할 수 있었다.

다음은 tot(n)을 구하는 문제였는데 이것도 간단히 tot(n) = (p-1)(q-1)을 구해 제출하니 통과할 수 있었다.



다음은 d를 구하는 문제였는데 d는 단순히 구했을 때는 오래 걸려서 다른 방법을 찾아 계산하였다.


1
2
3
4
5
6
7
= 1
while 1:
    if (k*on+1)%e ==0:
        d = (k*on+1)/e
        break
    k += 1
 
cs


d = (k*tot(n)+1)/e(k : 상수)

일반적으로 c*d mod tot(n) = 1인 값을 찾아 d를 구하지만 해당 방법은 속도가 너무 느리기 때문에 위와 같은 방법을 사용하였다.

임의의 상수 k를 넣었을 때 e로 나누어 떨어지면 해당 값이 d가 된다.


그 다음으로 n을 factorization하여 p와 q를 구하는 문제가 나왔다. sqrt(n)을 하여 해당 값부터 2씩 감소시켜 찾는 방법으로 수행했지만 시간이 오래걸려 다른 방법을 찾다가 MAGMA라는 사이트를 알게 되었다.


Magmahttp://magma.maths.usyd.edu.au/calc/


해당 사이트에서 Factorization(n)을 수행하니 바로 p와 q가 나오는 것을 확인할 수 있었다.



그 다음은 위에서 수행했던 방식대로 d를 구하여 통과할 수 있었다.

마지막으로 m을 구하는 문제였다. 즉, 복호화를 하라는 문제였다.

처음에는 python으로 단순하게 pow(c,d) mod n으로 수행하여 풀려고 했지만 수가 너무 커서 그런지 오래 걸려 이 방법으로는 할 수 없다는 것을 알게 되었다.

그래서 이것도 magma를 이용하여 해결할 수 있었다.

Modexp(c, d, n)을 실행하니 바로 m이 나왔고 m을 입력하니 flag가 출력되었다.


Answer & Flag


FLAG : TUCTF{RSA_1$_R34LLY_C00L_4ND_1MP0RT4NT_CRYPT0}



yeahright



Category : Reversing


Problem : Difficulty: very easy

What an insensitive little program.

Show it who's boss!


Challenge Link : nc 18.224.3.130 12345


nc로 접속할 수 있는 주소와 binary파일 하나가 주어져있었다.

binary파일을 열어 소스 코드를 decompile하여 확인해보았다.



buf에 0x40 만큼 읽고 memcpy를 통해 pass와 비교한다.

다르다면 "yeahright"을 출력하고 프로그램이 종료된다.

같다면 system("/bin/cat ./flag");를 실행하여 flag를 출력해준다.

pass의 값을 확인하기 위해 클릭해보았다.


pass를 클릭했더니 위와 같은 값을 볼 수 있었고 이 값을 따라들어가보았다.



full string이 나왔고 해당 string을 입력으로 넣었더니 flag가 출력되었다.


Answer & Flag



FLAG : TUCTF{n07_my_fl46_n07_my_pr0bl3m}



Shoop


Category : Reversing


Problem : Difficulty: easy Black Hole Sun, won't you come

and put sunshine in my bag

I'm useless, but not for long

so whatcha whatcha whatcha want?


Challenge Link : nc 18.220.56.147 12345


nc로 접속할 수 있는 주소와 binary파일 하나가 주어져있었다.

binary파일을 열어 소스 코드를 decompile하여 확인해보았다.


decompile한 소스를 확인해보니 크게 3가지 부분으로 구성되어있었다.

일단 입력을 받게 되어있었다.


1. 1번째 for문

- reverse를 수행하여 src에 입력받은 s를 뒤짚어 넣음. 0~20을 20~0으로 뒤집는다.


2. 2번째 for문

- 입력받은 s의 각 문자에 -5를 수행


3. 3번째 for문

- src[k] = s[(k+10)%21]를 수행하며 permutation을 수행한다.


이렇게 3개의 for 문을 거친 후 값이 "jmt_j]tm`q`t_j]mpjtf^"라면 flag를 출력해준다.

즉, 이것을 역으로 수행하여 기존의 평문을 찾을 수 있다면 문제를 통과할 수 있을 것이다.


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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
    char *= (char *)malloc(sizeof(char *)*21);
    char *src = (char *)malloc(sizeof(char *)*21);
    memset(src, 0sizeof(src));
    read(0,src,0x15);
    int k,i,j;
    for(k = 0; k < 21; k++) {
        s[k] = src[(k-10)>=? k-10 : k-10+21];
    }
    for(j = ; j < 21; j++) {
        s[j] += 5;
    }
    for(i = 0; i <= 20; i++) {
        src[21-i-1= s[i];
    }
    for(i = ; i <=20; i++){ 
        printf("%c",src[i]);
    }
 
    printf("\n");
 
}
 
cs


이것을 역으로 수행하기 위해 위와 같은 source를 작성했다.

1. 1번째 for문

- 먼저 (k+10)%21에 들어갔던 값들을 역으로 -10하여 넣어주었다.

- s[k] = src[(k-10)%21]


2. 2번째 for문

- s의 각 문자에 5를 -해줬던 것을 다시 +5를 해준다.


3. 3번째 for문

- reverse를 수행했던 것을 다시 reverse를 수행하여 기존의 문자열을 얻을 수 있다.


해당 프로그램을 작성 후, "jmt_j]tm`q`t_j]mpjtf^"을 input으로 하니 원래의 문자열을 확인할 수 있었고 nc로 접속하여 해당 문자열을 입력하니 flag를 획득할 수 있었다.


Answer & Flag



FLAG : TUCTF{5w337_dr34m5_4r3_m4d3_0f_7h353}

Comments