Advertisement
Guest User

Untitled

a guest
May 26th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 19.80 KB | None | 0 0
  1. /* This file has been generated by the Hex-Rays decompiler.
  2.    Copyright (c) 2007-2010 Hex-Rays <info@hex-rays.com>
  3.  
  4.    Detected compiler: GNU C++
  5. */
  6.  
  7. #include <defs.h>
  8.  
  9. #include <stdarg.h>
  10.  
  11.  
  12. //-------------------------------------------------------------------------
  13. // Data declarations
  14.  
  15. extern char format[]; // idb
  16. extern char aUnableToCreate[]; // idb
  17. extern char aUnableToSetReu[]; // idb
  18. extern char aUnableToBindSo[]; // idb
  19. extern char aUnableToListen[]; // idb
  20. extern char aFailedToFindUs[]; // idb
  21. extern char aDrop_privsFail[]; // idb
  22. extern char aSetgidCurrentG[]; // idb
  23. extern char aSetgidCurrentU[]; // idb
  24. extern char a250DDD[]; // idb
  25. extern char a250Youdont_own[21]; // weak
  26. extern char a2508bitmime[15]; // weak
  27. extern char a250Youdont_o_0[21]; // weak
  28. extern char a221Youdont_own[21]; // weak
  29. extern char a2502_1_5Ok[15]; // weak
  30. extern char a550InvalidSend[21]; // weak
  31. extern char s2[]; // idb
  32. extern char a550UnknownOrIn[35]; // weak
  33. extern char a354EndDataWith[38]; // weak
  34. extern char a_[]; // idb
  35. extern char a__0[]; // idb
  36. extern char a2502_0_0OkQueu[37]; // weak
  37. extern char a334Vxnlcm5hbwu[19]; // weak
  38. extern char a334Ugfzc3dvcmq[19]; // weak
  39. extern char s[]; // idb
  40. extern char aZenata[]; // idb
  41. extern char modes[]; // idb
  42. extern char a220Youdont_own[]; // idb
  43. extern char a502Huh_[10]; // weak
  44. extern void *_progname; // weak
  45. extern void *p_4696; // weak
  46. extern __int16 svc_port; // weak
  47. extern char svc_user[]; // idb
  48. extern char cmds[33]; // weak
  49. extern int (__cdecl *handlers[3])(FILE *s); // weak
  50. extern int _CTOR_LIST__; // weak
  51. extern int _JCR_LIST__; // weak
  52. extern char completed_4698; // weak
  53. extern int environ; // weak
  54. extern time_t base; // idb
  55. extern int secret; // weak
  56.  
  57. //-------------------------------------------------------------------------
  58. // Function declarations
  59.  
  60. void (*__cdecl init_proc())(void);
  61. int setuid(__uid_t uid);
  62. int fprintf(FILE *stream, const char *format, ...);
  63. time_t time(time_t *timer);
  64. int seteuid(__uid_t uid);
  65. int chdir(const char *path);
  66. struct passwd *getpwnam(const char *name);
  67. __pid_t wait4(__pid_t pid, void *stat_loc, int options, struct rusage *usage);
  68. __pid_t fork(void);
  69. int _init_tls(void); // weak
  70. int accept(int fd, struct sockaddr *addr, socklen_t *addr_len);
  71. char *fgets(char *s, int n, FILE *stream);
  72. __gid_t getgid(void);
  73. int setgid(__gid_t gid);
  74. char *strncpy(char *dest, const char *src, size_t n);
  75. char *ctime(const time_t *timer);
  76. char *strchr(const char *s, int c);
  77. ssize_t recv(int fd, void *buf, size_t n, int flags);
  78. int socket(int domain, int type, int protocol);
  79. int fflush(FILE *stream);
  80. int listen(int fd, int n);
  81. void *memset(void *s, int c, size_t n);
  82. int setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen);
  83. int setegid(__gid_t gid);
  84. int vasprintf(char **, const char *, va_list);
  85. int initgroups(const char *, __gid_t group);
  86. int __cdecl setresgid();
  87. int strcmp(const char *s1, const char *s2);
  88. int printf(const char *format, ...);
  89. FILE *fdopen(int fd, const char *modes);
  90. int close(int fd);
  91. void srand(unsigned int seed);
  92. int rand(void);
  93. int __cdecl setresuid(_DWORD, _DWORD); // weak
  94. __sighandler_t signal(int sig, __sighandler_t handler);
  95. __gid_t getegid(void);
  96. size_t fwrite(const void *ptr, size_t size, size_t n, FILE *s);
  97. ssize_t send(int fd, const void *buf, size_t n, int flags);
  98. void _exit(int status);
  99. void exit(int status);
  100. void err(int status, const char *format, ...);
  101. int bind(int fd, const struct sockaddr *addr, socklen_t len);
  102. void free(void *ptr);
  103. __uid_t getuid(void);
  104. int atexit(void (*func)(void));
  105. size_t strlen(const char *s);
  106. __uid_t geteuid(void);
  107. ssize_t read(int fd, void *buf, size_t nbytes);
  108. void __fastcall start(int a1, void (*func)(void), int a3);
  109. void __cdecl start1(void (*func)(void), int a2, void **a3);
  110. void __cdecl _do_global_dtors_aux();
  111. int __cdecl frame_dummy();
  112. int __cdecl main();
  113. __pid_t __cdecl sigchld();
  114. signed int __cdecl readAll(int fd, int a2, unsigned int a3);
  115. int __cdecl read_until_delim(int fd, int password, unsigned int size, char is_10);
  116. signed int __cdecl sendMsg(int fd, const char *s, int a3);
  117. signed int __cdecl sendAll(int fd, int a2, unsigned int a3);
  118. int sendFormat(int fd, const char *a2, ...);
  119. int __cdecl init_connection(unsigned __int16 a1);
  120. int __cdecl _bswap16(__int16 a1);
  121. void __cdecl loop(int sckt, int (__cdecl *client_callback)(_DWORD)); // idb
  122. int __cdecl drop_privs_user(const char *name);
  123. int __cdecl drop_privs(struct_a1 *SID); // idb
  124. int __cdecl status(FILE *stream); // idb
  125. int __cdecl ehlo(FILE *s); // idb
  126. int __cdecl helo(FILE *s); // idb
  127. int __cdecl quit(FILE *s); // idb
  128. int __cdecl mail(FILE *a1, const char *s);
  129. int __cdecl rcpt(FILE *hOutput, const char *s); // idb
  130. int __cdecl data(FILE *s, char *cadena); // idb
  131. int __cdecl auth(FILE *stream); // idb
  132. signed int __cdecl lookup(int Arg1); // idb
  133. signed int __cdecl client_callback(int Socket); // idb
  134. void (*__cdecl _do_global_ctors_aux())(void);
  135. void __cdecl term_proc();
  136. struct passwd *getpwnam(const char *name);
  137. __pid_t fork(void);
  138. char *ctime(const time_t *timer);
  139. int initgroups(const char *, __gid_t group);
  140. int setresgid(void); // weak
  141. int strcmp(const char *s1, const char *s2);
  142. FILE *fdopen(int fd, const char *modes);
  143. ssize_t read(int fd, void *buf, size_t nbytes);
  144.  
  145.  
  146. //----- (08048944) --------------------------------------------------------
  147. void (*__cdecl init_proc())(void)
  148. {
  149.   frame_dummy();
  150.   return _do_global_ctors_aux();
  151. }
  152.  
  153. //----- (08048C60) --------------------------------------------------------
  154. void __fastcall start(int a1, void (*func)(void), int a3)
  155. {
  156.   start1(func, v4, 8);
  157. }
  158.  
  159. //----- (08048C80) --------------------------------------------------------
  160. void __cdecl start1(void (*func)(void), int a2, void **a3)
  161. {
  162.   void *v3; // eax@2
  163.   char v4; // dl@3
  164.   void *v5; // eax@4
  165.   int v6; // eax@9
  166.  
  167.   environ = &a3[a2 + 1];
  168.   if ( a2 > 0 )
  169.   {
  170.     v3 = *a3;
  171.     if ( *a3 )
  172.     {
  173.       _progname = *a3;
  174.       v4 = *v3;
  175.       if ( *v3 )
  176.       {
  177.         v5 = v3 + 1;
  178.         do
  179.         {
  180.           while ( v4 != 47 )
  181.           {
  182.             v4 = *v5;
  183.             v5 = v5 + 1;
  184.             if ( !v4 )
  185.               goto LABEL_8;
  186.           }
  187.           _progname = v5;
  188.           v4 = *v5;
  189.           v5 = v5 + 1;
  190.         }
  191.         while ( v4 );
  192.       }
  193.     }
  194.   }
  195. LABEL_8:
  196.   atexit(func);
  197.   atexit(term_proc);
  198.   init_proc();
  199.   v6 = main();
  200.   exit(v6);
  201. }
  202. // 80489E8: using guessed type int _init_tls(void);
  203. // 804A000: using guessed type void *_progname;
  204. // 804A234: using guessed type int environ;
  205.  
  206. //----- (08048D20) --------------------------------------------------------
  207. void __cdecl _do_global_dtors_aux()
  208. {
  209.   void (*v0)(void); // edx@4
  210.  
  211.   if ( !completed_4698 )
  212.   {
  213.     while ( 1 )
  214.     {
  215.       v0 = *p_4696;
  216.       if ( !*p_4696 )
  217.         break;
  218.       p_4696 = p_4696 + 4;
  219.       v0();
  220.     }
  221.     completed_4698 = 1;
  222.   }
  223. }
  224. // 804A008: using guessed type void *p_4696;
  225. // 804A230: using guessed type char completed_4698;
  226.  
  227. //----- (08048D50) --------------------------------------------------------
  228. int __cdecl frame_dummy()
  229. {
  230.   int result; // eax@1
  231.  
  232.   result = _JCR_LIST__;
  233.   if ( _JCR_LIST__ )
  234.     result = 0;
  235.   return result;
  236. }
  237. // 804A164: using guessed type int _JCR_LIST__;
  238.  
  239. //----- (08048D80) --------------------------------------------------------
  240. int __cdecl main()
  241. {
  242.   int hSocket; // ST20_4@1
  243.  
  244.   hSocket = init_connection(svc_port);
  245.   drop_privs_user("digger");
  246.   time(&base);
  247.   srand(base);
  248.   secret = rand();
  249.   loop(hSocket, client_callback);
  250.   return 0;
  251. }
  252. // 804A020: using guessed type __int16 svc_port;
  253. // 804A23C: using guessed type int secret;
  254.  
  255. //----- (08048E00) --------------------------------------------------------
  256. __pid_t __cdecl sigchld()
  257. {
  258.   __pid_t result; // eax@1
  259.   char stat_loc; // [sp+24h] [bp-4h]@1
  260.  
  261.   do
  262.     result = wait4(-1, &stat_loc, 1, 0);
  263.   while ( result > 0 );
  264.   return result;
  265. }
  266.  
  267. //----- (08048E30) --------------------------------------------------------
  268. signed int __cdecl readAll(int fd, int a2, unsigned int a3)
  269. {
  270.   unsigned int i; // [sp+20h] [bp-8h]@1
  271.   ssize_t v6; // [sp+24h] [bp-4h]@2
  272.  
  273.   for ( i = 0; i < a3; i += v6 )
  274.   {
  275.     v6 = recv(fd, (a2 + i), a3 - i, 0);
  276.     if ( v6 <= 0 )
  277.       return -1;
  278.   }
  279.   return i;
  280. }
  281.  
  282. //----- (08048EA0) --------------------------------------------------------
  283. int __cdecl read_until_delim(int fd, int password, unsigned int size, char is_10)
  284. {
  285.   char buf; // [sp+23h] [bp-5h]@2
  286.   unsigned int i; // [sp+24h] [bp-4h]@1
  287.  
  288.   for ( i = 0; ; ++i )
  289.   {
  290.     if ( read(fd, &buf, 1u) <= 0 )
  291.       return -1;
  292.     if ( buf == is_10 )
  293.       break;
  294.     if ( i >= size )
  295.       return -1;
  296.     *(password + i) = buf;
  297.   }
  298.   return i;
  299. }
  300.  
  301. //----- (08048F20) --------------------------------------------------------
  302. signed int __cdecl sendMsg(int fd, const char *s, int a3)
  303. {
  304.   unsigned int v4; // [sp+14h] [bp-14h]@2
  305.   size_t v5; // [sp+24h] [bp-4h]@1
  306.  
  307.   v5 = strlen(s);
  308.   if ( a3 )
  309.     v4 = v5 + 1;
  310.   else
  311.     v4 = v5;
  312.   return sendAll(fd, s, v4);
  313. }
  314.  
  315. //----- (08048F70) --------------------------------------------------------
  316. signed int __cdecl sendAll(int fd, int a2, unsigned int a3)
  317. {
  318.   unsigned int i; // [sp+20h] [bp-8h]@1
  319.   ssize_t v6; // [sp+24h] [bp-4h]@2
  320.  
  321.   for ( i = 0; i < a3; i += v6 )
  322.   {
  323.     v6 = send(fd, (a2 + i), a3 - i, 0);
  324.     if ( !v6 )
  325.       return -1;
  326.   }
  327.   return i;
  328. }
  329.  
  330. //----- (08048FE0) --------------------------------------------------------
  331. int sendFormat(int fd, const char *a2, ...)
  332. {
  333.   char *ptr; // [sp+20h] [bp-8h]@1
  334.   int v4; // [sp+24h] [bp-4h]@1
  335.   va_list va; // [sp+38h] [bp+10h]@1
  336.  
  337.   va_start(va, a2);
  338.   v4 = 0;
  339.   ptr = 0;
  340.   if ( vasprintf(&ptr, a2, va) != -1 && ptr )
  341.     v4 = sendMsg(fd, ptr, 0);
  342.   else
  343.     v4 = -1;
  344.   free(ptr);
  345.   return v4;
  346. }
  347.  
  348. //----- (08049060) --------------------------------------------------------
  349. int __cdecl init_connection(unsigned __int16 a1)
  350. {
  351.   int optval; // [sp+18h] [bp-30h]@1
  352.   char s; // [sp+34h] [bp-14h]@1
  353.   char v4; // [sp+35h] [bp-13h]@1
  354.   __int16 v5; // [sp+36h] [bp-12h]@1
  355.   int fd; // [sp+44h] [bp-4h]@3
  356.  
  357.   optval = 1;
  358.   memset(&s, 0, 0x10u);
  359.   v4 = 2;
  360.   v5 = _bswap16(a1);
  361.   if ( signal(20, sigchld) == -1 )
  362.     err(-1, "Unable to set SIGCHLD handler");
  363.   fd = socket(2, 1, 0);
  364.   if ( fd == -1 )
  365.     err(-1, "Unable to create socket");
  366.   if ( setsockopt(fd, 65535, 4, &optval, 4u) == -1 )
  367.     err(-1, "Unable to set reuse");
  368.   if ( bind(fd, &s, 0x10u) == -1 )
  369.     err(-1, "Unable to bind socket");
  370.   if ( listen(fd, 20) == -1 )
  371.     err(-1, "Unable to listen on socket");
  372.   return fd;
  373. }
  374.  
  375. //----- (080491B0) --------------------------------------------------------
  376. int __cdecl _bswap16(__int16 a1)
  377. {
  378.   int result; // eax@1
  379.  
  380.   BYTE1(result) = a1;
  381.   LOBYTE(result) = HIBYTE(a1);
  382.   return result;
  383. }
  384.  
  385. //----- (080491D0) --------------------------------------------------------
  386. void __cdecl loop(int sckt, int (__cdecl *client_callback)(_DWORD))
  387. {
  388.   socklen_t addr_len; // [sp+24h] [bp-24h]@2
  389.   struct sockaddr addr; // [sp+28h] [bp-20h]@2
  390.   int infinite; // [sp+38h] [bp-10h]@1
  391.   int hSocket; // [sp+3Ch] [bp-Ch]@2
  392.   int retfork; // [sp+40h] [bp-8h]@3
  393.   int status; // [sp+44h] [bp-4h]@5
  394.  
  395.   infinite = 1;
  396.   while ( infinite )
  397.   {
  398.     addr_len = 16;
  399.     hSocket = accept(sckt, &addr, &addr_len);
  400.     if ( hSocket != -1 )
  401.     {
  402.       retfork = fork();
  403.       if ( retfork != -1 )
  404.       {
  405.         if ( !retfork )
  406.         {
  407.           close(sckt);
  408.           status = client_callback(hSocket);
  409.           close(hSocket);
  410.           exit(status);
  411.         }
  412.         close(hSocket);
  413.       }
  414.     }
  415.   }
  416. }
  417.  
  418. //----- (08049260) --------------------------------------------------------
  419. int __cdecl drop_privs_user(const char *name)
  420. {
  421.   struct passwd *username; // [sp+24h] [bp-4h]@1
  422.  
  423.   username = getpwnam(name);
  424.   if ( !username )
  425.     err(-1, "Failed to find user %s\n", name);
  426.   if ( drop_privs(username) == -1 )
  427.     err(-1, "drop_privs failed!\n");
  428.   return 0;
  429. }
  430.  
  431. //----- (080492C0) --------------------------------------------------------
  432. int __cdecl drop_privs(struct_a1 *SID)
  433. {
  434.   int v1; // ebx@8
  435.   __gid_t v2; // eax@8
  436.   int v3; // ebx@12
  437.   __uid_t v4; // eax@12
  438.   int retval; // [sp+10h] [bp-18h]@2
  439.   __uid_t userid; // [sp+18h] [bp-10h]@1
  440.   __gid_t groupid; // [sp+1Ch] [bp-Ch]@1
  441.  
  442.   userid = getuid();
  443.   groupid = getgid();
  444.   initgroups(SID->pchar0, SID->groupid);
  445.   if ( setresgid() >= 0 )
  446.   {
  447.     if ( setresuid(SID->userid, SID->userid) >= 0 )
  448.     {
  449.       if ( SID->groupid == groupid || setgid(groupid) == -1 && setegid(groupid) == -1 )
  450.       {
  451.         if ( SID->userid == userid || setuid(userid) == -1 && seteuid(userid) == -1 )
  452.         {
  453.           if ( getgid() == SID->groupid && getegid() == SID->groupid )
  454.           {
  455.             if ( getuid() == SID->userid && geteuid() == SID->userid )
  456.               retval = chdir(SID->dir);
  457.             else
  458.               retval = -1;
  459.           }
  460.           else
  461.           {
  462.             retval = -1;
  463.           }
  464.         }
  465.         else
  466.         {
  467.           v3 = SID->userid;
  468.           v4 = getuid();
  469.           printf("setgid current uid: %d target uid: %d\n", v4, v3);
  470.           retval = -1;
  471.         }
  472.       }
  473.       else
  474.       {
  475.         v1 = SID->groupid;
  476.         v2 = getgid();
  477.         printf("setgid current gid: %d target gid: %d\n", v2, v1);
  478.         retval = -1;
  479.       }
  480.     }
  481.     else
  482.     {
  483.       retval = -1;
  484.     }
  485.   }
  486.   else
  487.   {
  488.     retval = -1;
  489.   }
  490.   return retval;
  491. }
  492. // 8048B68: using guessed type int __cdecl setresuid(_DWORD, _DWORD);
  493.  
  494. //----- (08049470) --------------------------------------------------------
  495. int __cdecl status(FILE *stream)
  496. {
  497.   int v1; // ST34_4@1
  498.   unsigned int v2; // ST38_4@1
  499.  
  500.   v1 = secret;
  501.   v2 = time(0) - base;
  502.   fprintf(stream, "250 %d:%d:%d\r\n", v2 / 0xE10, v2 % 0xE10 / 0x3C, v2 % 0x3C);
  503.   if ( v1 != secret )
  504.     _exit(1);
  505.   return 0;
  506. }
  507. // 804A23C: using guessed type int secret;
  508.  
  509. //----- (08049570) --------------------------------------------------------
  510. int __cdecl ehlo(FILE *s)
  511. {
  512.   int v1; // ST24_4@1
  513.  
  514.   v1 = secret;
  515.   fwrite("250-youdont.own.me\r\n", 1u, 0x14u, s);
  516.   fwrite("250 8BITMIME\r\n", 1u, 0xEu, s);
  517.   if ( v1 != secret )
  518.     _exit(1);
  519.   return 0;
  520. }
  521. // 804A23C: using guessed type int secret;
  522.  
  523. //----- (080495F0) --------------------------------------------------------
  524. int __cdecl helo(FILE *s)
  525. {
  526.   int v1; // ST24_4@1
  527.  
  528.   v1 = secret;
  529.   fwrite("250 youdont.own.me\r\n", 1u, 0x14u, s);
  530.   if ( v1 != secret )
  531.     _exit(1);
  532.   return 0;
  533. }
  534. // 804A23C: using guessed type int secret;
  535.  
  536. //----- (08049640) --------------------------------------------------------
  537. signed int __cdecl quit(FILE *s)
  538. {
  539.   int v1; // ST24_4@1
  540.  
  541.   v1 = secret;
  542.   fwrite("221 youdont.own.me\r\n", 1u, 0x14u, s);
  543.   if ( v1 != secret )
  544.     _exit(1);
  545.   return 1;
  546. }
  547. // 804A23C: using guessed type int secret;
  548.  
  549. //----- (08049690) --------------------------------------------------------
  550. int __cdecl mail(FILE *a1, const char *s)
  551. {
  552.   int v3; // [sp+1Ch] [bp-Ch]@1
  553.   char *user; // [sp+20h] [bp-8h]@1
  554.  
  555.   v3 = secret;
  556.   user = strchr(s, ':');
  557.   if ( user )
  558.   {
  559.     if ( strchr(user + 1, '@') )
  560.       fwrite("250 2.1.5 Ok\r\n", 1u, 0xEu, a1);
  561.     else
  562.       fwrite("550 Invalid sender\r\n", 1u, 0x14u, a1);
  563.   }
  564.   else
  565.   {
  566.     fwrite("550 Invalid sender\r\n", 1u, 0x14u, a1);
  567.   }
  568.   if ( v3 != secret )
  569.     _exit(1);
  570.   return 0;
  571. }
  572. // 804A23C: using guessed type int secret;
  573.  
  574. //----- (08049770) --------------------------------------------------------
  575. int __cdecl rcpt(FILE *hOutput, const char *s)
  576. {
  577.   int canary; // [sp+1Ch] [bp-Ch]@1
  578.   char *user; // [sp+20h] [bp-8h]@1
  579.   char *domain; // [sp+24h] [bp-4h]@2
  580.  
  581.   canary = secret;
  582.   user = strchr(s, ':');
  583.   if ( user )
  584.   {
  585.     domain = strchr(user + 1, '@');
  586.     if ( domain )
  587.     {
  588.       if ( strcmp(domain + 1, "youdont.own.me") )
  589.         fwrite("550 Unknown or invalid recipient\r\n", 1u, 0x22u, hOutput);
  590.       else
  591.         fwrite("250 2.1.5 Ok\r\n", 1u, 0xEu, hOutput);
  592.     }
  593.     else
  594.     {
  595.       fwrite("550 Unknown or invalid recipient\r\n", 1u, 0x22u, hOutput);
  596.     }
  597.   }
  598.   else
  599.   {
  600.     fwrite("550 Unknown or invalid recipient\r\n", 1u, 0x22u, hOutput);
  601.   }
  602.   if ( canary != secret )
  603.     _exit(1);
  604.   return 0;
  605. }
  606. // 804A23C: using guessed type int secret;
  607.  
  608. //----- (08049890) --------------------------------------------------------
  609. int __cdecl data(FILE *s, char *cadena)
  610. {
  611.   int canary; // [sp+24h] [bp-4h]@1
  612.  
  613.   canary = secret;
  614.   fwrite("354 End data with <CR><LF>.<CR><LF>\r\n", 1u, 0x25u, s);
  615.   do
  616.     fgets(cadena, 512, s);
  617.   while ( strcmp(cadena, ".\r\n") && strcmp(cadena, ".\n") );
  618.   fwrite("250 2.0.0 Ok: queued as 9BDF718A98\r\n", 1u, 0x24u, s);
  619.   if ( canary != secret )
  620.     _exit(1);
  621.   return 0;
  622. }
  623. // 804A23C: using guessed type int secret;
  624.  
  625. //----- (08049950) --------------------------------------------------------
  626. int __cdecl auth(FILE *stream)
  627. {
  628.   char password[64]; // [sp+24h] [bp-64h]@1
  629.   char username[32]; // [sp+64h] [bp-24h]@1
  630.   int canary; // [sp+84h] [bp-4h]@1
  631.  
  632.   canary = secret;
  633.   fwrite("334 VXNlcm5hbWU6\r\n", 1u, 0x12u, stream);
  634.   fgets(username, 32, stream);
  635.   fwrite("334 UGFzc3dvcmQ6\r\n", 1u, 0x12u, stream);
  636.   fgets(password, 64, stream);
  637.   if ( canary != secret )
  638.     _exit(1);
  639.   return 0;
  640. }
  641. // 804A23C: using guessed type int secret;
  642.  
  643. //----- (08049A00) --------------------------------------------------------
  644. signed int __cdecl lookup(int Arg1)
  645. {
  646.   unsigned int i; // [sp+Ch] [bp-8h]@1
  647.  
  648.   for ( i = 0; i <= 7; ++i )
  649.   {
  650.     if ( *&cmds[4 * i] == *Arg1 )
  651.       return i;
  652.   }
  653.   return -1;
  654. }
  655.  
  656. //----- (08049A50) --------------------------------------------------------
  657. signed int __cdecl client_callback(int Socket)
  658. {
  659.   char *time; // eax@1
  660.   signed int retval; // [sp+14h] [bp-134h]@2
  661.   char password[16]; // [sp+24h] [bp-124h]@1
  662.   int rethandler; // [sp+34h] [bp-114h]@1
  663.   FILE *stream; // [sp+38h] [bp-110h]@5
  664.   char cmd; // [sp+3Ch] [bp-10Ch]@1
  665.   char i; // [sp+13Bh] [bp-Dh]@1
  666.   time_t timer; // [sp+13Ch] [bp-Ch]@1
  667.   int canary; // [sp+140h] [bp-8h]@1
  668.   int retcmd; // [sp+144h] [bp-4h]@8
  669.  
  670.   canary = secret;
  671.   ::time(&timer);
  672.   rethandler = 0;
  673.   time = ctime(&timer);
  674.   strncpy(&cmd, time, 256u);
  675.   i = 0;
  676.   memset(password, 0, 0x10u);
  677.   sendMsg(Socket, "Password: ", 0);
  678.   if ( read_until_delim(Socket, password, 0xFu, 10) > 0 )
  679.   {
  680.     if ( strcmp(password, "zenata") )
  681.     {
  682.       retval = 1;
  683.     }
  684.     else
  685.     {
  686.       stream = fdopen(Socket, "rb+");
  687.       if ( stream )
  688.       {
  689.         fprintf(stream, "220 youdont.own.me C-Mail service ready at %s", &cmd);
  690.         while ( !rethandler )
  691.         {
  692.           if ( fgets(&cmd, 0x100u, stream) )
  693.           {
  694.             retcmd = lookup(&cmd);
  695.             if ( retcmd < 0 )
  696.               fwrite("502 Huh\n?", 1u, 9u, stream);
  697.             else
  698.               rethandler = handlers[retcmd](stream);
  699.           }
  700.           else
  701.           {
  702.             rethandler = 1;
  703.           }
  704.           fflush(stream);
  705.         }
  706.       }
  707.       if ( canary != secret )
  708.         _exit(1);
  709.       retval = 0;
  710.     }
  711.   }
  712.   else
  713.   {
  714.     retval = 1;
  715.   }
  716.   return retval;
  717. }
  718. // 804A080: using guessed type int (__cdecl *handlers[3])(FILE *s);
  719. // 804A23C: using guessed type int secret;
  720.  
  721. //----- (08049C70) --------------------------------------------------------
  722. void (*__cdecl _do_global_ctors_aux())(void)
  723. {
  724.   void (*result)(void); // eax@1
  725.   int v1; // ebx@2
  726.  
  727.   result = _CTOR_LIST__;
  728.   if ( _CTOR_LIST__ != -1 )
  729.   {
  730.     v1 = 0;
  731.     do
  732.     {
  733.       result();
  734.       result = *(v1 + 134521168);
  735.       v1 -= 4;
  736.     }
  737.     while ( result != -1 );
  738.   }
  739.   return result;
  740. }
  741. // 804A154: using guessed type int _CTOR_LIST__;
  742.  
  743. //----- (08049C9C) --------------------------------------------------------
  744. void __cdecl term_proc()
  745. {
  746.   _do_global_dtors_aux();
  747. }
  748.  
  749. // ALL OK, 29 function(s) have been successfully decompiled
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement