From 1ede3ac608599922d4f976a62216b331bd899593 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Tue, 12 Sep 2023 10:30:40 +0200 Subject: [PATCH 01/16] Add a `flatten` argument to `ssh.libs` This option makes us able to avoid getting the file tree of the remote server and just downloads the desired files in the output folder --- pwnlib/tubes/ssh.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 33978cec3..12c2c5734 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1756,14 +1756,19 @@ def unlink(self, file): return self.sftp.unlink(file) - def libs(self, remote, directory = None): + def libs(self, remote, directory = None, flatten = False): """Downloads the libraries referred to by a file. This is done by running ldd on the remote server, parsing the output and downloading the relevant files. The directory argument specified where to download the files. This defaults - to './$HOSTNAME' where $HOSTNAME is the hostname of the remote server.""" + to './$HOSTNAME' where $HOSTNAME is the hostname of the remote server. + + Arguments: + directory(str): Output directory + flatten(bool): Flatten the file tree if True (defaults to False) + """ libs = self._libs_remote(remote) @@ -1780,7 +1785,8 @@ def libs(self, remote, directory = None): seen = set() for lib, addr in libs.items(): - local = os.path.realpath(os.path.join(directory, '.' + os.path.sep + lib)) + local = os.path.realpath(os.path.join(directory, '.' + os.path.sep \ + + (os.path.basename(lib) if flatten else lib))) if not local.startswith(directory): self.warning('This seems fishy: %r' % lib) continue From 034e56273a1c99ad9850e05fb0fed1de21280a5c Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Tue, 12 Sep 2023 11:18:02 +0200 Subject: [PATCH 02/16] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 195cbee6c..ff2f110c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,12 +72,14 @@ The table below shows which release corresponds to each branch, and what date th - [#2221][2221] Add shellcraft.sleep template wrapping SYS_nanosleep - [#2219][2219] Fix passing arguments on the stack in shellcraft syscall template - [#2212][2212] Add `--libc libc.so` argument to `pwn template` command +- [#2268][2268] Add a `flatten` argument to `ssh.libs` [2202]: https://github.com/Gallopsled/pwntools/pull/2202 [2117]: https://github.com/Gallopsled/pwntools/pull/2117 [2221]: https://github.com/Gallopsled/pwntools/pull/2221 [2219]: https://github.com/Gallopsled/pwntools/pull/2219 [2212]: https://github.com/Gallopsled/pwntools/pull/2212 +[2268]: https://github.com/Gallopsled/pwntools/pull/2268 ## 4.11.0 (`beta`) From 7f24627afd630a7aa3b046e2018ede9011c2e8e0 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Tue, 12 Sep 2023 18:41:14 +0200 Subject: [PATCH 03/16] Add a warning in ssh.libs for duplicate filenames --- pwnlib/tubes/ssh.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 12c2c5734..03a4f8828 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1775,6 +1775,20 @@ def libs(self, remote, directory = None, flatten = False): remote = packing._decode(self.readlink('-f',remote).strip()) libs[remote] = 0 + if flatten: + basenames = dict() + + # If there is a duplicate switch to unflattened download + for lib in libs: + name = os.path.basename(lib) + + if name in basenames: + self.warning('Duplicate lib name, switching to unflattened file tree: %r' % name) + flatten = False + break + + basenames[lib] = name + if directory is None: directory = self.host @@ -1786,7 +1800,7 @@ def libs(self, remote, directory = None, flatten = False): for lib, addr in libs.items(): local = os.path.realpath(os.path.join(directory, '.' + os.path.sep \ - + (os.path.basename(lib) if flatten else lib))) + + (basenames[lib] if flatten else lib))) if not local.startswith(directory): self.warning('This seems fishy: %r' % lib) continue From ebb50918d411198db2a2927c8963bdf8915c311b Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Thu, 14 Sep 2023 08:15:37 +0200 Subject: [PATCH 04/16] Add documentation in ssh.libs for duplicate filenames fallback --- pwnlib/tubes/ssh.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 03a4f8828..4ccaffc4d 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1767,7 +1767,8 @@ def libs(self, remote, directory = None, flatten = False): Arguments: directory(str): Output directory - flatten(bool): Flatten the file tree if True (defaults to False) + flatten(bool): Flatten the file tree if True (defaults to False). If + there are duplicate filenames, fallback to unflattened structure. """ libs = self._libs_remote(remote) From 07448e0084df83a443a7706089832238a1fd873f Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 11 Oct 2023 20:53:10 +0200 Subject: [PATCH 05/16] [ssh.libs] Fix flatten's duplicate check Fix this: https://github.com/Gallopsled/pwntools/pull/2268#discussion_r1325404026 --- pwnlib/tubes/ssh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 4ccaffc4d..3f76e23ee 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1783,7 +1783,7 @@ def libs(self, remote, directory = None, flatten = False): for lib in libs: name = os.path.basename(lib) - if name in basenames: + if name in basenames.values(): self.warning('Duplicate lib name, switching to unflattened file tree: %r' % name) flatten = False break From 4b944cd92faad40fcf513b9158d27a5d1432e634 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 11 Oct 2023 20:54:02 +0200 Subject: [PATCH 06/16] [ssh.libs] Add better warning for flatten's duplicates Fix this: https://github.com/Gallopsled/pwntools/pull/2268#discussion_r1325405234 --- pwnlib/tubes/ssh.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 3f76e23ee..a52994541 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1784,7 +1784,9 @@ def libs(self, remote, directory = None, flatten = False): name = os.path.basename(lib) if name in basenames.values(): - self.warning('Duplicate lib name, switching to unflattened file tree: %r' % name) + duplicate = [key for key, value in basenames.items() if + value == name][0] + self.warning('Duplicate lib name, switching to unflattened file tree: %r / %4r' % (lib, duplicate)) flatten = False break From 62d477d93cab2bee18e07a3b92f562fcc51c9966 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Mon, 23 Oct 2023 16:07:00 +0200 Subject: [PATCH 07/16] [ssh.libs] Add doctests This commit adds: - The `no_duplicate` binary that depends on - `a/lib.so` - `b/lib2.so` - The `duplicate` binary that depends on - `a/lib.so` - `b/lib.so` Then, the doctest tries to pull the libs from both binaries with different `flatten` values. --- pwnlib/data/elf/ssh_libs/a/lib.so | Bin 0 -> 8736 bytes pwnlib/data/elf/ssh_libs/b/lib.so | Bin 0 -> 8736 bytes pwnlib/data/elf/ssh_libs/b/lib2.so | Bin 0 -> 8736 bytes pwnlib/data/elf/ssh_libs/duplicate | Bin 0 -> 25600 bytes pwnlib/data/elf/ssh_libs/no_duplicate | Bin 0 -> 25600 bytes pwnlib/tubes/ssh.py | 10 ++++++++++ 6 files changed, 10 insertions(+) create mode 100755 pwnlib/data/elf/ssh_libs/a/lib.so create mode 100755 pwnlib/data/elf/ssh_libs/b/lib.so create mode 100755 pwnlib/data/elf/ssh_libs/b/lib2.so create mode 100755 pwnlib/data/elf/ssh_libs/duplicate create mode 100755 pwnlib/data/elf/ssh_libs/no_duplicate diff --git a/pwnlib/data/elf/ssh_libs/a/lib.so b/pwnlib/data/elf/ssh_libs/a/lib.so new file mode 100755 index 0000000000000000000000000000000000000000..2c5d44bd64b73af8e8d5dba18e847750e2ed9c18 GIT binary patch literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- literal 0 HcmV?d00001 diff --git a/pwnlib/data/elf/ssh_libs/b/lib.so b/pwnlib/data/elf/ssh_libs/b/lib.so new file mode 100755 index 0000000000000000000000000000000000000000..2c5d44bd64b73af8e8d5dba18e847750e2ed9c18 GIT binary patch literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- literal 0 HcmV?d00001 diff --git a/pwnlib/data/elf/ssh_libs/b/lib2.so b/pwnlib/data/elf/ssh_libs/b/lib2.so new file mode 100755 index 0000000000000000000000000000000000000000..2c5d44bd64b73af8e8d5dba18e847750e2ed9c18 GIT binary patch literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- literal 0 HcmV?d00001 diff --git a/pwnlib/data/elf/ssh_libs/duplicate b/pwnlib/data/elf/ssh_libs/duplicate new file mode 100755 index 0000000000000000000000000000000000000000..ab61ae5d95b009dde577d9ef7bdaa2b5d3025a6a GIT binary patch literal 25600 zcmeI5&1zFo5XUFAezgnZ7pMrm3qcoh(}EONa>Wl6REj%S;iicu(4-~zy2wf&p^uP9 z=p*zI`Uq~^xpARO}lChs0SdpuXG3C5hFVc|DYbk%YqAu>lcg9B{Se&(MgE-nkCKP`z5H0V?VPhd5BF+!t$hM6>a-`OHK2UAH|~XUMgMp06*& zsa$kjbiLww*%e~-s*P#IK5_NWz5CbU2R4j#^XJL*g2m6vLBHLrroRfn_vy$>)Tpap zk_@h(HxKb&4SuDF&mlbP(joDZHah*Sa+DU*eE90c{pU{~NVC~0ie^#f!%~`^c3$Qx zgSJT89u4w-Z#@`AIgC2$OWNr+Uk~$sN76Tgw`n&ox{~$=WoNi0Y0=ftGH{Q|0wh2JBtQZrKmsH{0wh2J$A*CZ+Pv4&ABIZ~!Dz7Uw-Qp0*sARm1y#@;{z?G4e# z0(}ZGzoEHbCzDO&qp!t|=U?{+As+eemJ4cF?+4_g@5P?yqtAt%(Ok%f-}+iuFG=JJ z`Z9XIM)b|lkT85(Oy!zd=Bx72Hv$*0BBO!l!)>|Nv%}6{1N|$|hjJXek+GS`$M#Ru zS3TQfgCudX8%55lS}yW&|4e;&wwl%0O`>_b@8p`)RI5;LGN>D#r0NgalO8B zKP@)WWeMlSoNdwi__OiEP1jwsHCHB9FpvaDfCNZ@1W14cNPq-LfCNb36cIrFj(k^! zd4Cp8nRo&Yi~RO~vP1Sf-g4ffB4=%lCQV)DRy8-?g_?pnd`EUcH2dV zEh&f_wST%V=m)U~EO`FyeSt4WLjoi~0wh2JBtQZrKmsH{0wi!u0(jTl_xID^e-1Wm z$!#B>#rmEXT8?UM*XL*BP_DS0b9>G0RktuPxs304&4)2`i2GO8Ux$w^7xU(CgV70# zpO$gI?XM!|^?i4CK$7TaUj33B^xyuC|9bE%MchN^*qZS>Y#m7#8|}@qmljfe^7i$k zS1%q*wOT8RYEkChQmT!5Ugl~#b&<5*>*Vd$TIdvIH`-oX(nhoTuA8?TlD_YJNSk@l zl(f|;8{JJwi>8K_c};t;y|#_nNPq-LfCNZ@1W14cNPq-LfCNb3#1PP5o40EE!*I#b zIWb%3MoEAKNPq-LfCNZ@1W14cNPq-LfCMHa5c2Tt1Fhlv2ly@m zzJCyB_v%4ld`CN0g93Wgspxy*2$VNO9ShVO#Q2tKe+&j2(4(%!w(D>DgAfnByXCTW zto8%+sC%*NdephFJ(>%8_^m#M)slo>vJfU}Lqpw+I2u3y4V|!chkDeFz`-GOi|4~_ zTC3S%d$5N36{thm58lYwy3k|!=jt0i+hc=C;$SBlxuDjx(Bu4>`tWS+4%;Um*p7%K!iX literal 0 HcmV?d00001 diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index a52994541..5024a9a44 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1769,6 +1769,16 @@ def libs(self, remote, directory = None, flatten = False): directory(str): Output directory flatten(bool): Flatten the file tree if True (defaults to False). If there are duplicate filenames, fallback to unflattened structure. + + Examples: + >>> s = ssh(host='example.pwnme') + >>> s.cwd = f'{pwnlib.data.elf.path}/ssh_libs' + >>> s.libs("duplicate", "out_duplicate") # doctest: +ELLIPSIS + {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} + >>> s.libs("duplicate", "out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS + {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} + >>> s.libs("no_duplicate", "out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS + {'.../out_noduplicate_flatten/lib.so': ..., '.../out_noduplicate_flatten/lib2.so': ..., '.../out_noduplicate_flatten/duplicate': ...} """ libs = self._libs_remote(remote) From 7bff92e5d04907f5e87f862732d35f903fad2d40 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Mon, 23 Oct 2023 16:13:49 +0200 Subject: [PATCH 08/16] [ssh.libs] Add `remote` arg to documentation --- pwnlib/tubes/ssh.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 5024a9a44..a9fbeb0ab 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1766,6 +1766,7 @@ def libs(self, remote, directory = None, flatten = False): to './$HOSTNAME' where $HOSTNAME is the hostname of the remote server. Arguments: + remote(str): Remote file path directory(str): Output directory flatten(bool): Flatten the file tree if True (defaults to False). If there are duplicate filenames, fallback to unflattened structure. From f39e415457280feb3cb43e420c40580936ac5e34 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Thu, 23 Nov 2023 22:58:39 +0100 Subject: [PATCH 09/16] [ssh.libs] Remove fallback to unflattened when flatten fails --- pwnlib/tubes/ssh.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index a9fbeb0ab..b95bd95da 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1776,10 +1776,12 @@ def libs(self, remote, directory = None, flatten = False): >>> s.cwd = f'{pwnlib.data.elf.path}/ssh_libs' >>> s.libs("duplicate", "out_duplicate") # doctest: +ELLIPSIS {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} - >>> s.libs("duplicate", "out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS - {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} >>> s.libs("no_duplicate", "out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS - {'.../out_noduplicate_flatten/lib.so': ..., '.../out_noduplicate_flatten/lib2.so': ..., '.../out_noduplicate_flatten/duplicate': ...} + {'.../out_noduplicate_flatten/lib.so': ..., '.../out_noduplicate_flatten/lib2.so': ..., '.../out_noduplicate_flatten/no_duplicate': ...} + >>> s.libs("duplicate", "out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS + Traceback (most recent call last): + ... + PwnlibException: Duplicate lib name: ... """ libs = self._libs_remote(remote) @@ -1797,9 +1799,7 @@ def libs(self, remote, directory = None, flatten = False): if name in basenames.values(): duplicate = [key for key, value in basenames.items() if value == name][0] - self.warning('Duplicate lib name, switching to unflattened file tree: %r / %4r' % (lib, duplicate)) - flatten = False - break + self.error('Duplicate lib name: %r / %4r' % (lib, duplicate)) basenames[lib] = name From 6ce8378ddc16d1e33ca9a811588ab7fe255e2c34 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 6 Dec 2023 13:24:24 +0100 Subject: [PATCH 10/16] [ssh.libs] Fix doctests --- pwnlib/data/elf/ssh_libs/__init__.py | 6 ++++++ pwnlib/data/elf/ssh_libs/duplicate | Bin 25600 -> 8856 bytes pwnlib/data/elf/ssh_libs/no_duplicate | Bin 25600 -> 8856 bytes pwnlib/tubes/ssh.py | 9 ++++----- 4 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 pwnlib/data/elf/ssh_libs/__init__.py diff --git a/pwnlib/data/elf/ssh_libs/__init__.py b/pwnlib/data/elf/ssh_libs/__init__.py new file mode 100644 index 000000000..9ab4d8753 --- /dev/null +++ b/pwnlib/data/elf/ssh_libs/__init__.py @@ -0,0 +1,6 @@ +import os +path = os.path.dirname(__file__) + +def get(x): + return os.path.join(path, x) + diff --git a/pwnlib/data/elf/ssh_libs/duplicate b/pwnlib/data/elf/ssh_libs/duplicate index ab61ae5d95b009dde577d9ef7bdaa2b5d3025a6a..836d5f3a8bdb2e96daa753b951e8afcefe04b77f 100755 GIT binary patch delta 328 zcmXwzu};G<5Qcpz5~&zSWF*s}iWjIDFxkjN!T=I)fLM?n0_l(lk}z~@CK%h^0$UMJ z(k*WQY;3#+rZy+tegED64>#@L-tA5+8hqGuXx@T)cphhsnQ^lN~gI8)F_OMmEE;mn7e3Jnj;!4GEjF83v*ru#ct)Kk)zd`dz AWB>pF literal 25600 zcmeI5&1zFo5XUFAezgnZ7pMrm3qcoh(}EONa>Wl6REj%S;iicu(4-~zy2wf&p^uP9 z=p*zI`Uq~^xpARO}lChs0SdpuXG3C5hFVc|DYbk%YqAu>lcg9B{Se&(MgE-nkCKP`z5H0V?VPhd5BF+!t$hM6>a-`OHK2UAH|~XUMgMp06*& zsa$kjbiLww*%e~-s*P#IK5_NWz5CbU2R4j#^XJL*g2m6vLBHLrroRfn_vy$>)Tpap zk_@h(HxKb&4SuDF&mlbP(joDZHah*Sa+DU*eE90c{pU{~NVC~0ie^#f!%~`^c3$Qx zgSJT89u4w-Z#@`AIgC2$OWNr+Uk~$sN76Tgw`n&ox{~$=WoNi0Y0=ftGH{Q|0wh2JBtQZrKmsH{0wh2J$A*CZ+Pv4&ABIZ~!Dz7Uw-Qp0*sARm1y#@;{z?G4e# z0(}ZGzoEHbCzDO&qp!t|=U?{+As+eemJ4cF?+4_g@5P?yqtAt%(Ok%f-}+iuFG=JJ z`Z9XIM)b|lkT85(Oy!zd=Bx72Hv$*0BBO!l!)>|Nv%}6{1N|$|hjJXek+GS`$M#Ru zS3TQfgCudX8%55lS}yW&|4e;&wwl%0O`>_b@g^7@~@7G zu%>l=>Dlb@i6&i_zFfCA=N1oYV+J*~xJ}=#8w3_fFej~gcI;6XPxPUoeh$^h=^ZaW z2Xe7b0snoGTj!!o%c`hU1Y(?5NihL&pFfCHl_`kZX8p`)RI5;LGN>D#r0NgalO8B zKP@)WWeMlSoNdwi__OiEP1jwsHCHB9FpvaDfCNZ@1W14cNPq-LfCNb36cIrFj(k^! zd4Cp8nRo&Yi~RO~vP1Sf-g4ffB4=%lCQV)DRy8-?g_?pnd`EUcH2dV zEh&f_wST%V=m)U~EO`FyeSt4WLjoi~0wh2JBtQZrKmsH{0wi!u0(jTl_xID^e-1Wm z$!#B>#rmEXT8?UM*XL*BP_DS0b9>G0RktuPxs304&4)2`i2GO8Ux$w^7xU(CgV70# zpO$gI?XM!|^?i4CK$7TaUj33B^xyuC|9bE%MchN^*qZS>Y#m7#8|}@qmljfe^7i$k zS1%q*wOT8RYEkChQmT!5Ugl~#b&<5*>*Vd$TIdvIH`-oX(nhoTuA8?TlD_YJNSk@l zl(f|;8{JJwi>8K_c};t;y|#_nNPq-LfCNZ@1W14cNPq-LfCNb3#1PP5o40EE!*I#b zIWb%3MoEAKNPq-LfCNZ@1W14cNPq-LfCMHa5c2Tt1Fhlv2ly@m zzJCyB_v%4ld`CN0g93Wgspxy*2$VNO9ShVO#Q2tKe+&j2(4(%!w(D>DgAfnByXCTW zto8%+sC%*NdephFJ(>%8_^m#M)slo>vJfU}Lqpw+I2u3y4V|!chkDeFz`-GOi|4~_ zTC3S%d$5N36{thm58lYwy3k|!=jt0i+hc=C;$SBlxuDjx(Bu4>`tWS+4%;Um*p7%K!iX diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index c6e84ac21..5d577ddf7 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1821,12 +1821,11 @@ def libs(self, remote, directory = None, flatten = False): Examples: >>> s = ssh(host='example.pwnme') - >>> s.cwd = f'{pwnlib.data.elf.path}/ssh_libs' - >>> s.libs("duplicate", "out_duplicate") # doctest: +ELLIPSIS + >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate") # doctest: +ELLIPSIS {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} - >>> s.libs("no_duplicate", "out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS - {'.../out_noduplicate_flatten/lib.so': ..., '.../out_noduplicate_flatten/lib2.so': ..., '.../out_noduplicate_flatten/no_duplicate': ...} - >>> s.libs("duplicate", "out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS + >>> s.libs(pwnlib.data.elf.ssh_libs.get("no_duplicate"), "/tmp/out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS + {'/tmp/out_noduplicate_flatten/lib.so': ..., '/tmp/out_noduplicate_flatten/lib2.so': ..., '/tmp/out_noduplicate_flatten/no_duplicate': ...} + >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS Traceback (most recent call last): ... PwnlibException: Duplicate lib name: ... From 09226dbd79413a66375fbb58fcc1888672a518b4 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 6 Dec 2023 13:30:45 +0100 Subject: [PATCH 11/16] [ssh.libs] Import pwnlib.data.elf.ssh_libs in pwnlib.data.elf --- pwnlib/data/elf/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pwnlib/data/elf/__init__.py b/pwnlib/data/elf/__init__.py index a403b0074..421dc087b 100644 --- a/pwnlib/data/elf/__init__.py +++ b/pwnlib/data/elf/__init__.py @@ -2,6 +2,7 @@ from pwnlib.data.elf import fmtstr from pwnlib.data.elf import relro from pwnlib.data.elf import ret2dlresolve +from pwnlib.data.elf import ssh_libs import os path = os.path.dirname(__file__) From 0282eccf5c2ded3f5cb988941e50d34f4473dcb3 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 6 Dec 2023 14:07:55 +0100 Subject: [PATCH 12/16] [ssh.libs] Fix corrupted binaries --- pwnlib/data/elf/ssh_libs/duplicate | Bin 8856 -> 25544 bytes pwnlib/data/elf/ssh_libs/no_duplicate | Bin 8856 -> 25544 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pwnlib/data/elf/ssh_libs/duplicate b/pwnlib/data/elf/ssh_libs/duplicate index 836d5f3a8bdb2e96daa753b951e8afcefe04b77f..19ad834d7e6e5e4cb7a145e71cf54d90eab62055 100755 GIT binary patch literal 25544 zcmeI5&1w@-6vt2ESFH=9MG;XthznQK3R1d~5kF8+Dehbi6BA9KNhLEbveHMGN5~@- zpQMk_jgO#9<2iHBe}bW{K`EmBUr7GN$Q>qqM`h3|)su}3TY9s>1nM^Hi))Mc! z`gw6~sKwb?qt)OZtp7u^r{Tifop*S0$w_u_mf zzAM#dfjQgC`gqxR;g;FTy6D0IbR+>1AOR8}0TLhq5+DH*AORBip9mm-N4_hqBwWum z@&p`;{Pwu=_gTK|ls%ufocE|aeBa%nxR1qE-xsXA!}_Ptf%^LJhyE(>pZIc6aQWT5 z-X$&(plfMunu^PF7?p!;VPY84t5T|4r4&i&4<=K;mvMeLKnq zU5VcfKg7K(?@8Pr7TwW%iSwSi7Fk<+(DA^=Y$QMeBtQZrKmsH{0wh2JBtQZrZ~_SE zug$~n!ubR76Yy#CiX=b+BtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr@J|!C^oOU9HQs6_SlvKt_#XrOzk!!g z43qkfdJ-_)(T>%MKs@S6OxzJQ7x3Q)s5gl5ZH@glo$eqW^(S^c{)TS^f5f|4E^EhX zPaq!kDfT=b^(gF&W>=Z41{cSB3VFUWMe}Y2&6+oNy5;rOq8va7seo7 zfLCCmY;3SHF|#1H;%hDvmVEa4`*pT_vlqDEpIDui&!m+nW5-`ztz diff --git a/pwnlib/data/elf/ssh_libs/no_duplicate b/pwnlib/data/elf/ssh_libs/no_duplicate index 087a6e2d2ee494136e546a8d701e9a26393ad3ea..24bdeeab324632264637eed3b5689b52947abf5b 100755 GIT binary patch literal 25544 zcmeI5L26V%5QcjuDr2%Rib9Y;9^%5)B#MNrpl8q3^Lic)vcZ4}Y@FY3H zY&?Q49jm(Q?}4YpAtq!9U&G5^UES5)@0;1w%%t9zx9|6dgF#XorZ;KcGjCHyMn{^F zQk(YD$o{US)pXC?ckF6oxD88s5Q|AiF>l4xmp97`#b#p`Pk37=zhAt?URomwoi_CUynbX zj$fvHzZ&zc+}7p&h1-#@Y>O@&z(fc@00Izz00bZa0SG_<0uZ=O1eCuk-%aanxxLUP z5^$;V+w02T=lOC_jy&9R-iz|^X-t>uempLJUa%7rcD@!v8tZGm^j~@ZB$ktk%VqQa zSPp>z1Rwwb2tWV=5P$##AOL|IBH;O>x4y0wcgZcyp2YXpKYq>fSFC5zzZ>)HYw^5< z=dj++V|=xA)8kOByAk~-q1Pof|8HW4rY(lFmme$7UAp`~&N=O!_p600bZa0SG_<0uX=z1R$`S1nk%5<#*xyKzuo0AWj7V2tWV=5P$##AOHaf zKmY;|xB>z>|9|EG7|sU(SAdfxAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5V$!45C3!PvBi7MfMKko=NRbu26~Qxw#mgH)G>Wwm)D9=yy{6zVxr0o z=-CIV!=V0ii~Tv9ohn}SC(a^%)5g7NzT%5FrAKCX?Fq%JKE-*&s~&})(Ors{-|JX- zO$f!OsCQwSo9bJXURgu7>r=aY-5Ou(Q2OYfP5W!aW4)GzpTV1+>!5m)lk6>w-Bi4| zzB6ClJLYC-N~a6oeN*2@@w)%keA?U0+PbEg&#I>wfwg*f&H7vXx28-vs56VvkN*v0 CpkSZ? delta 493 zcmYk3u}T9$5Qb+j1}<1+Lk>fNa(jX)1kZE^1hY*FOFKKc)99s040k7(E?5Y57pAcc zK7rs1#LC!NYU>-=h+Uj@_rQVOnfkD;zUc#u+<&YRSbqN_T|975KxBkV)sjPogA^(;x)DKTLb^2>grTl^+F31pe80 zn2ZNHr!n}w=;S;O2E9Ke81zr^i*>zKdRet%nGP~0b!CJyR@@rSJ-bmOy+|u}&Wy8c z;X}}DR0(}AmzOzyG}yK9lkf&%^;VAG4BoeJGi-WWgbM#K Date: Wed, 6 Dec 2023 14:08:36 +0100 Subject: [PATCH 13/16] [ssh.libs] We actually need to set the cwd since libs paths are relative --- pwnlib/tubes/ssh.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 5d577ddf7..a874bae60 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1821,6 +1821,7 @@ def libs(self, remote, directory = None, flatten = False): Examples: >>> s = ssh(host='example.pwnme') + >>> s.cwd = pwnlib.data.elf.ssh_libs.get(".") >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate") # doctest: +ELLIPSIS {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} >>> s.libs(pwnlib.data.elf.ssh_libs.get("no_duplicate"), "/tmp/out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS From b755b4eba6d90c667d1bb31ac345b4c4d24d850b Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 6 Dec 2023 16:17:34 +0100 Subject: [PATCH 14/16] [ssh.libs] Fix permission issues for CI --- pwnlib/tubes/ssh.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index a874bae60..19a611288 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1821,7 +1821,8 @@ def libs(self, remote, directory = None, flatten = False): Examples: >>> s = ssh(host='example.pwnme') - >>> s.cwd = pwnlib.data.elf.ssh_libs.get(".") + >>> s.upload_dir(pwnlib.data.elf.ssh_libs.get("."), "/tmp/ssh_libs") + >>> s.cwd = "/tmp/ssh_libs" >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate") # doctest: +ELLIPSIS {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} >>> s.libs(pwnlib.data.elf.ssh_libs.get("no_duplicate"), "/tmp/out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS From 66bc31340897dbc70be3fd3db37947bc380dbb04 Mon Sep 17 00:00:00 2001 From: ValekoZ Date: Wed, 6 Dec 2023 16:28:47 +0100 Subject: [PATCH 15/16] [ssh.libs] Fix doctest --- pwnlib/tubes/ssh.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 19a611288..16bd60c04 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1821,7 +1821,7 @@ def libs(self, remote, directory = None, flatten = False): Examples: >>> s = ssh(host='example.pwnme') - >>> s.upload_dir(pwnlib.data.elf.ssh_libs.get("."), "/tmp/ssh_libs") + >>> s.upload_dir(pwnlib.data.elf.ssh_libs.get("."), "/tmp") >>> s.cwd = "/tmp/ssh_libs" >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate") # doctest: +ELLIPSIS {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} From 1e266d4c4dfb0bdfe7d6d1e217699228b629c040 Mon Sep 17 00:00:00 2001 From: Peace-Maker Date: Fri, 9 Feb 2024 15:50:47 +0100 Subject: [PATCH 16/16] Remove doctest attempts --- CHANGELOG.md | 4 ++-- pwnlib/data/elf/__init__.py | 1 - pwnlib/data/elf/ssh_libs/__init__.py | 6 ------ pwnlib/data/elf/ssh_libs/a/lib.so | Bin 8736 -> 0 bytes pwnlib/data/elf/ssh_libs/b/lib.so | Bin 8736 -> 0 bytes pwnlib/data/elf/ssh_libs/b/lib2.so | Bin 8736 -> 0 bytes pwnlib/data/elf/ssh_libs/duplicate | Bin 25544 -> 0 bytes pwnlib/data/elf/ssh_libs/no_duplicate | Bin 25544 -> 0 bytes pwnlib/tubes/ssh.py | 18 +++--------------- 9 files changed, 5 insertions(+), 24 deletions(-) delete mode 100644 pwnlib/data/elf/ssh_libs/__init__.py delete mode 100755 pwnlib/data/elf/ssh_libs/a/lib.so delete mode 100755 pwnlib/data/elf/ssh_libs/b/lib.so delete mode 100755 pwnlib/data/elf/ssh_libs/b/lib2.so delete mode 100755 pwnlib/data/elf/ssh_libs/duplicate delete mode 100755 pwnlib/data/elf/ssh_libs/no_duplicate diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d7acad91..19e488efa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,11 +74,13 @@ The table below shows which release corresponds to each branch, and what date th - [#2281][2281] FIX: Getting right amount of data for search fix - [#2293][2293] Add x86 CET status to checksec output - [#1763][1763] Allow to add to the existing environment in `process` instead of replacing it +- [#2268][2268] Add a `flatten` argument to `ssh.libs` [2277]: https://github.com/Gallopsled/pwntools/pull/2277 [2281]: https://github.com/Gallopsled/pwntools/pull/2281 [2293]: https://github.com/Gallopsled/pwntools/pull/2293 [1763]: https://github.com/Gallopsled/pwntools/pull/1763 +[2268]: https://github.com/Gallopsled/pwntools/pull/2268 ## 4.12.0 (`beta`) @@ -89,7 +91,6 @@ The table below shows which release corresponds to each branch, and what date th - [#2212][2212] Add `--libc libc.so` argument to `pwn template` command - [#2257][2257] Allow creation of custom templates for `pwn template` command - [#2225][2225] Allow empty argv in ssh.process() -- [#2268][2268] Add a `flatten` argument to `ssh.libs` [2202]: https://github.com/Gallopsled/pwntools/pull/2202 [2117]: https://github.com/Gallopsled/pwntools/pull/2117 @@ -98,7 +99,6 @@ The table below shows which release corresponds to each branch, and what date th [2212]: https://github.com/Gallopsled/pwntools/pull/2212 [2257]: https://github.com/Gallopsled/pwntools/pull/2257 [2225]: https://github.com/Gallopsled/pwntools/pull/2225 -[2268]: https://github.com/Gallopsled/pwntools/pull/2268 ## 4.11.1 (`stable`) diff --git a/pwnlib/data/elf/__init__.py b/pwnlib/data/elf/__init__.py index 421dc087b..a403b0074 100644 --- a/pwnlib/data/elf/__init__.py +++ b/pwnlib/data/elf/__init__.py @@ -2,7 +2,6 @@ from pwnlib.data.elf import fmtstr from pwnlib.data.elf import relro from pwnlib.data.elf import ret2dlresolve -from pwnlib.data.elf import ssh_libs import os path = os.path.dirname(__file__) diff --git a/pwnlib/data/elf/ssh_libs/__init__.py b/pwnlib/data/elf/ssh_libs/__init__.py deleted file mode 100644 index 9ab4d8753..000000000 --- a/pwnlib/data/elf/ssh_libs/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -import os -path = os.path.dirname(__file__) - -def get(x): - return os.path.join(path, x) - diff --git a/pwnlib/data/elf/ssh_libs/a/lib.so b/pwnlib/data/elf/ssh_libs/a/lib.so deleted file mode 100755 index 2c5d44bd64b73af8e8d5dba18e847750e2ed9c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- diff --git a/pwnlib/data/elf/ssh_libs/b/lib.so b/pwnlib/data/elf/ssh_libs/b/lib.so deleted file mode 100755 index 2c5d44bd64b73af8e8d5dba18e847750e2ed9c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- diff --git a/pwnlib/data/elf/ssh_libs/b/lib2.so b/pwnlib/data/elf/ssh_libs/b/lib2.so deleted file mode 100755 index 2c5d44bd64b73af8e8d5dba18e847750e2ed9c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8736 zcmeI2Jx&5q5XT2lgIY*pj20SbEL~z^(8_G1m4)#FX8F)1;lu2%1(h6uBX9(c!Vzdp zxPX@8%)a?6!4R}HGYLB%Z{~gc9^Jf`tDEa=CPR=MT~g{5{50ggM3W*ih1y(V?p=c@H4oFjtsm0QhfxmB;6d2!b}b#aU#PyG3q#8(Q> zTa!5}D>E&@2p9n)U<8bS5ikNqzz7%tBVYuKfDtePM!*Od0V7}pjDQg^0!F|H7y%>j zFA1R6JkW+ z9y`xo7{noY^eS7rh-RRH0 z^ga&=Bh-WAP#f52(}Oem=kRyA_I)<%q8{8wT7ReuBOmn|rXx1w45-JwjI|#3AbXS$ z>JdNYSZ=N!_dL~l+$*P~qG7mn!j{CaKIyv(yf64lR0HcHe$Iycr(_Qzc&~tW1^qPY a7>kK|aFw-DtEs6P>N^O3KFIds{yzcxH%D^- diff --git a/pwnlib/data/elf/ssh_libs/duplicate b/pwnlib/data/elf/ssh_libs/duplicate deleted file mode 100755 index 19ad834d7e6e5e4cb7a145e71cf54d90eab62055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25544 zcmeI5&1w@-6vt2ESFH=9MG;XthznQK3R1d~5kF8+Dehbi6BA9KNhLEbveHMGN5~@- zpQMk_jgO#9<2iHBe}bW{K`EmBUr7GN$Q>qqM`h3|)su}3TY9s>1nM^Hi))Mc! z`gw6~sKwb?qt)OZtp7u^r{Tifop*S0$w_u_mf zzAM#dfjQgC`gqxR;g;FTy6D0IbR+>1AOR8}0TLhq5+DH*AORBip9mm-N4_hqBwWum z@&p`;{Pwu=_gTK|ls%ufocE|aeBa%nxR1qE-xsXA!}_Ptf%^LJhyE(>pZIc6aQWT5 z-X$&(plfMunu^PF7?p!;VPY84t5T|4r4&i&4<=K;mvMeLKnq zU5VcfKg7K(?@8Pr7TwW%iSwSi7Fk<+(DA^=Y$QMeBtQZrKmsH{0wh2JBtQZrZ~_SE zug$~n!ubR76Yy#CiX=b+BtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr@J|!C^oOU9HQs6_SlvKt_#XrOzk!!g z43qkfdJ-_)(T>%MKs@S6OxzJQ7x3Q)s5gl5ZH@glo$eqW^(S^c{)TS^f5f|4E^EhX zPaq!kDfT=b^(gF&Wpl8q3^Lic)vcZ4}Y@FY3H zY&?Q49jm(Q?}4YpAtq!9U&G5^UES5)@0;1w%%t9zx9|6dgF#XorZ;KcGjCHyMn{^F zQk(YD$o{US)pXC?ckF6oxD88s5Q|AiF>l4xmp97`#b#p`Pk37=zhAt?URomwoi_CUynbX zj$fvHzZ&zc+}7p&h1-#@Y>O@&z(fc@00Izz00bZa0SG_<0uZ=O1eCuk-%aanxxLUP z5^$;V+w02T=lOC_jy&9R-iz|^X-t>uempLJUa%7rcD@!v8tZGm^j~@ZB$ktk%VqQa zSPp>z1Rwwb2tWV=5P$##AOL|IBH;O>x4y0wcgZcyp2YXpKYq>fSFC5zzZ>)HYw^5< z=dj++V|=xA)8kOByAk~-q1Pof|8HW4rY(lFmme$7UAp`~&N=O!_p600bZa0SG_<0uX=z1R$`S1nk%5<#*xyKzuo0AWj7V2tWV=5P$##AOHaf zKmY;|xB>z>|9|EG7|sU(SAdfxAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5V$!45C3!PvBi7MfMKko=NRbu26~Qxw#mgH)G>Wwm)D9=yy{6zVxr0o z=-CIV!=V0ii~Tv9ohn}SC(a^%)5g7NzT%5FrAKCX?Fq%JKE-*&s~&})(Ors{-|JX- zO$f!OsCQwSo9bJXURgu7>r=aY-5Ou(Q2OYfP5W!aW4)GzpTV1+>!5m)lk6>w-Bi4| zzB6ClJLYC-N~a6oeN*2@@w)%keA?U0+PbEg&#I>wfwg*f&H7vXx28-vs56VvkN*v0 CpkSZ? diff --git a/pwnlib/tubes/ssh.py b/pwnlib/tubes/ssh.py index 16bd60c04..3756109d0 100644 --- a/pwnlib/tubes/ssh.py +++ b/pwnlib/tubes/ssh.py @@ -1816,21 +1816,9 @@ def libs(self, remote, directory = None, flatten = False): Arguments: remote(str): Remote file path directory(str): Output directory - flatten(bool): Flatten the file tree if True (defaults to False). If - there are duplicate filenames, fallback to unflattened structure. - - Examples: - >>> s = ssh(host='example.pwnme') - >>> s.upload_dir(pwnlib.data.elf.ssh_libs.get("."), "/tmp") - >>> s.cwd = "/tmp/ssh_libs" - >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate") # doctest: +ELLIPSIS - {'.../b/lib.so': ..., '.../a/lib.so': ..., '.../duplicate': ...} - >>> s.libs(pwnlib.data.elf.ssh_libs.get("no_duplicate"), "/tmp/out_noduplicate_flatten", flatten = True) # doctest: +ELLIPSIS - {'/tmp/out_noduplicate_flatten/lib.so': ..., '/tmp/out_noduplicate_flatten/lib2.so': ..., '/tmp/out_noduplicate_flatten/no_duplicate': ...} - >>> s.libs(pwnlib.data.elf.ssh_libs.get("duplicate"), "/tmp/out_duplicate_flatten", flatten = True) # doctest: +ELLIPSIS - Traceback (most recent call last): - ... - PwnlibException: Duplicate lib name: ... + flatten(bool): Flatten the file tree if True (defaults to False) and + ignore the remote directory structure. If there are duplicate + filenames, an error will be raised. """ libs = self._libs_remote(remote)