본문 바로가기
보안과정/리버싱

Level 6 → Level 7

by Luuii 2017. 11. 29.

www.hackerschool.org 를 이용하여 공부한다.


목적 : signal() 함수의 취약점


시그널(signal)

> 하나의 프로세스(Process)가 다른 프로세스(Process)에게 보내는 비동기적 알림 이벤트 메시지


# kill [ -1 | -2 | -9 | -15 ] PID PID


[참고][클릭]시그널 종류



level6 사용자로 로그인

ID : level6

PASS : what the hell


<ENTER>

>> 1, 2, 3 번 모두 입력해도 몇초 후 접속이 끊어진다.


예전에 PC통신 해킹 할 시 가장 많이 썼던 방법 2가지

1. 세미콜론을 사용하는 방법

> 결국에는 쉘이 해석했었다. 로그인창에서 /etc/passwd를 빼내서 해킹


2. 인터럽트를 쓰는 방법. CTRL + C


(windows) 원본 운영체제

cmd 창 열기.


BBS 화면은 가짜 모듈인 것 같다. 이 메뉴를 우회할 수 있는 무언가가 있을 것 같다.

대신 우회할 수 있는 시점이 어디인가가 중요하다.


level6 사용자로 새로 로그인

-> IP/PASS : level6 / what the hell

<CTRL + D>를 누르면 접속이 끊어진다.


level6 사용자로 새로 로그인

-> IP/PASS : level6 / what the hell

>> 이 시점에서 <CTRL + C>를 누르니 프롬프트가 열렸다.

>> ( ? ) 어떻게 로그인 하자마자 프로그램이 실행 되었을까?


$ id

$ my-pass

$ ls -al


$ cat hint

$ file tn


$ cat .bashrc


$ cat password


사용자 로그인 → 환경파일(.bashrc(./tn)) → tn 프로그램 실행(번호) → 천리안(telnet)


○ 의사코드 생성

$ gdb tn

