Guest User

Untitled

a guest
Jul 16th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 10.25 KB | None | 0 0
  1. require 'metasm'
  2. include Metasm
  3.  
  4. require 'socket'
  5. require 'ipaddr'
  6. require 'thread'
  7.  
  8. def ntohl(x)
  9.   #return x                                                                                                                                                                                    
  10.   [x].pack('N').unpack('L').first
  11. end
  12.  
  13. def make_ip_string(sockaddr)
  14.   ip = IPAddr.new(ntohl(sockaddr.sin_addr.s_addr),Socket::AF_INET).to_s
  15.   port = ntohs(sockaddr.sin_port)
  16.   return "%s:%d" % [ip,port]
  17. end
  18.  
  19.  
  20. def ntohs(x)
  21.   #return x                                                                                                                                                                                    
  22.   [x].pack('n').unpack('S').first
  23. end
  24.  
  25. def convert_ip(ip)
  26.   IPAddr.new(ntohl(ip),Socket::AF_INET).to_s
  27. end
  28.  
  29. def fix_signed(x,t)
  30.   return [x].pack(t).unpack(t).first
  31. end
  32.  
  33.  
  34. def accept_get_args(dbg)
  35.  
  36.   case dbg.ptrace.tgcpu.shortname
  37.     ## x64 is easy.. but there is still something wrong...                                                                                                                                    
  38.   when 'x64' then [:rdi,:rsi,:rdx].map {|reg| dbg[reg] }
  39.   when 'ia32'
  40.     ## sys_socketcall - ecx points to *args                                                                                                                                                    
  41.     ## ecx[0] -> fd                                                                                                                                                                            
  42.     ## ecx[1] -> &sockaddr_in                                                                                                                                                                  
  43.     ## ecx[2] -> &sizeof(sockaddr_in)                                                                                                                                                          
  44.     ecx = dbg[:ecx]
  45.     [ecx,ecx+4,ecx+8].map {|addr| dbg.memory_read_int(addr) }
  46.   end
  47.  
  48. end
  49. def decode_accept(dbg,cp,acc=true,dupa2=false)
  50.  
  51.   sysreg = dbg.ptrace.syscallreg
  52.   reg_off= dbg.ptrace.reg_off
  53.   retreg = sysreg.sub(/ORIG_/,'')
  54.                                                                                                                                            
  55.   args = accept_get_args(dbg)
  56.                                                                                                                                            
  57.   make_syscall(dbg)
  58.  
  59.   retval = dbg.sysret
  60.   return retval if retval < 0 ## nothing here go out                                                                                                                                          
  61.  
  62.   ## straith-forward dump of parameters                                                                                                                                                        
  63.   slen = args[2].zero? ? 0 : dbg.memory_read_int(args[2]) & 0xffff_ffff
  64.   sockaddr_in = cp.decode_c_struct('sockaddr_in',dbg[args[1],slen],0)
  65.   ip_str = make_ip_string(sockaddr_in)
  66.   return if ip_str =="0.0.0.0:0"
  67.   return ip_str
  68.  
  69. end
  70.  
  71. def make_syscall(dbg)
  72.   bcs = dbg.callback_syscall
  73.   dbg.callback_syscall =nil
  74.   dbg.syscall_wait
  75.   dbg.callback_syscall =bcs
  76. end
  77.  
  78.  
  79.  
  80. def extend_dbg(dbg)
  81.  
  82.   class << dbg
  83.  
  84.    def get_reg_value(r)
  85.       return 0 if @state != :stopped
  86.       ctx.get_reg(r.downcase.to_sym)
  87.     rescue Errno::ESRCH
  88.       0
  89.     end
  90.  
  91.     def set_reg_value(r, v)
  92.       ctx.set_reg(r.downcase.to_sym, v)
  93.     end
  94.  
  95.     def sysret
  96.       retval = @ptrace.peekusr(@ptrace.reg_off[retreg])
  97.       [retval].pack(@ptrace.packint).unpack(@ptrace.packint).first
  98.     end
  99.  
  100.  
  101.     def sysreg
  102.       @ptrace.syscallreg
  103.     end
  104.  
  105.     def retreg
  106.       sysreg.sub(/ORIG_/,'')
  107.     end
  108.  
  109.     def sysreg=(v)
  110.       set_reg_value(sysreg, v)
  111.     end
  112.  
  113.     def retreg=(v)
  114.       set_reg_value(retreg, v)
  115.     end
  116.  
  117.   end
  118. end
  119.  
  120. sockaddr_in =<<EOS                                                                                                                                                                            
  121. typedef unsigned short u_short;                                                                                                                                                                
  122. typedef unsigned __int32 uint32_t;                                                                                                                                                            
  123. typedef uint32_t in_addr_t;                                                                                                                                                                    
  124. struct in_addr                                                                                                                                                                                
  125.   {                                                                                                                                                                                            
  126.     in_addr_t s_addr;                                                                                                                                                                          
  127.   };                                                                                                                                                                                          
  128. struct sockaddr_in                                                                                                                                                                            
  129. {                                                                                                                                                                                              
  130.   u_short sin_family; /* must be AF_INET */                                                                                                                                                    
  131.   u_short sin_port;                                                                                                                                                                            
  132.   struct  in_addr sin_addr;                                                                                                                                                                    
  133.   char    sin_zero[8]; /* Not used, must be zero */                                                                                                                                            
  134. };                                                                                                                                                                                            
  135. EOS
  136. pid1= ARGV.shift.to_i
  137.  
  138.   begin
  139.  
  140.     $dbg = LinDebugger.new(pid1)
  141.     extend_dbg($dbg)
  142.  
  143. #    $dbg.bpx(0x8048754) {                                                                                                                                                                    
  144. #      puts "[+] (#{$dbg.pc}) foo"                                                                                                                                                            
  145. #    }                                                                                                                                                                                        
  146.  
  147.     cp = $dbg.cpu.new_cparser
  148.     cp.parse sockaddr_in
  149.  
  150.  
  151.     $dbg.callback_syscall = lambda do |info|
  152.       #p info                                                                                                                                                                                  
  153.  
  154.       if is_accept?(info,$dbg) and ip_str = decode_accept($dbg,cp,true,true)
  155.         rip_str = ip_str
  156.         # if ip_str.kind_of? String and ip_str.split(':')[0] == "127.0.0.1"                                                                                                                    
  157.         #   rip_str = $mutex.synchronize {                                                                                                                                                    
  158.         #     cv.wait($mutex)                                                                                                                                                                  
  159.         #     p $map                                                                                                                                                                          
  160.         #     $map[ip_str]                                                                                                                                                                    
  161.         #   }                                                                                                                                                                                  
  162.         # end                                                                                                                                                                                  
  163.      
  164.           $stderr.puts "(t2) conn: #{ip_str} | real: #{rip_str}"
  165.           $stderr.flush
  166.      
  167.           ## move-on                                                                                                                                                                          
  168. #        $dbg.ptrace.syscall ; ::Process.waitpid($dbg.pid)                                                                                                                                    
  169.       end
  170.  
  171.     end
  172.  
  173.     $dbg.syscall_wait until $dbg.state == :dead
  174.  
  175.   rescue Interrupt
  176.  
  177.     $stderr.puts "[*] C-c detaching"
  178. #    Thread.list.each { |t| t.exit  }                                                                                                                                                          
  179.  
  180.   rescue  => e
  181.     $stderr.puts "(t2)[-] (#{Time.now.strftime("%s")}) Error:  #{e.message}"
  182.     $stderr.puts e.backtrace.join("\n")
  183.     $stderr.puts ""
  184.     $stderr.puts $dbg.ctx.do_getregs if !$dbg.nil?
  185.   ensure
  186.     $stderr.puts "asdf"
  187.     $dbg.detach if !$dbg.nil?
  188.   end
Add Comment
Please, Sign In to add comment