Skip to content

Instantly share code, notes, and snippets.

@trietptm
Forked from Eterna1/moj_piekny_kodzik.py
Created July 20, 2018 08:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trietptm/52ed32d4b491a855e2b90f7326a98227 to your computer and use it in GitHub Desktop.
Save trietptm/52ed32d4b491a855e2b90f7326a98227 to your computer and use it in GitHub Desktop.
from unicorn import *
from unicorn.x86_const import *
import struct
def read(name):
with open(name) as f:
return f.read()
def u32(data): #zamien ciag 4 bajtow na liczbe w formacie little-endian
return struct.unpack("I", data)[0]
def p32(num): #zamien liczbe w formacie little-endian na ciag 4 bajtow
return struct.pack("I", num)
BASE = 0x0000000000400000
STACK_ADDR = 0x0
STACK_SIZE = 1024*1024
mu = Uc (UC_ARCH_X86, UC_MODE_64)
mu.mem_map(BASE, 1024*1024)
mu.mem_map(STACK_ADDR, STACK_SIZE)
mu.mem_write(BASE, read("./fibonacci"))
mu.reg_write(UC_X86_REG_RSP, STACK_ADDR + STACK_SIZE - 1)
skip = [0x00000000004004EF, 0x00000000004004F6, 0x0000000000400502, 0x000000000040054F]
FIBONACCI_ENTRY = 0x0000000000400670
FIBONACCI_END = [0x00000000004006F1, 0x0000000000400709]
stack = []
d = {}
def hook_code(uc, address, size, user_data):
#print('>>> Tracing instruction at 0x%x, instruction size = 0x%x' %(address, size))
if address in skip:
mu.reg_write(UC_X86_REG_RIP, address+size)
elif address == 0x400560:
c = mu.reg_read(UC_X86_REG_RDI)
print(chr(c))
mu.reg_write(UC_X86_REG_RIP, address+size)
elif address == FIBONACCI_ENTRY:
arg0 = mu.reg_read(UC_X86_REG_RDI)
r_rsi = mu.reg_read(UC_X86_REG_RSI)
arg1 = u32(mu.mem_read(r_rsi, 4))
elif address in FIBONACCI_END:
pass
mu.hook_add(UC_HOOK_CODE, hook_code)
mu.emu_start(0x00000000004004E0, 0x0000000000400575)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment