Changing the EAX register with Python

Stefan Sonnenberg-Carstens stefan.sonnenberg at pythonmeister.com
Thu Nov 18 17:24:10 EST 2010


Am 18.11.2010 21:20, schrieb dutche:
> Hi folks, I have a unusual question here.
>
> How can I change the value of EAX register under python under Linux??
> As paimei does under Windows.
>
> My project is to have a python program that loads a C program and sets
> a breakpoint at some address, and then with this breakpoint I change
> the EAX register and then continue the program execution.
>
> With Windows and paimei I did that, but under Linux I don't know yet.
>
> Any ideas?
>
> Thank you
You asked for it:

from ctypes import *
import time
import os
cdll.LoadLibrary('libc.so.6')
libc = CDLL('libc.so.6')

PTRACE_TRACEME = 0
PTRACE_GETREGS = 12
PTRACE_SETREGS = 13
PTRACE_SYSCALL = 24

SYS_WRITE =  4
SYS_IOCTL = 54

class user_regs_struct(Structure):
     _fields_ = [
         ('ebx',c_ulong),
         ('ecx',c_ulong),
         ('edx',c_ulong),
         ('esi',c_ulong),
         ('edi',c_ulong),
         ('ebp',c_ulong),
         ('eax',c_ulong),
         ('xds',c_ulong),
         ('xes',c_ulong),
         ('xfs',c_ulong),
         ('xgs',c_ulong),
         ('orig_eax',c_ulong),
         ('eip',c_ulong),
         ('xcs',c_ulong),
         ('eflags',c_ulong),
         ('esp',c_ulong),
         ('xss',c_ulong),
         ]

child = os.fork()
if child == 0:
     libc.ptrace(PTRACE_TRACEME,0,None,None)
     os.execl('/bin/ls','ls')
else:
     while True:
         pid,status = os.wait()
         if status != 0:
             reg = pointer(user_regs_struct())
             libc.ptrace(PTRACE_GETREGS,pid,None,reg)
             if reg.contents.orig_eax == SYS_IOCTL:
                 print 'IOCTL ebx,ecx = 0x%0x,0x%0x' % 
(reg.contents.ebx,reg.contents.ecx)
                 # replace IOCTL with SYS_WRITE
                 reg.contents.orig_eax = SYS_WRITE
                 libc.ptrace(PTRACE_SETREGS,pid,None,reg)
             libc.ptrace(PTRACE_SYSCALL,pid,None,None)
         else:
             os._exit(0)


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: debug.py
URL: <http://mail.python.org/pipermail/python-list/attachments/20101118/d1ee6501/attachment-0001.ksh>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: stefan_sonnenberg.vcf
Type: text/x-vcard
Size: 223 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20101118/d1ee6501/attachment-0001.vcf>


More information about the Python-list mailing list