HO_9
HO9
HO_9
전체 방문자
오늘
어제
  • 분류 전체보기 (104)
    • Write Up (3)
    • WarGame (21)
      • The Lord of Bufferoverflow(.. (7)
      • The Lord of Sql Injection(L.. (1)
      • Pwnable.kr (1)
      • Pwnable.tw (0)
      • XSS GAME (6)
      • Pwnable.xyz (5)
    • SYSTEM HACKING (49)
      • 기법 (24)
      • 문제 풀이 (24)
    • CODING (2)
      • PYTHON (2)
    • WEB HACKING (1)
    • Plan (0)
    • PROJECT (0)
    • iOS (6)
    • ALGORITHM (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • .

인기 글

태그

  • JNDI
  • 아파치
  • log4j
  • 취약점

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HO_9

HO9

DAY-4 프로세스 디버깅
SYSTEM HACKING/기법

DAY-4 프로세스 디버깅

2017. 11. 2. 22:45
728x90

오늘은 프로세스를 디버깅 하는 방법에 대해서 알아 볼 것이다.


일단은 소켓과로컬을 연결을 한 후에 GDB,strace,ltrace를 통해서 디버깅을 해볼 것 이다.


소켓과 로컬을 연결하기 위한 xinetd 라는 소켓-로컬 연결 대몬을 설치한다.


그후

simplebof라는 파일을 서비스로 등록을 한 후에 그 서비스 프로세스를 디버깅해보겠다.


#include <stdio.h>


void call_system(){

 system("/bin/sh");

}


void get_message(char msg[]){

 char admin[128];

 read(0,msg,512);

 strcpy(admin,msg);  //strcpy는 오른쪽의 인자의 값을 왼쪽의 인자에 복사해준다.

//admin의 저장공간은128 하지만 msg의 공간에는 512를 저장 할 수 있다.

 //msg에서 128공간을 넘게 쓴후 admin 공간으로 복사를하면 문제가된다.그것이 이 코드의 문제점이 된다.

}


int main(void){

 char id[20];

 char pw[256];

 char message[512];


 setvbuf(stdout, 0, _IONBF, 0);


 write(1,"ID:",3);

 read(0,id,20);

 write(1,"PW:",3);

 read(0,pw,256);


 printf("Hello! %s\n",&id);

 printf("Input your message to admin.\n");


 get_message(message);

 printf("Your Message Is %s\n",&message);


 printf("Thank you!\n");

}


simplebof파일의 소스이다.


이 파일을 /etc/xinetd.d/(서비스 이름)의 경로로 만들어준다.

vi vim 또는 gedit 등으로 열어주면된다.


service 서비스명

{

 flags = REUSE

 socket_type = stream

 wait = no

 user = 프로그램을 실행할 사용자 명

 server = 프로그램 위치

 disable = no

}


서비스를 만들기위한 뼈대이다.
user은 사용자명을 적어주고
server에는 simplebof의 주소를 적어주면된다.

(※simplebof의 권한을 잘 확인을 해주어야 한다)

echo "(서비스명) (포트)/tcp" >> /etc/services를 통해서 서비스를 실행할 이름과 포트 번호를 지정한다.
작성을 끝낸 후 에는 service xinetd restart를 해주어야 한다.

정해진 포트로 접속을 해보면 ps가 뜰것이다.

접속을 위해서 파이썬 소켓을 이용해 보겠다.

python을 실행 한 다음

from socket import * //소켓 모듈을 불러온다
s= socket(AF_INET,SOCK_STREAM) //AF_INET은 IPV4를 이용한 인터넷 프로토콜을 사용한다는 것이다
     //SOCK_STREAM은 연결 지향형 소켓이다.데이터 손실 없이 무사히 전달을 한다  
                                 (참고:http://mintnlatte.tistory.com/267,
http://mintnlatte.tistory.com/263)

s.connect(("localhost",4453)) //자신의 아이피주소,정한 포트를 입력해주자.

s.recv()     //소켓으로부터 데이터를받는다.()안에는 받고싶은 데이터의 양을 적으면 된다.
s.send()    //()안에 문자열의 형태로 값을 입력 할 수 있다.



연결이 잘됬고 값도 잘 받아오는 것을 볼 수 있다.

s.connect하는 순간 ps가 생길것이다.
ps -A |grep simplebof //ps의 옵션 -A는 ps의 모든정보를 출력하고 grep은 원하는 글자의 결과만 뽑을 수 있다.
그럼 simplebof의 PID가 보일 것 이다.

GDB를 이용해서 프로세스를 디버깅해보자!

프로세스를 디버깅하는 방법은
gdb를 킨 후 attach (PID)를 하면 연결이 되는것을 볼 수 있다.
그 후 취약점이 보이는  get_message부분을 disas해서 보겠다.




read부분에서 인자로 0(fd),ebp+0x8(저장위치(msg)),0x200(입력받을수 있는 값)

이 곳을 보면 ebp+0x8에 저장되는 것을 알 수 있다.

그 다음 strcpy부분을 보면 ebp+0x8부분을 넣고 ebp-0x88부분도 넣는 것을 볼 수 있다.

ebp+0x8부분은 msg의 저장공간 ebp-0x88부분이 admin의 저장공간인 것을 알게되었다.


그럼 값을 넣고 ebp-0x88부분을 봐보겠다.



넣은 값이 메모리 공간에 올라가 있는 것을 볼 수 있다.

그럼 saved eip까지 침범을해서 call_system함수를 실행해 보자.


140개의 공간을 채우고 call_system의 주소를 입력해주면 될 것이다.(자세한 설명은 DAY-3)


소켓을 이용해서 값을 보내면 될것이다.




쉘을 획득한 것을 볼 수 있다.

소켓을 이용한 통신,프로세스를 디버깅 하는 방법을 알아 보았다.

'SYSTEM HACKING > 기법' 카테고리의 다른 글

DAY-6 Return To Library  (0) 2017.11.11
DAY-5 쉘코드 작성  (0) 2017.11.10
DAY-3 버퍼오버플로우를 풀어보자  (0) 2017.10.23
DAY-2 GDB로 어셈블리 해석  (0) 2017.10.17
DAY-1 Command Injection  (0) 2017.10.16
    'SYSTEM HACKING/기법' 카테고리의 다른 글
    • DAY-6 Return To Library
    • DAY-5 쉘코드 작성
    • DAY-3 버퍼오버플로우를 풀어보자
    • DAY-2 GDB로 어셈블리 해석
    HO_9
    HO_9

    티스토리툴바