Skip to content

Commit e3a021d

Browse files
tesujipeace-maker
andauthored
packing: Do use extra arguments in p* and u* (#2526)
* packing: Do use extra arguments in `p*` and `u*` * packing: Force keyword syntax for `sign` argument --------- Co-authored-by: peace-maker <[email protected]>
1 parent a9b05b5 commit e3a021d

File tree

2 files changed

+44
-21
lines changed

2 files changed

+44
-21
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,12 @@ The table below shows which release corresponds to each branch, and what date th
7777
- [#2507][2507] Add `+LINUX` and `+WINDOWS` doctest options and start proper testing on Windows
7878
- [#2522][2522] Support starting a kitty debugging window with the 'kitten' command
7979
- [#2524][2524] Raise EOFError during `process.recv` when stdout closes on Windows
80+
- [#2526][2526] Properly make use of extra arguments in `packing` utilities. `sign` parameter requires keyword syntax to specify it.
8081

8182
[2507]: https://github.com/Gallopsled/pwntools/pull/2507
8283
[2522]: https://github.com/Gallopsled/pwntools/pull/2522
8384
[2524]: https://github.com/Gallopsled/pwntools/pull/2524
85+
[2526]: https://github.com/Gallopsled/pwntools/pull/2526
8486

8587
## 4.15.0 (`beta`)
8688
- [#2508][2508] Ignore a warning when compiling with asm on nix

pwnlib/util/packing.py

+42-21
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ def routine(data, stacklevel=None):
332332
#
333333
# Make normal user-oriented packers, e.g. p8
334334
#
335-
def _do_packing(op, size, number):
335+
def _do_packing(op, size, number, endianness=None):
336336

337337
name = "%s%s" % (op,size)
338338
mod = sys.modules[__name__]
@@ -342,15 +342,15 @@ def _do_packing(op, size, number):
342342
bs = getattr(mod, "_%sbs" % (name))
343343
bu = getattr(mod, "_%sbu" % (name))
344344

345-
endian = context.endian
345+
endian = endianness or context.endian
346346
signed = context.signed
347347
return {("little", True ): ls,
348348
("little", False): lu,
349349
("big", True ): bs,
350350
("big", False): bu}[endian, signed](number, 3)
351351

352352
@LocalNoarchContext
353-
def p8(number, endianness = None, sign = None, **kwargs):
353+
def p8(number, endianness = None, **kwargs):
354354
"""p8(number, endianness, sign, ...) -> bytes
355355
356356
Packs an 8-bit integer
@@ -365,10 +365,10 @@ def p8(number, endianness = None, sign = None, **kwargs):
365365
Returns:
366366
The packed number as a byte string
367367
"""
368-
return _do_packing('p', 8, number)
368+
return _do_packing('p', 8, number, endianness)
369369

370370
@LocalNoarchContext
371-
def p16(number, endianness = None, sign = None, **kwargs):
371+
def p16(number, endianness = None, **kwargs):
372372
"""p16(number, endianness, sign, ...) -> bytes
373373
374374
Packs an 16-bit integer
@@ -382,11 +382,18 @@ def p16(number, endianness = None, sign = None, **kwargs):
382382
383383
Returns:
384384
The packed number as a byte string
385+
386+
Examples:
387+
388+
>>> p16(0x4142, 'big')
389+
b'AB'
390+
>>> p16(0x4142, endianness='big')
391+
b'AB'
385392
"""
386-
return _do_packing('p', 16, number)
393+
return _do_packing('p', 16, number, endianness)
387394

388395
@LocalNoarchContext
389-
def p32(number, endianness = None, sign = None, **kwargs):
396+
def p32(number, endianness = None, **kwargs):
390397
"""p32(number, endianness, sign, ...) -> bytes
391398
392399
Packs an 32-bit integer
@@ -400,11 +407,18 @@ def p32(number, endianness = None, sign = None, **kwargs):
400407
401408
Returns:
402409
The packed number as a byte string
410+
411+
Examples:
412+
413+
>>> p32(0x41424344, 'big')
414+
b'ABCD'
415+
>>> p32(0x41424344, endianness='big')
416+
b'ABCD'
403417
"""
404-
return _do_packing('p', 32, number)
418+
return _do_packing('p', 32, number, endianness)
405419

406420
@LocalNoarchContext
407-
def p64(number, endianness = None, sign = None, **kwargs):
421+
def p64(number, endianness = None, **kwargs):
408422
"""p64(number, endianness, sign, ...) -> bytes
409423
410424
Packs an 64-bit integer
@@ -418,11 +432,18 @@ def p64(number, endianness = None, sign = None, **kwargs):
418432
419433
Returns:
420434
The packed number as a byte string
435+
436+
Examples:
437+
438+
>>> p64(0x4142434445464748, 'big')
439+
b'ABCDEFGH'
440+
>>> p64(0x4142434445464748, endianness='big')
441+
b'ABCDEFGH'
421442
"""
422-
return _do_packing('p', 64, number)
443+
return _do_packing('p', 64, number, endianness)
423444

424445
@LocalNoarchContext
425-
def u8(data, endianness = None, sign = None, **kwargs):
446+
def u8(data, endianness = None, **kwargs):
426447
"""u8(data, endianness, sign, ...) -> int
427448
428449
Unpacks an 8-bit integer
@@ -437,10 +458,10 @@ def u8(data, endianness = None, sign = None, **kwargs):
437458
Returns:
438459
The unpacked number
439460
"""
440-
return _do_packing('u', 8, data)
461+
return _do_packing('u', 8, data, endianness)
441462

442463
@LocalNoarchContext
443-
def u16(data, endianness = None, sign = None, **kwargs):
464+
def u16(data, endianness = None, **kwargs):
444465
"""u16(data, endianness, sign, ...) -> int
445466
446467
Unpacks an 16-bit integer
@@ -455,10 +476,10 @@ def u16(data, endianness = None, sign = None, **kwargs):
455476
Returns:
456477
The unpacked number
457478
"""
458-
return _do_packing('u', 16, data)
479+
return _do_packing('u', 16, data, endianness)
459480

460481
@LocalNoarchContext
461-
def u32(data, endianness = None, sign = None, **kwargs):
482+
def u32(data, endianness = None, **kwargs):
462483
"""u32(data, endianness, sign, ...) -> int
463484
464485
Unpacks an 32-bit integer
@@ -473,10 +494,10 @@ def u32(data, endianness = None, sign = None, **kwargs):
473494
Returns:
474495
The unpacked number
475496
"""
476-
return _do_packing('u', 32, data)
497+
return _do_packing('u', 32, data, endianness)
477498

478499
@LocalNoarchContext
479-
def u64(data, endianness = None, sign = None, **kwargs):
500+
def u64(data, endianness = None, **kwargs):
480501
"""u64(data, endianness, sign, ...) -> int
481502
482503
Unpacks an 64-bit integer
@@ -491,7 +512,7 @@ def u64(data, endianness = None, sign = None, **kwargs):
491512
Returns:
492513
The unpacked number
493514
"""
494-
return _do_packing('u', 64, data)
515+
return _do_packing('u', 64, data, endianness)
495516

496517
def make_packer(word_size = None, sign = None, **kwargs):
497518
"""make_packer(word_size = None, endianness = None, sign = None) -> number → str
@@ -775,7 +796,7 @@ def flat(*args, **kwargs):
775796
Examples:
776797
777798
(Test setup, please ignore)
778-
799+
779800
>>> context.clear()
780801
781802
Basic usage of :meth:`flat` works similar to the pack() routines.
@@ -822,7 +843,7 @@ def flat(*args, **kwargs):
822843
823844
Dictionary usage permits directly using values derived from :func:`.cyclic`.
824845
See :func:`.cyclic`, :function:`pwnlib.context.context.cyclic_alphabet`, and :data:`.context.cyclic_size`
825-
for more options.
846+
for more options.
826847
827848
The cyclic pattern can be provided as either the text or hexadecimal offset.
828849
@@ -873,7 +894,7 @@ def flat(*args, **kwargs):
873894
874895
Negative indices are also supported, though this only works for integer
875896
keys.
876-
897+
877898
>>> flat({-4: b'x', -1: b'A', 0: b'0', 4: b'y'})
878899
b'xaaA0aaay'
879900
"""

0 commit comments

Comments
 (0)