views:

389

answers:

3

Hi all,

I am new to python and programming,

I am looking for a code, or a sample code that can have a predefined set of hex values and that can find the 3 used values within to generate a certain value.

lets say I have a value of : 0x50158A51

this is a 4 byte (32 bit) hex value

now i need to find the values which when added or subtracted (from the provided set) will end with this result.

for example:

0x75612171 + 0x75612171 + 0x6553476F = 0x50158A51

  • notice that the values added are all from the allowed set

Just to be clear i have a limited chars set

which is :

\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13
\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26
\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39
\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c
\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f
\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72
\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85
\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98
\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab
\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe
\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1 
\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4 
\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7 
\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

i used a simple code to calculate 3 values:

#!/usr/bin/python

hex1 = 0x55555521
hex2 = 0x55555421
hex3 = 0x6D556F49

calc = hex1 + hex2 + hex3
print hex(calc)

which will give a result of:

root@linux:~# ./calc2.py
0x150158a51

i need to some how reverse the process of the answer by placing variations from my allowed set into the variables

for example:

placing 4 byte hex values from the set into the variables

 try: 

hex1 = placing 4bytes from allowed set
hex2 = placing 4bytes from allowed set
hex3 = placing 4bytes from allowed set

if result (hex1+hex2+hex3)  = 0x150158a51
then
print "values used for this results are: hex1 hex2 hex3"

Thank you in advance.

+1  A: 

What you're asking for isn't possible. There will be infinite sequences of numbers that when added together will continue to produce the same result, modulo 2^32.

As a trivial example, say that your target number is 0x10000000 and the only hex values you allow are zero and one. Then the following sequences of numbers will result in 0x10000000:

0x1 + 0x1 + ... + 0x1 (0x10000000 times)  = 0x10000000 
0x1 + 0x1 + ... + 0x1 (0x110000000 times) = 0x10000000
0x1 + 0x1 + ... + 0x1 (0x210000000 times) = 0x10000000

and so on. Since you can continue adding 0x1's indefinitely, the algorithm can never terminate.

John Feminella
Thanks for you quick reply,What i need to do using a python script is to find which combination will result this value : 0x50158A51 i probably don't need all combinators just one from my char setdo you have another idea how can i achieve this ?
Shai
All combinations John provided are from your charset. Which one is not?
Antony Hatchkins
These are bad values (chars): \x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', '\x8a', '\x8b', '\x8c', '\x8d', '\x8e', '\x8f', '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97', '\x98', '\x99', '\x9a', '\x9b', '\x9c', '\x9d', '\x9e', '\x9f', '\xa0', '\xa1', '\xa2', '\xa3', '\xa4', '\xa5', '\xa6',
Shai
\xa7', '\xa8', '\xa9', '\xaa', '\xab', '\xac', '\xad', '\xae', '\xaf', '\xb0', '\xb1', '\xb2', '\xb3', '\xb4', '\xb5', '\xb6', '\xb7', '\xb8', '\xb9', '\xba', '\xbb', '\xbc', '\xbd', '\xbe', '\xbf', '\xc0', '\xc1', '\xc2', '\xc3', '\xc4', '\xc5', '\xc6', '\xc7', '\xc8', '\xc9', '\xca', '\xcb', '\xcc', '\xcd', '\xce', '\xcf', '\xd0', '\xd1', '\xd2', '\xd3', '\xd4', '\xd5', '\xd6', '\xd7', '\xd8', '\xd9', '\xda', '\xdb', '\xdc', '\xdd', '\xde', '\xdf', '\xe0', '\xe1',
Shai
'\xe2', '\xe3', '\xe4', '\xe5', '\xe6', '\xe7', '\xe8', '\xe9', '\xea', '\xeb', '\xec', '\xed', '\xee', '\xef', '\xf0', '\xf1', '\xf2', '\xf3', '\xf4', '\xf5', '\xf6', '\xf7', '\xf8', '\xf9', '\xfa', '\xfb'
Shai
Half an hour ago you mentioned them as allowed. Has something happen since then?
Antony Hatchkins
I have an allowed set and non allowed seti need to find the correct value within my allowed setwhat iv'e included in the comment is the non allowed and whats in the question is the allowed set
Shai
lets try to simplify it :lets say i have two values104FE8EA104FFFB4i need to use subtraction (in three steps) in order to get from my first value to the second one i can use only hex values which are in my allowed set what will be the best way to archive this ?
Shai
+1  A: 

The following program for 0x50158A51 generates:

0x50157f51 + 0x00000b00 + 0x00000000 = 0x50158A51

for 0x1090F0FF it generates:

0x107f7f7f + 0x000011717f + 0x00000001 = 0x1090f0ff

where all "characters" in summands are from allowed set and not from disallowed set.

The program:

a=0x1090F0FF

a0=0
a1=0
a2=0
for n in range(3,-1,-1):
    a0<<=8;
    a1<<=8;
    a2<<=8;
    mask = 0xff<<(n*8)
    b=(a&mask)>>(n*8)
    if b > 2*0x7f:
        a0 += 0x7f
        a1 += 0x7f
        a2 += b - 2*0x7f
    elif b > 0x7f:
        a0 += 0x7f
        a1 += b - 0x7f
    else:
        a0 += b

print '%08x + %08x + %08x = %08x' % (a0, a1, a2, a0+a1+a2)
Antony Hatchkins
A: 

From what I understood, but I may be wrong, you are talking about variation of a Subset Sum Problem, which is NP-Complete. So you may look for some more info about that.

stmi