(gdb) disas main

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
Dump of assembler code for function main:
0x080484f8 <main+0>:    push   %ebp
0x080484f9 <main+1>:    mov    %esp,%ebp
0x080484fb <main+3>:    sub    $0x8,%esp
0x080484fe <main+6>:    sub    $0xc,%esp
0x08048501 <main+9>:    push   $0x80486f2
0x08048506 <main+14>:   call   0x8048384 <system>
0x0804850b <main+19>:   add    $0x10,%esp
0x0804850e <main+22>:   call   0x8048354 <getchar>
0x08048513 <main+27>:   sub    $0xc,%esp
0x08048516 <main+30>:   push   $0x80486fb
0x0804851b <main+35>:   call   0x8048384 <system>
0x08048520 <main+40>:   add    $0x10,%esp
0x08048523 <main+43>:   sub    $0xc,%esp
0x08048526 <main+46>:   push   $0x8048720
0x0804852b <main+51>:   call   0x80483c4 <printf>
0x08048530 <main+56>:   add    $0x10,%esp
0x08048533 <main+59>:   sub    $0xc,%esp
0x08048536 <main+62>:   push   $0x8048760
0x0804853b <main+67>:   call   0x80483c4 <printf>
0x08048540 <main+72>:   add    $0x10,%esp
0x08048543 <main+75>:   sub    $0xc,%esp
0x08048546 <main+78>:   push   $0x80487a0
0x0804854b <main+83>:   call   0x80483c4 <printf>
0x08048550 <main+88>:   add    $0x10,%esp
0x08048553 <main+91>:   sub    $0xc,%esp
0x08048556 <main+94>:   push   $0x8048760
0x0804855b <main+99>:   call   0x80483c4 <printf>
0x08048560 <main+104>:  add    $0x10,%esp
0x08048563 <main+107>:  sub    $0xc,%esp
0x08048566 <main+110>:  push   $0x8048760
0x0804856b <main+115>:  call   0x80483c4 <printf>
0x08048570 <main+120>:  add    $0x10,%esp
0x08048573 <main+123>:  sub    $0xc,%esp
0x08048576 <main+126>:  push   $0x80487e0
0x0804857b <main+131>:  call   0x80483c4 <printf>
0x08048580 <main+136>:  add    $0x10,%esp
0x08048583 <main+139>:  sub    $0xc,%esp
0x08048586 <main+142>:  push   $0x8048820
0x0804858b <main+147>:  call   0x80483c4 <printf>
---Type <return> to continue, or q <return> to quit---
0x08048590 <main+152>:  add    $0x10,%esp
0x08048593 <main+155>:  sub    $0xc,%esp
0x08048596 <main+158>:  push   $0x8048760
0x0804859b <main+163>:  call   0x80483c4 <printf>
0x080485a0 <main+168>:  add    $0x10,%esp
0x080485a3 <main+171>:  sub    $0xc,%esp
0x080485a6 <main+174>:  push   $0x8048860
0x080485ab <main+179>:  call   0x80483c4 <printf>
0x080485b0 <main+184>:  add    $0x10,%esp
0x080485b3 <main+187>:  sub    $0x8,%esp
0x080485b6 <main+190>:  push   $0x80484e0
0x080485bb <main+195>:  push   $0x2
0x080485bd <main+197>:  call   0x8048374 <signal>
0x080485c2 <main+202>:  add    $0x10,%esp
0x080485c5 <main+205>:  sub    $0xc,%esp
0x080485c8 <main+208>:  push   $0x80488a0
0x080485cd <main+213>:  call   0x80483c4 <printf>
0x080485d2 <main+218>:  add    $0x10,%esp
0x080485d5 <main+221>:  sub    $0x8,%esp
0x080485d8 <main+224>:  lea    0xfffffffc(%ebp),%eax
0x080485db <main+227>:  push   %eax
0x080485dc <main+228>:  push   $0x80488c3
0x080485e1 <main+233>:  call   0x8048394 <scanf>
0x080485e6 <main+238>:  add    $0x10,%esp
0x080485e9 <main+241>:  cmpl   $0x1,0xfffffffc(%ebp)
0x080485ed <main+245>:  jne    0x80485ff <main+263>
0x080485ef <main+247>:  sub    $0xc,%esp
0x080485f2 <main+250>:  push   $0x80488c6
0x080485f7 <main+255>:  call   0x8048384 <system>
0x080485fc <main+260>:  add    $0x10,%esp
0x080485ff <main+263>:  cmpl   $0x2,0xfffffffc(%ebp)
0x08048603 <main+267>:  jne    0x8048615 <main+285>
0x08048605 <main+269>:  sub    $0xc,%esp
0x08048608 <main+272>:  push   $0x80488db
0x0804860d <main+277>:  call   0x8048384 <system>
0x08048612 <main+282>:  add    $0x10,%esp
0x08048615 <main+285>:  cmpl   $0x3,0xfffffffc(%ebp)
0x08048619 <main+289>:  jne    0x804862b <main+307>
0x0804861b <main+291>:  sub    $0xc,%esp
0x0804861e <main+294>:  push   $0x80488f1
---Type <return> to continue, or q <return> to quit---
0x08048623 <main+299>:  call   0x8048384 <system>
0x08048628 <main+304>:  add    $0x10,%esp
0x0804862b <main+307>:  cmpl   $0x1,0xfffffffc(%ebp)
0x0804862f <main+311>:  je     0x804864d <main+341>
0x08048631 <main+313>:  cmpl   $0x2,0xfffffffc(%ebp)
0x08048635 <main+317>:  je     0x804864d <main+341>
0x08048637 <main+319>:  cmpl   $0x3,0xfffffffc(%ebp)
0x0804863b <main+323>:  je     0x804864d <main+341>
0x0804863d <main+325>:  sub    $0xc,%esp
0x08048640 <main+328>:  push   $0x8048920
0x08048645 <main+333>:  call   0x80483c4 <printf>
0x0804864a <main+338>:  add    $0x10,%esp
0x0804864d <main+341>:  leave
0x0804864e <main+342>:  ret
0x0804864f <main+343>:  nop
End of assembler dump.
 
cs


○ 복원된 의사코드

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
#include <stdio.h>
#include <signal.h>
 
void sig_func(int signo)
{
        printf("Can't use ctrl+c\n");
}
 
int main()
{
        char input;
        int select, i;
 
        system("cat hint");
        input = getchar();
        system("clear");
 
        printf("#####################################\n");
        printf("##                                 ##\n");
        printf("##        텔넷 접속 서비스         ##\n");
        printf("##                                 ##\n");
        printf("##     1. 하이텔   2. 나우누리     ##\n");
        printf("##     3. 천리안                   ##\n");
        printf("##                                 ##\n");
        printf("#####################################\n");
 
        for(i=1; i<32; i++)
        {
                if(i == SIGINT) signal(i, sig_func);
                else signal(i, SIG_IGN);
        }
 
        printf("\n접속하고 싶은 bbs를 선택하세요 : ");
        switch(input)
        {
                case 1: system("telnet 203.245.15.76"); break;
                case 2: system("telnet 203.238.129.97"); break;
                case 3: system("telnet 210.120.128.180"); break;
                default:
                        if(input !=1 && input !=2 && input !=3)
                                printf("잘못 입력하셨습니다. 접속을 종료합니다.\n");
        }
        return 0;
}
cs


반응형

'보안과정 > 리버싱' 카테고리의 다른 글

Level 8 → Level9  (0) 2017.11.30
Level 7 → Level 8  (0) 2017.11.29
Level 5 → Level 6  (0) 2017.11.29
Level 4 → Level 5  (0) 2017.11.28
Level 3 → Level 4  (0) 2017.11.28