0xL4ugh 2023

news2024/9/23 13:23:59

这回跟着个队伍跑,不过还是2X以后的成绩,前边太卷了。

自己会的部分,有些是别人已经提交了的。记录一下。

Crypto

crypto 1

给了一些数据,像这样就没有别的了

ct = [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 10154, 20307, 40615, 81229, 162458, 324916, 649832, 1299665, 2599330, 5198659, 10397319, 20794638, 41589276, 83178552, 166357103, 332714207, 665428414, 1330856827, 2661713655, 5323427309, 10646854619, 21293709237, 42587418474, 85174836949, 170349673898, 340699347795, 681398695591, 1362797391181, 2725594782363, 5451189564725, 10902379129451, 21804758258901, 43609516517803, 87219033035605, 174438066071211, 348876132142421, 697752264284843, 1395504528569685, 2791009057139370, 5582018114278740, 11164036228557480, 22328072457114960, 44656144914229920, 89312289828459841, 178624579656919682, 357249159313839363, 714498318627678726, 1428996637255357453, 2857993274510714906, 5715986549021429811, 11431973098042859623, 22863946196085719246, 45727892392171438492, 91455784784342876983, 182911569568685753966, 365823139137371507933, 731646278274743015865, 1463292556549486031730, ...]

看了会发现一个规律:

ct[i] = bit + sum(ct[:i])

把这些0,1弄出来就OK了。我来得早,这时候还没人上线,两个crypto都是1血,跟签到抢到1血一样。

#Alice and Bob decided to create their own super cryptosystem. However.. it has a super flaw
k = 0
f = ''
for i in range(1,len(ct)):
   f += str(ct[i]-k)
   k += ct[i]

print(f)

#前面的和+bit 
f = '0'+f
for i in range(0, len(f),8):
    print(chr(int(f[i:i+8],2)), end='')

#OSC{SUP3r!NCr3451NG_53QU3NC3}

crypto 2

一个e=3的RSA题

from Crypto.Util.number import bytes_to_long, getPrime
from secret import messages


def RSA_encrypt(message):
    m = bytes_to_long(message)
    p = getPrime(1024)
    q = getPrime(1024)
    N = p * q
    e = 3
    c = pow(m, e, N)
    return N, e, c


for m in messages:
    N, e, c = RSA_encrypt(m)
    print(f"n = {N}")
    print(f"e = {e}")
    print(f"c = {c}")

给了好多的n,c显然,感觉如果flag不是很大可以爆破,不过只有第1行爆破出来了,正好是flag

from gmpy2 import iroot
from Crypto.Util.number import long_to_bytes

msg = open('output.txt').readlines()

for i in range(11):
    n = int(msg[i*3][4:])
    e = int(msg[i*3+1][4:])
    c = int(msg[i*3+2][4:])
    print(n)
    print(e)
    print(c)
    while True:
        a,b = iroot(c,3)
        if b:
            print(long_to_bytes(a))
            break 
        c+=n 

#OSC{C0N6r47U14710N5!_Y0U_UND3r574ND_H0W_70_U53_H4574D5_8r04DC457_4774CK_______0xL4ugh}

Rev

snake

python 字节码

  2           0 LOAD_CONST               1 (0)
              2 LOAD_CONST               0 (None)
              4 IMPORT_NAME              0 (base64)
              6 STORE_FAST               0 (base64)

  3           8 LOAD_CONST               1 (0)
             10 LOAD_CONST               2 (('Fernet',))
             12 IMPORT_NAME              1 (cryptography.fernet)
             14 IMPORT_FROM              2 (Fernet)
             16 STORE_FAST               1 (Fernet)
             18 POP_TOP

  4          20 LOAD_CONST               3 (b'gAAAAABj7Xd90ySo11DSFyX8t-9QIQvAPmU40mWQfpq856jFl1rpwvm1kyE1w23fyyAAd9riXt-JJA9v6BEcsq6LNroZTnjExjFur_tEp0OLJv0c_8BD3bg=')
             22 STORE_FAST               2 (encMessage)

  5          24 LOAD_FAST                0 (base64)
             26 LOAD_METHOD              3 (b64decode)
             28 LOAD_CONST               4 (b'7PXy9PSZmf/r5pXB79LW1cj/7JT6ltPEmfjk8sHljfr6x/LyyfjymNXR5Z0=')
             30 CALL_METHOD              1
             32 STORE_FAST               3 (key_bytes)

  6          34 BUILD_LIST               0
             36 STORE_FAST               4 (key)

  7          38 LOAD_FAST                3 (key_bytes)
             40 GET_ITER
        >>   42 FOR_ITER                 9 (to 62)
             44 STORE_FAST               5 (k_b)

  8          46 LOAD_FAST                4 (key)
             48 LOAD_METHOD              4 (append)
             50 LOAD_FAST                5 (k_b)
             52 LOAD_CONST               5 (160)
             54 BINARY_XOR
             56 CALL_METHOD              1
             58 POP_TOP
             60 JUMP_ABSOLUTE           21 (to 42)

 10     >>   62 LOAD_GLOBAL              5 (bytes)
             64 LOAD_FAST                4 (key)
             66 CALL_FUNCTION            1
             68 STORE_FAST               4 (key)

 11          70 LOAD_FAST                1 (Fernet)
             72 LOAD_FAST                4 (key)
             74 CALL_FUNCTION            1
             76 STORE_FAST               6 (fernet)

 12          78 LOAD_FAST                6 (fernet)
             80 LOAD_METHOD              6 (decrypt)
             82 LOAD_FAST                2 (encMessage)
             84 CALL_METHOD              1
             86 LOAD_METHOD              7 (decode)
             88 CALL_METHOD              0
             90 STORE_FAST               7 (decMessage)

 13          92 LOAD_GLOBAL              8 (print)
             94 LOAD_FAST                7 (decMessage)
             96 CALL_FUNCTION            1
             98 POP_TOP
            100 LOAD_CONST               0 (None)
            102 RETURN_VALUE
None

手扣

import base64
from cryptography.fernet import Fernet

encMessage = b'gAAAAABj7Xd90ySo11DSFyX8t-9QIQvAPmU40mWQfpq856jFl1rpwvm1kyE1w23fyyAAd9riXt-JJA9v6BEcsq6LNroZTnjExjFur_tEp0OLJv0c_8BD3bg='

key_bytes = base64.b64decode(b'7PXy9PSZmf/r5pXB79LW1cj/7JT6ltPEmfjk8sHljfr6x/LyyfjymNXR5Z0=')

key = []
for k_b in key_bytes:
    key.append(k_b^160)
key = bytes(key)

decMessage = Fernet(key).decrypt(encMessage)
print(decMessage)

#FLAG{FLY_L1k3_0xR4V3N}
#0xL4ugh{FLY_L1k3_0xR4V3N}

easy-Peasy

高低4位互换

  v11[0] = 1947518052;
  v11[1] = 84227255;
  v11[2] = -181070859;
  v11[3] = -972881100;
  v11[4] = 1396909045;
  v11[5] = 1396929315;
  v12 = -10397;
  v13 = 0;
  v3 = 0i64;
  v16 = 0i64;
  v17 = 15i64;
  LOBYTE(Block[0]) = 0;
  sub_140001350(Block);
  sub_1400015D0(std::cout, (__int64)"Enter The Flag: ");
  sub_140001A50(std::cin, Block);               // 读入Block
  if ( v16 == 26 )
  {
    while ( 1 )
    {
      v4 = Block;
      if ( v17 >= 0x10 )
        v4 = (void **)Block[0];
      v5 = Block;
      if ( v17 >= 0x10 )
        v5 = (void **)Block[0];
      if ( *((unsigned __int8 *)v11 + v3) != ((*((char *)v4 + v3) >> 4) | (16 * (*((_BYTE *)v5 + v3) & 0xF))) )// 高低互换
        break;
      if ( ++v3 >= 26 )
      {
        v6 = sub_1400015D0(std::cout, (__int64)"The Flag is: ");
        v7 = Block;
        if ( v17 >= 0x10 )
          v7 = (void **)Block[0];
        sub_140001C50(v6, v7, v16);
        goto LABEL_12;
      }
    }
  }

va = [1947518052,84227255,-181070859,-972881100,1396909045,1396929315,-10397]

from pwn import p32

v11 = b''.join([p32(v&0xffffffff) for v in va])
f = ''
for v in v11:
    f += chr(((v&0xf)<<4)+(v>>4))

print(f)
#FLAG{CPP_1S_C00l_24527456}
#0xL4ugh{CPP_1S_C00l_24527456}

lets go

代码看着很复杂,但明显能看出是字节变换

