Skip to content

Instantly share code, notes, and snippets.

@ik5
Created November 17, 2014 13:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ik5/027beeacaf4a1a4483bf to your computer and use it in GitHub Desktop.
Save ik5/027beeacaf4a1a4483bf to your computer and use it in GitHub Desktop.
require 'fiddle'
openssl = Fiddle.dlopen('/usr/lib/libssl.so')
SSL_library_init = Fiddle::Function.new(
openssl['SSL_library_init'],
[],
Fiddle::TYPE_INT
)
SSL_library_init.call # no parameters so no () requires
# => 1
SSL_load_error_string = Fiddle::Function.new(
openssl['SSL_load_error_strings'],
[],
Fiddle::TYPE_LONG
)
SSL_load_error_string.call
# => 139941785269192
@bararchy
Copy link

I get this:

require 'fiddle'
require 'socket'


libssl = Fiddle.dlopen('/usr/lib/libssl.so')
ssl_init = Fiddle::Function.new(libssl['SSL_library_init'],[],Fiddle::TYPE_DOUBLE)
ssl_load_error = Fiddle::Function.new(libssl['SSL_load_error_strings'],[],Fiddle::TYPE_DOUBLE)
ssl_client_method = Fiddle::Function.new(libssl['SSLv3_client_method'],[],Fiddle::TYPE_DOUBLE)
ssl_ctx = Fiddle::Function.new(libssl['SSL_CTX_new'],[Fiddle::TYPE_DOUBLE],Fiddle::TYPE_DOUBLE)
ssl_init.call
ssl_load_error.call
meth = ssl_client_method.call
ctx = ssl_ctx(meth).call

NoMethodError: undefined method `ssl_ctx' for main:Object

when using :

ctx = ssl_ctx.call(meth)

I get: (pry):14: [BUG] Segmentation fault at 0x00000101f4a1a8

@ik5
Copy link
Author

ik5 commented Nov 17, 2014

ctx = ssl_ctx.call(meth)

@bararchy
Copy link

require 'fiddle'
require 'socket'


libssl = Fiddle.dlopen('/usr/lib/libssl.so')
ssl_init = Fiddle::Function.new(libssl['SSL_library_init'],[],Fiddle::TYPE_INT)
ssl_load_error = Fiddle::Function.new(libssl['SSL_load_error_strings'],[],Fiddle::TYPE_INT)
ssl_client_method = Fiddle::Function.new(libssl['SSLv3_client_method'],[],Fiddle::TYPE_LONG)
ssl_ctx = Fiddle::Function.new(libssl['SSL_CTX_new'],[Fiddle::TYPE_LONG],Fiddle::TYPE_LONG)
ssl_new = Fiddle::Function.new(libssl['SSL_new'],[Fiddle::TYPE_LONG],Fiddle::TYPE_LONG)
ssl_set_fd = Fiddle::Function.new(libssl['SSL_set_fd'],[Fiddle::TYPE_LONG, Fiddle::TYPE_INT],Fiddle::TYPE_LONG)
ssl_connect = Fiddle::Function.new(libssl['SSL_connect'],[Fiddle::TYPE_LONG],Fiddle::TYPE_LONG)
# Start Calls

ssl_init.call
ssl_load_error.call
meth = ssl_client_method.call
ctx = ssl_ctx.call(meth)
ssl = ssl_new.call(ctx)
sock = TCPSocket.new("192.168.0.4", 443)
ssl_set_fd.call(ssl, sock.to_i)
puts ssl_connect.call(ssl)

Ok, so now we have a ruby to C to ruby to SSL wrapper XD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment