Advertisement
Guest User

Untitled

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