void __cdecl main_main()
{
  __int64 v0; // r14
  __int128 v1; // xmm15
  __int64 *v2; // rax
  __int64 v3; // r8
  __int64 v4; // r9
  __int64 v5; // rax
  __int64 v6; // rcx
  unsigned __int64 v7; // rbx
  __int64 v8; // rsi
  int v9; // r10d
  __int64 v10; // r11
  int v11; // r10d
  __int64 v12; // rax
  unsigned __int64 v13; // rcx
  int v14; // r10d
  __int64 v15; // rax
  unsigned __int64 v16; // rcx
  __int64 v17; // rax
  unsigned __int64 v18; // rcx
  __int64 v19; // rax
  __int64 v20; // [rsp-46h] [rbp-D8h]
  char v21; // [rsp+0h] [rbp-92h]
  char v22; // [rsp+1h] [rbp-91h]
  char v23; // [rsp+1h] [rbp-91h]
  __int64 v24; // [rsp+2h] [rbp-90h]
  __int64 v25; // [rsp+Ah] [rbp-88h]
  __int64 v26; // [rsp+12h] [rbp-80h]
  __int64 v27; // [rsp+3Ah] [rbp-58h] BYREF
  __int64 *v28; // [rsp+42h] [rbp-50h]
  void *v29; // [rsp+4Ah] [rbp-48h]
  char **v30; // [rsp+52h] [rbp-40h]
  __int128 v31; // [rsp+5Ah] [rbp-38h]
  const char *v32; // [rsp+6Ah] [rbp-28h]
  __int64 *v33; // [rsp+72h] [rbp-20h]
  void *v34; // [rsp+7Ah] [rbp-18h]
  char **v35; // [rsp+82h] [rbp-10h]

  if ( (unsigned __int64)&v27 <= *(_QWORD *)(v0 + 16) )
    runtime_morestack_noctxt_abi0();
  v34 = &unk_494360;
  v35 = &off_4C3F50;
  fmt_Fprint();
  runtime_newobject();
  v28 = v2;
  *v2 = 0LL;
  v32 = "\b";
  v33 = v2;
  fmt_Fscanln();
  v3 = *v28;
  v27 = *v28;
  v4 = v28[1];
  v25 = v4;
  v5 = 0LL;
  v6 = 0LL;
  v7 = 0LL;
  v8 = 0LL;
  while ( v5 < v4 )
  {
    v24 = v6;
    v26 = v5;
    v9 = *(unsigned __int8 *)(v3 + v5);
    if ( (unsigned __int8)(v9 - 65) > 0x19u )
    {
      if ( (unsigned __int8)(v9 - 97) > 0x19u ) // 符号
      {
        v10 = v6 + 1;
        if ( v7 < v6 + 1 )
        {
          v21 = *(_BYTE *)(v3 + v5);
          runtime_growslice(v20);
          v10 = v8 + 1;
          v3 = v27;
          v4 = v25;
          LOBYTE(v9) = v21;
          v8 = v17;
          v7 = v18;
          v5 = v26;
          v6 = v24;
        }
        *(_BYTE *)(v8 + v6) = v9;
      }
      else
      {
        v10 = v6 + 1;
        v14 = v9 - 26 * ((unsigned __int8)(v9 - 81) / 0x1Au);
        if ( v7 < v6 + 1 )
        {
          v23 = v14;
          runtime_growslice(v20);
          v10 = v8 + 1;
          v3 = v27;
          v4 = v25;
          LOBYTE(v14) = v23;
          v8 = v15;
          v7 = v16;
          v5 = v26;
          v6 = v24;
        }
        *(_BYTE *)(v8 + v6) = v14 + 16;
      }
    }
    else
    {
      v10 = v6 + 1;
      v11 = v9 - 26 * ((unsigned __int8)(v9 - 49) / 0x1Au);
      if ( v7 < v6 + 1 )
      {
        v22 = v11;
        runtime_growslice(v20);
        v10 = v8 + 1;
        v3 = v27;
        v4 = v25;
        LOBYTE(v11) = v22;
        v8 = v12;
        v7 = v13;
        v5 = v26;
        v6 = v24;
      }
      *(_BYTE *)(v8 + v6) = v11 + 16;
    }
    ++v5;
    v6 = v10;
  }
  runtime_slicebytetostring();
  if ( v8 == 32 && (unsigned __int8)runtime_memequal() )
  {
    v31 = v1;
    v19 = runtime_convTstring();
    *(_QWORD *)&v31 = &unk_494360;
    *((_QWORD *)&v31 + 1) = v19;
    fmt_Fprintf();
  }
  else
  {
    v29 = &unk_494360;
    v30 = &off_4C3F60;
    fmt_Fprint();
  }
}

这个只需要个码表就行,输入字母得到的就是码表,然后手工对应填一下

输入得到对应关系
abcdefghijklmnopqrstuvwxyz012345
qrstuvwxyzabcdefghijklmnop012345

ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
QRSTUVWXYZABCDEFGHIJKLMNOP012345

67890{_} 数字符号不变


c = b"u507rv78qr5t6q99941422uursv94464"

u507rv78qr5t6q99941422uursv94464
e507bf78ab5d6a99941422eebcf94464

手工输入得到flag
ef➤  
Correct:)
FLAG{e507bf78ab5d6a99941422eebcf94464}
52      in example/user/hello/hello.go

换头
0xL4ugh{e507bf78ab5d6a99941422eebcf94464}

XPacker 未完成

看上去是运行时释放一个程序再找,但怎么运行都不释放,也许想错了

Misc

ATT-IP

流量题,wireShark打开一点点到结果

57包:
tcp://91.243.59.76:23927/
0xL4ugh{91.243.59.76_23927}

PVE

这个是别的提交的,只因为第1步没作出来后边的就没想弄。

给的一vmware的临时文件.vmem 一直想用什么软件找到。其实只有第1题用软件,其它都是在时差搜文本。

后来下了volatility 3才弄好这一步

┌──(kali㉿kali)-[~/volatility3]
└─$ py vol.py -f ~/ctf/PVE.vmem Banners   
Volatility 3 Framework 2.4.1
Progress:  100.00               PDB scanning finished                  
Offset  Banner

0x1a00180       Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x211e6a4       Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x1aaf7338      Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)
0x1fde00a8      Linux version 4.4.0-186-generic (buildd@lcy01-amd64-002) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ) #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 (Ubuntu 4.4.0-186.216-generic 4.4.228)

flag1:0xL4ugh{Ubuntu_4.4.0-186-generic}

第二步是Apache的版本,搜apache有很多,主要是两个版本,第2个=的是

0xL4ugh{2.2.14}

第三步找 flag 搜0xL4ugh

sudo echo "0xL4ugh{S4D_Y0U_G07_M3}" > flag.txt
0xL4ugh{S4D_Y0U_G07_M3}

第四个找程序里隐写的flag

int main(void){
    char flag[] = "0xL4ugh{H1DD3N_1N_PR0CE$$}";
    sleep(6969696969);
    return 0;
}

0xL4ugh{H1DD3N_1N_PR0CE$$}

第五个找攻击求密码,没弄成,linux的密码存在shadow文件但这里没密码,再找passwd也没有,按密码的特征 $1$salt$enc_pass 搜$1$得到一个密码

Name: passwd/user-password-crypted
Template: passwd/user-password-crypted
Value: $1$JULXDu5H$c/QbtxOmwiX0rR7f0NXxj.
Owners: ubiquity
Flags: seen

从网站上解密得到 mrx 提交不正确。

队友还作了一些,刚开始已经狂飙到第2了,后来慢慢又多了1位成2x了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023.02.19 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…

尚医通 (十八)微信登录

目录一、生成微信登录二维码1、准备工作2、后端开发service_user3、前端显示登录二维码4、二维码出现不了进行调试二、开发微信扫描回调1、准备工作2、后台开发3、前台开发三、分析代码四、bug一、生成微信登录二维码 1、准备工作 1、注册 2、邮箱激活 3、完善开发者资料 4、…

JSP中http与内置对象学习笔记

本博文讲述jsp客户端与服务器端的http、jsp内置对象与控制流和数据流实现 1.HTTP请求响应机制 HTTP协议是TCP/IP协议中的一个应用层协议&#xff0c;用于定义客户端与服务器之间交换数据的过程 1.1 HTTP请求 HTTP请求由请求行、消息报头、空行和请求数据4部分组成。 请求行…

ThreeJS 之界面控制

文章目录参考描述界面自适应问题resize 事件修改画布大小修改视锥体的宽高比全屏显示dblclick 事件检测全屏显示状态进入全屏显示状态退出全屏显示状态尾声参考 项目描述ThreeJS官方文档哔哩哔哩老陈打码搜索引擎BingMDN 文档document.mozFullScreenElementMDN 文档Element.re…

LeetCode题目笔记——6359. 替换一个数字后的最大差值

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;替换代码/Python代码优化总结题目描述 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后&#xff0c;得到的最大值和最小值…

CTK学习:(一)编译CTK

CTK插件框架简介 CTK Plugin Framework是用于C++的动态组件系统,以OSGi规范为模型。在此框架下,应用程序由不同的组件组成,遵循面向服务的方法。 ctk是一个开源项目,Github 地址:https://github.com/commontk。 源码地址commontk/CTK: A set of common support code for…

信小程序点击按钮绘制定制转发分享图

