오늘은 프로세스를 디버깅 하는 방법에 대해서 알아 볼 것이다.
일단은 소켓과로컬을 연결을 한 후에 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
}
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 |