Python 문자열로 표현된 C structs와 Python Value 간의 변환

파일에 Binary Data를 저장하거나 Network Connection 시 사용

struct.pack(fmt, v1, v2,...)

- 지정된 Format에 따라 v1, v2의 value를 Pack을 수행하며 그 결과는 String으로 리턴

struct.unpack(fmt, string)

- 지정된 Format에 따라 String을 Unpack을 수행하며 그 결과는 Tuple로 리턴

CharacterByte orderSizeAlignment

@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none

 

FormatC TypePython typeStandard sizeNotes

x pad byte no value    
c char string of length 1 1  
b signed char integer 1 (3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
f float float 4 (4)
d double float 8 (4)
s char[] string    
p char[] string    
P void * integer   (5), (3)

 

ex) struct.pack('<B',i)

'Python' 카테고리의 다른 글

[pwntools]pwnlib.util  (0) 2019.11.19
hex encoding to chr()  (0) 2019.05.17
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
Python z3 모듈  (0) 2018.12.02

pwntools 모듈 정리

pwnlib.util

bits

pwnlib.util.fiddling.bits(s, endian = 'big', zero = 0, one = 1) → list

>>> bits(100)
'[0, 1, 1, 0, 0, 1, 0, 0]'
>>> sum(bits(100)
3
>>> bits('ABC')
[0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1]
>>> ''.join(bits(511,zero='_',one='-'))
'________---------'
>>> ''.join(bits(511,endian='little',zero='_',one='-')
'---------_______' 

unbits

pwnlib.util.fiddling.unbits(s, endian = 'big') → str

>>> unbits('0100000101000001')
'AA'

bits_str

pwnlib.util.fiddling.bits_str(s, endian = 'big', zero = '0', one = '1') → str

bits()는 list로 반환하는 반면에 bits_str()은 비트 값을 str로 반환한다.

>>> bits_str('flag')
'01100110011011000110000101100111'

bitswap

pwnlib.util.fiddling.bitswap(s) → str

1바이트씩 bit값을 뒤집는다고 보면 된다.

ex) 01101101 -> 10110110

>>> bitswap('ab')
'\x86F'

enhex

pwnlib.util.fiddling.enhex(x) → str

>>> enhex('abcd')
'61626364'
>>> 'abcd'.encode('hex')
'61626364'

unhex

pwnlib.util.fiddling.unhex(s) → str

>>> unhex('666c6167')
'flag'
>>> '666c6167'.decode('hex')
'flag'

hexdump

pwnlib.util.fiddling.hexdump(s, width=16, skip=True, hexii=False, begin=0, style=None, highlight=None, cyclic=False)

>>> hexdump(list(map(chr, range(256))),width=16,begin=0x12345678)
12345678  00 01 02 03  04 05 06 07  08 09 0a 0b  0c 0d 0e 0f  │····│····│····│····│
12345688  10 11 12 13  14 15 16 17  18 19 1a 1b  1c 1d 1e 1f  │····│····│····│····│
12345698  20 21 22 23  24 25 26 27  28 29 2a 2b  2c 2d 2e 2f  │ !"#│$%&'│()*+│,-./│
123456a8  30 31 32 33  34 35 36 37  38 39 3a 3b  3c 3d 3e 3f  │0123│4567│89:;│<=>?│
123456b8  40 41 42 43  44 45 46 47  48 49 4a 4b  4c 4d 4e 4f  │@ABC│DEFG│HIJK│LMNO│
123456c8  50 51 52 53  54 55 56 57  58 59 5a 5b  5c 5d 5e 5f  │PQRS│TUVW│XYZ[│\]^_│
123456d8  60 61 62 63  64 65 66 67  68 69 6a 6b  6c 6d 6e 6f  │`abc│defg│hijk│lmno│
123456e8  70 71 72 73  74 75 76 77  78 79 7a 7b  7c 7d 7e 7f  │pqrs│tuvw│xyz{│|}~·│
123456f8  80 81 82 83  84 85 86 87  88 89 8a 8b  8c 8d 8e 8f  │····│····│····│····│
12345708  90 91 92 93  94 95 96 97  98 99 9a 9b  9c 9d 9e 9f  │····│····│····│····│
12345718  a0 a1 a2 a3  a4 a5 a6 a7  a8 a9 aa ab  ac ad ae af  │····│····│····│····│
12345728  b0 b1 b2 b3  b4 b5 b6 b7  b8 b9 ba bb  bc bd be bf  │····│····│····│····│
12345738  c0 c1 c2 c3  c4 c5 c6 c7  c8 c9 ca cb  cc cd ce cf  │····│····│····│····│
12345748  d0 d1 d2 d3  d4 d5 d6 d7  d8 d9 da db  dc dd de df  │····│····│····│····│
12345758  e0 e1 e2 e3  e4 e5 e6 e7  e8 e9 ea eb  ec ed ee ef  │····│····│····│····│
12345768  f0 f1 f2 f3  f4 f5 f6 f7  f8 f9 fa fb  fc fd fe ff  │····│····│····│····│

b64e

pwnlib.util.fiddling.b64e(s) → str

>>> b64e('test')
'dGVzdA=='

b64d

pwnlib.util.fiddling.b64d(s) → str

>>> b64d('dGVzdA==')
'test'

urlencode

pwnlib.util.fiddling.urlencode(s) → str

>>> urlencode('/bin/sh')
'%2f%62%69%6e%2f%73%68'

urldecode

pwnlib.util.fiddling.urldecode(s, ignore_invalid = False) → str

>>> urldecode('%2f%62%69%6e%2f%73%68')
'/bin/sh'

xor

pwnlib.util.fiddling.xor(*args, cut = 'max') → str

xor_key

pwnlib.util.fiddling.xor_key(data, size=None, avoid='x00n') -> None or (int, str)

xor_pair

pwnlib.util.fiddling.xor_pair(data, avoid = 'x00n') -> None or (str, str)

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
hex encoding to chr()  (0) 2019.05.17
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
Python z3 모듈  (0) 2018.12.02
a='656e636f64696e67206973206e6f7420656e6372797074696f6e2074686520666c61673d73696d706c65'
table=['0x'+a[i:i+2] for i in range(0,len(a),2)]
print table
table1=[]
for i in range(len(table)):
        table1.append(chr(int(table[i],16)))
flag=""
for i in range(len(table1)):
        flag+=table1[i]
print flag

예를 들어, 바이너리 파일을 읽어 Hex로 출력하는 루틴은 간단히,

 

with open(f) as ifp:

buff = ifp.read()

hlist = []

for ch in buff:

hlist.append('%02x' % ord(ch))

print 'hex out = <%s>' % ' '.join(hlist)

 

와 같이 적용할 수 있습니다.

 

그런데 그 반대가 있을 수 있습니다.

 

어떤 문자열이 있는데, Hex 문자열로 되어 있다고 가정하고, (거의 모든 인증서 데이터 등에 사용됩니다)

이것을 매 2바이트씩 끊어 목록으로 만들고 싶습니다.

 

여러 가지 방법이 존재하는데,

다음과 같은 세 가지로 구분되더군요...

 

hxstr = '123456'

 

1) [ for ... ]

 

hlist = [hxstr[i:i+2] for i in range(0,len(hxstr),2)]

 

2) re.findall

 

hlist = re.findall(r'..',hxstr)

 

3) map, zip, iter 이용

 

hlist = map(''.join, zip(*[iter(hxstr)]*2))

 

잠깐 설명해 보도록 하겠습니다.

 

iter(hxstr) 는 글자 하나씩 가져오는 이터레이터 함수라 생각하십시오.

 

[ 'a' ] * 2 는 [ 'a', 'a'] 이고,

함수 호출 시 f(['a','a'])는 목록이 넘어가지만,

f(*['a','a'])는 f('a','a') 와 동일합니다. 즉, 괄호를 벗기는 역할을 합니다.

 

그러면 결국 zip(iter(hxstr)결과, iter(hxstr)결과) 와 같은 식인데,

첫번째 패러미터와 두번째 패러미터의 값을 한번씩 호출하게 되어있습니다.

그런데 동일한 이터레이터 이므로 하나씩 꺼내게 되므로,

(('1','2'), ('3','4'),('5','6')) 의 결과가 나옵니다.

이를 각 항목에 대하여 ''.join <=> cat 을 시키니

['12','34','56'] 이 되는 것이지요~

 

정도 입니다.

(물론 함수로 줄줄이 길게 하는거 제외하구요)

 

어느게 제일 빠를지는 아주 큰 문자열로 돌려봐야 되겠지요...

(전 1을 애용하려고 합니다. 3은 이해하는데 15분 걸렸습니다... T.T)

 

 

이제는 거꾸로 파일로 출력하면...

 

with open(b,'w') as ofp:

for hstr in hlist:

ofp.write(chr(int(hstr,16)))

 

와 같이 하면 됩니다.

 

 

어느분께는 도움이 되셨기를...

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
[pwntools]pwnlib.util  (0) 2019.11.19
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18
Python z3 모듈  (0) 2018.12.02

list_a = ['1', '2', '3', '4']   -> list_a = [1, 2, 3, 4] 로 바꾸고 싶을 때,

 

list_a = map(int, list_a)   를 해주면 된다.

 

or list_a = [int(i) for i in list_a]

 

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
[pwntools]pwnlib.util  (0) 2019.11.19
hex encoding to chr()  (0) 2019.05.17
Python z3 모듈  (0) 2018.12.02

Python z3 Module

더 추가할 예정!

z3에 대해 공부할겸 올려봅니다.. ㅎ 틀린부분이나 팁?그런거 있으면 알려주세요

모듈 링크 : https://github.com/Z3Prover/z3

유용한 외국 문서 : https://ericpony.github.io/z3py-tutorial/guide-examples.htm

일반적으로 그냥 근의 공식을 사용해서 프로그래밍을 해서 방정식의 근을 구하는 것은 imperative programming 방식이다.

파이썬의 z3 SMT solver 모듈을 사용해서 방정식의 근을 구하는 것은 decalarative programming이다.

나는 SMT solver 모듈을 사용하는 법에 대해 간단하게 공부하면서 포스팅하겠돠..

SMT solver?

Satisfiability Modulo Theories의 약자이다.

수식을 만족하는 값이 존재하는지 찾아준다. 수식을 만족하는 값이 존재할 경우 그 값을 구해준다.

True or False + 방정식, 부등식 해 구하기

Function

from z3 import *

z3 모듈 사용하기 위해 임포트

x = Int('x')
y = Int('y')

Int()는 미지수(정수)를 선언

x = Real('x')
y = Real('y')

Real()은 미지수(실수)를 선언

x = BitVec('x',8)
y = BitVec('y',8)

BitVec() 미지수(비트 벡터)를 선언

비트 연산을 할 때 사용되는데 BitVec('미지수',n)으로 n비트 미지수를 선언 해준다.

set_option(precision=3)

Real()을 사용했을 때 3자리 까지만 출력하고 싶다면 set_option 함수 사용

s = Solver()

Solver 객체 생성하는 함수

https://z3prover.github.io/api/html/classz3py_1_1_solver.html

위에 Solver()에 대해 많은 예제와 함수들이 있습니다.

s.add()

s.append() 

s.assert_exprs()

s.Insert()

수식을 추가하는 함수

s.assertions()

추가된 수식을 반환하는 함수

s.push()

s.pop()

수식을 넣고 빼는 함수

s.check()

값이 존재하면 sat 값이 존재하지 않으면 unsat을 반환

s.model()

값이 존재할 경우 값을 구해주는 함수

unsat , unknown이면 에러를 반환

s.reason_unknown()

check() 함수의 반환 값이 unknown인 이유를 알려줌

s.reset()

추가한 수식을 초기화 시키는 함수

Example

from z3 import *
x = Int('x')
s = Solver()
s.insert(x*x-4*x+3==0)
print s.check()
print s.model()

x^2 - 4x +3 =0을 풀어주는 예시다.

'Python' 카테고리의 다른 글

python struct module  (0) 2019.11.21
[pwntools]pwnlib.util  (0) 2019.11.19
hex encoding to chr()  (0) 2019.05.17
파이썬 리스트의 문자열을 int 형태로 변환  (2) 2019.02.18

+ Recent posts