1. 说明 先上代码片断分享链接&#xff1a; https://developers.weixin.qq.com/s/vl3ws9mA72GG 使用 painter 画图 按钮传递定制化信息 效果如下&#xff1a; 2. 关键代码说明 文件列表如下&#xff1a; {"usingComponents": {"painter": "/com…

基于springboot的停车场管理系统(程序+文档)

大家好✌&#xff01;我是CZ淡陌。将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。 &#x1f345;更多优质项目&#x1f447;&#x1f…

Android实例仿真之二

目录 三 从无入手 第一阶段 第二阶段 第三阶段 第四阶段 第五阶段 第六阶段 第七阶段 八 举两个典型例子&#xff1a; 九 逆向工程 三 从无入手 这节标题叫从无入手&#xff0c;什么意思呢&#xff1f;如果没有Android这个实例存在&#xff0c;你要做一个类似Android…

Mysql数据库事务

数据库事务 数据库事务由一组sql语句组成。 所有sql语句执行成功则事务整体成功&#xff1b;任一条sql语句失败则事务整体失败&#xff0c;数据恢复到事务之前的状态。 Mysql 事务操作 开始事务 start transaction;- 或 begin;事务开始后&#xff0c;对数据的增删改操作不…

MySQL最佳实践

一、MySQL查询执行过程 1.MySQL分层结构 MySQL8.0没有查询缓存的功能了,如果频繁修改缓存,将会损耗性能查询流程就按照分层结构就可以清楚,只要了解各个组件的各自功能就行分析器主要分析语法和词法是否正确优化器主要优化SQL语句 二、MySQL更新执行过程 更新主要涉及两个重…

SpringCloud - Ribbon负载均衡

目录 负载均衡流程 负载均衡策略 Ribbon加载策略 负载均衡流程 Ribbon将http://userservice/user/1请求拦截下来&#xff0c;帮忙找到真实地址http://localhost:8081LoadBalancerInterceptor类对RestTemplate的请求进行拦截&#xff0c;然后从Eureka根据服务id获取服务列表&…

正点原子ARM裸机开发篇

裸机就是手动的操作硬件来实现驱动设备&#xff0c;后面会有驱动框架不需要这么麻烦 第八章 汇编 LED 灯实验 核心过程 通过汇编语言来控制硬件&#xff08;驱动程序&#xff09; 代码流程 1、使能 GPIO1 时钟 GPIO1 的时钟由 CCM_CCGR1 的 bit27 和 bit26 这两个位控制&…

SSL/STL是什么?怎么工作的?Keystore 和 Truststore是什么?

安全套接字层&#xff08;Secure Sockets Layer&#xff09;&#xff0c;也称为 SSL&#xff0c;是一种加密协议(encryption protocol)&#xff0c;可在 Internet 上的设备之间创建身份验证的通道(authenticated channel)&#xff0c;以便可以安全地共享信息。本质上&#xff0…

动态规划专题精讲1

致前行的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 前言&#xff1a; 本篇文章为大家带来一种重要的算法题&#xff0c;就是动态规划类型相关的题目&#xff0c;动态规划类的题目在笔试和面试中是考察非常高…

【日常点滴019】Python制作流浪气球游戏(导弹射击类)

Python制作流浪气球游戏&#xff08;导弹射击类&#xff09;教学课程代码&#xff08;分步教学版&#xff09;1、构建全局通用代码结构2、构建气球精灵类3、构建导弹精灵类4、碰撞检测5、构建游戏信息类 &#xff08;最终完整代码&#xff09;教学课程代码&#xff08;分步教学…

基于springboot+vue的食疗系统

基于springbootvue的食疗系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…

java面试题-并发基础

1.多线程的出现是要解决什么问题的? 本质什么?提高程序性能&#xff1a;单线程程序只能按照固定的顺序依次执行每个任务&#xff0c;无法同时处理多个任务。多线程技术可以在同一时间内执行多个任务&#xff0c;从而提高程序的运行效率和响应速度。提高程序的并发性&#xff…

前端借助Canvas实现压缩图片两种方法

一、具体代码 1、利用canvas压缩图片方法一 // 第一种压缩图片方法&#xff08;图片base64,图片类型,压缩比例,回调函数&#xff09;// 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)// 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同// …

Python自动化测试-使用Pandas来高效处理测试数据

Python自动化测试-使用Pandas来高效处理测试数据 目录&#xff1a;导读 一、思考 二、使用pandas来操作Excel文件 三、使用pandas来操作csv文件 四、总结 一、思考 1.Pandas是什么&#xff1f; 功能极其强大的数据分析库可以高效地操作各种数据集 csv格式的文件Excel文件H…