1580, 9/79 회원가입  로그인  
   ^^
   [펌]Ptrace를 이용한 재미는 해킹.

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=475 [복사]


/*
*   Ptrace을 이용한 재밌는 해킹
*   박성현 psh21a@hanmail.net
*   http://psh21a.org, http://psh21a.ttongfly.net
*/



ptrace는 생성된 프로세스에 대한 정보를 추적하기 위해 만들어진
시스템 콜이다.
디버거를 이용하여 재밌는 해킹을 할 수 있다.

[psh21a@psh21a ptrace]$ cat euid.c
int main()
{
        int uid;
        uid = geteuid();

        if(uid == 0){
                printf("You Are Roo\n");
        }

        printf("%d\n", uid);
}
[psh21a@psh21a ptrace]$ gcc -o euid euid.c -g -static

지금 이 소스는 geteuid()함수를 이용하여, euid를 받아온다. 그래서 uid에
할당한후에 if문에서 uid가 0이랑 같은지 확인을 해서 같다면 You are ROOT
라는 문장을 출력하게 해준다.
그런데 uid가 0이면 루트 권한이 있다는 뜻인데 과연 어떻게 할까?
uid가 0이랑 같지 않다면 지금 자기자신의 uid를 보여주고 끝이 난다.
이 작업을 할때는 꼭 루트가 아닌 일반계정으로 해야한다.

디버거를 이용해서 재밌는걸 해보겠다.

(gdb) disas main
Dump of assembler code for function main:
0x080481d0 <main+0>:    push   %ebp
0x080481d1 <main+1>:    mov    %esp,%ebp
0x080481d3 <main+3>:    sub    $0x8,%esp
0x080481d6 <main+6>:    and    $0xfffffff0,%esp
0x080481d9 <main+9>:    mov    $0x0,%eax
0x080481de <main+14>:   sub    %eax,%esp
0x080481e0 <main+16>:   call   0x804da10 <geteuid>
0x080481e5 <main+21>:   mov    %eax,0xfffffffc(%ebp)
0x080481e8 <main+24>:   cmpl   $0x0,0xfffffffc(%ebp)
0x080481ec <main+28>:   jne    0x80481fe <main+46>
0x080481ee <main+30>:   sub    $0xc,%esp
0x080481f1 <main+33>:   push   $0x808ef68
0x080481f6 <main+38>:   call   0x80488c4 <printf>
0x080481fb <main+43>:   add    $0x10,%esp
0x080481fe <main+46>:   sub    $0x8,%esp
0x08048201 <main+49>:   pushl  0xfffffffc(%ebp)
0x08048204 <main+52>:   push   $0x808ef76
0x08048209 <main+57>:   call   0x80488c4 <printf>
0x0804820e <main+62>:   add    $0x10,%esp
0x08048211 <main+65>:   leave
0x08048212 <main+66>:   ret
End of assembler dump.

geteuid함수가 호출된다.

(gdb) disas geteuid
Dump of assembler code for function geteuid:
0x0804da10 <geteuid+0>: mov    0x80a36b0,%eax
0x0804da15 <geteuid+5>: push   %ebp
0x0804da16 <geteuid+6>: test   %eax,%eax
0x0804da18 <geteuid+8>: mov    %esp,%ebp
0x0804da1a <geteuid+10>:        jle    0x804da28 <geteuid+24>
0x0804da1c <geteuid+12>:        mov    $0x31,%eax
0x0804da21 <geteuid+17>:        int    $0x80
0x0804da23 <geteuid+19>:        leave
0x0804da24 <geteuid+20>:        ret
0x0804da25 <geteuid+21>:        lea    0x0(%esi),%esi
0x0804da28 <geteuid+24>:        mov    $0xc9,%eax
0x0804da2d <geteuid+29>:        int    $0x80
0x0804da2f <geteuid+31>:        cmp    $0xfffff000,%eax
0x0804da34 <geteuid+36>:        jbe    0x804da23 <geteuid+19>
0x0804da36 <geteuid+38>:        cmp    $0xffffffda,%eax
0x0804da39 <geteuid+41>:        jne    0x804da23 <geteuid+19>
0x0804da3b <geteuid+43>:        movl   $0x1,0x80a36b0
0x0804da45 <geteuid+53>:        jmp    0x804da1c <geteuid+12>
0x0804da47 <geteuid+55>:        nop
End of assembler dump.

우리는 geteuid함수에서 ret 하기전에 브레이크를 걸어서 uid가 0이
되도록 만들어볼것이다.
그러기 위해서 우리는 ret에 브레이크를 걸어야한다.

(gdb) break *geteuid+20
Breakpoint 1 at 0x804da24

그런 후에 실행을 시킨다.

(gdb) run
Starting program: /home/psh21a/test/ptrace/euid

Breakpoint 1, 0x0804da24 in geteuid ()

