1 Echo 프로그램
(1) Echo 서버
- Echo 클라이언트가 보낸 데이터를 터미널 상에 보여줌
- ./echo_server port_number
- echo.h의 헤더를 동일하게 사용함
(2) Echo 클라이언트
- Echo benign: echo 서버에게 8바이트 데이터를 보냄
- Echo crash: echo 서버에게 520바이트 데이터 보냄, echo 서버의 수행을 중단시킴
- Echo spawn: echo 서버에게 520바이트 데이터 보냄, echo 서버에 쉘 생성함
# Echo 서버
./echo_server port_number
./echo_server 15000
# Echo benign
./echo_bengin server_ip_address server_port_number
gcc -o echo_benign echo_benign.c
./echo_benign 127.0.0.1 15000
#Echo crash
./echo_crash server_ip_address server_port_number
gcc -o echo_crash echo_crash.c
./echo_crash 127.0.0.1 15000
# Echo spawn
./echo_spawn server_ip_address server_port_number offset
gcc -o echo_spawn echo_spawn.c
./echo_spawn 127.0.0.1 15000 250
2 echo_server
(1) echo_server.c
- address의 주소를 찍으면 esp인 스텍의 가장 위 주소를 알 수 있음
- 문자열 포트 번호를 인티저로 변환하고 포트 생성
- doEcho에서 실질적인 오버플로우 발생
- strcpy는 null byte가 나올 경우 복사 종료 hostname 8byte에 NULL byte(복사 종료 문자)가 없다면 ?
void doEcho(Packet *p)
{
char cmd[8];
strcpy(cmd,p->hostname);
printf("%s\n", cmd);
}
3 실습
(1) Echo benign
- 새로운 창에서 gcc 후 echo_benign 실행
- 기존 창 확인
(2) Echo crash
(3) Echo spawn
- NOP : 0x90으로 아무런 일을 하지 않음 shell code를 만날 때 까지 > NOP Sled를 하기 위해 사용
- Nop Sled에서는 CPU가 계속 실행하여 shellcode까지 이어지므로 Nop sled로 들어가게 하면 성공