실행을 시키면 geteuid()안에서 0x0804da24에서 브레이크가 걸렸다고 나온다.

(gdb) info reg
eax            0x1f4    500
ecx            0x33f    831
edx            0x37f    895
ebx            0xbffff3bc       -1073744964
esp            0xbffff14c       0xbffff14c
ebp            0xbffff158       0xbffff158
esi            0xbffff3b4       -1073744972
edi            0x1      1
eip            0x804da24        0x804da24
eflags         0x203    515
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0

레지스터들의 값을 보여준다.
저기 보면 eax에 지금 500이라는 지금 아이디의 uid가 나온다.
저기 eax 부분을 바꿔준다.

(gdb) set $eax = 0
(gdb) info reg
eax            0x0      0
ecx            0x33f    831
edx            0x37f    895
ebx            0xbffff3bc       -1073744964
esp            0xbffff14c       0xbffff14c
ebp            0xbffff158       0xbffff158
esi            0xbffff3b4       -1073744972
edi            0x1      1
eip            0x804da24        0x804da24
eflags         0x203    515
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0

eax레지스터의 값이 바뀐것을 볼 수 있다.

(gdb) c
Continuing.

Breakpoint 1, 0x0804da24 in geteuid ()
(gdb) info reg
eax            0x1f4    500
ecx            0x2f2f2f2f       791621423
edx            0x80a3ebc        134889148
ebx            0x8048584        134514052
esp            0xbffff16c       0xbffff16c
ebp            0xbffff178       0xbffff178
esi            0x2d     45
edi            0x20414  132116
eip            0x804da24        0x804da24
eflags         0x203    515
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0

다시 eax가 500으로 돌아왔다. 그럼 다시 0으로 바꿔준다.

(gdb) set $eax = 0
(gdb) info reg
eax            0x0      0
ecx            0x2f2f2f2f       791621423
edx            0x80a3ebc        134889148
ebx            0x8048584        134514052
esp            0xbffff16c       0xbffff16c
ebp            0xbffff178       0xbffff178
esi            0x2d     45
edi            0x20414  132116
eip            0x804da24        0x804da24
eflags         0x203    515
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0
(gdb) c
Continuing.
You Are Root
0

Program exited with code 02.
(gdb)

이렇게 하게 되면 ROOT라고 뜨는것을 볼 수 있을것이다.
아아.. 이 얼마나 기쁜 순간인가!

ps. ptrace에 대해서 더 알고 싶으면 google을 이용해서 검색해보시길!

  Hit : 12481     Date : 2006/02/08 11:20



    
ckdmsghcoh ㅋㅋ 왠지 안될듯한 .ㅡ,.,.,.,., 2006/02/09  
mzzang 이상하게 ptrace는 한번도 안쓰시구 gdb만 쓰신듯...???? 2006/02/10  
whqkdnf000 안돼요-_- 2007/02/26  
exceed@null gdb만 쓰네... 2007/07/16  
1420   커널 업그레이드 방법[2]     빈대
01/04 8133
1419   geniusevil의 가벼운 c언어 배우기 1[30]     geniusevil
01/06 10260
1418   geniusevil의 가벼운 C언어 배우기 2[10]     geniusevil
01/09 9142
1417   2.4.x에서 2.6.x 로 컴파일 할때 주의할점[2]     dadmi29
01/09 8761
1416     [re] ckdmsghcoh님 답변[6]     geniusevil
01/09 6422
1415   하드웨어와 소프트웨어...그리고 불가능한일?[16]     아이프리드
01/11 9431
1414   리눅스 방화벽의 종류...[4]     bsjzzz
01/12 13636
1413   * 보안에 대한 주요 FAQ[8]     dl4815
01/14 10478
1412   [펌]로그지우기[12]     khas
01/18 11129
1411   geniusevil의 가벼운 c언어 배우기 3[7]     geniusevil
01/19 10352
1410   작업표시줄의 그룹화 갯수 지정하기![7]     kgt2001sus
02/02 7151
1409   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 1[11]     아이프리드
02/03 11357
1408   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 2     아이프리드
02/03 9554
1407   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 3[16]     아이프리드
02/03 12697
1406   리눅스에서 스타크래프트를 한다?[9]     jonginsir
02/08 13040
  [펌]Ptrace를 이용한 재미는 해킹.[4]     ^^
02/08 12480
1404   ping 강좌...[11]     kgt2001sus
02/13 9013
1403   간단한 그래픽 오버(지포스계열)[8]     nsh009
02/15 7950
1402   네이버지식인 [펌]xp 우리가 모르는것들1[4]     jbp1858
02/16 10796
1401   네이버지식인 [펌]xp 우리가모르는것들 2[1]     jbp1858
02/16 7672
[1][2][3][4][5][6][7][8] 9 [10]..[79]

Copyright 1999-2023 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com