测试文件:http://static2.ichunqiu.com/icq/resources/fileupload/CTF/echunqiu/qwb/Nonstandard_26195e1832795caa18fd4c7cfbd56600.zip

1.准备

获得信息:

  • 32位文件

2.IDA打开

int __cdecl main(int argc, const char **argv, const char **envp)
{
FILE *v3; // eax
FILE *v4; // eax
FILE *v5; // eax
char Buf[]; // [esp+0h] [ebp-24h]
__int64 v8; // [esp+10h] [ebp-14h]
int v9; // [esp+18h] [ebp-Ch]
__int16 v10; // [esp+1Ch] [ebp-8h] v9 = ;
_mm_storeu_si128((__m128i *)Buf, (__m128i)0i64);
v10 = ;
v8 = 0i64;
v3 = _iob_func();
fputs("Place Input Flag:\n", v3 + );
v4 = _iob_func();
fgets(Buf, , v4);
if ( sub_401480(Buf) == )
{
v5 = _iob_func();
fputs("yes\n", v5 + );
}
return ;
}

3.代码分析

打开 sub_401480(Buf)函数

 signed int __thiscall sub_401480(const char *this)
{
const char *v1; // esi
const char *v2; // eax
unsigned int v3; // eax
unsigned int v4; // kr04_4
signed int result; // eax
char v6; // [esp+4h] [ebp-38h]
char Dst; // [esp+5h] [ebp-37h] v6 = ;
v1 = this; // this为输入的字符串的地址,长度为28,不包含最后的结束符
memset(&Dst, , 0x31u); // Dst为大小为49的空间
if ( strlen(v1) != ) // 输入字符串长度为28
goto LABEL_10;
v2 = sub_401070((int)v1, 28u);
strncpy_s(&v6, 0x32u, v2, 0x30u);
v3 = ;
v4 = strlen(&v6);
if ( !v4 )
goto LABEL_10;
do
{
if ( byte_402120[v3] != *(&v6 + v3) )
break;
++v3;
}
while ( v3 < v4 );
if ( v3 == )
result = ;
else
LABEL_10:
result = -;
return result;
}

首先,我注意到第24行代码的比较,byte_402120[]="AdtxA66nbbdxA71tUAE2AOlnnbtrAp1nQzGtAQGtrjC7===",这是一段被加密的字符串,而比较的v6数组来自v2,v2是函数sub_401070((int)v1, 28u)的返回值,传入的v1是我们的输入字符串。

打开sub_401070((int)v1, 28u)

sub_401070((int)v1, 28u)

这段加密方式是base32

引自:https://www.ichunqiu.com/writeup/detail/815

base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。
 同样,base32就是用32(2的5次方)个特定ASCII码来表示256个ASCII码。所以,5个ASCII字符经过base32编码后会变为8个字符(公约数为40),长度增加3/5.不足8n用"="补足。
 base16就是用16(2的4次方)个特定ASCII码表示256个ASCII字符。1个ASCII字符经过base16编码后会变为2个字符,长度增加一倍。不足2n用"="补足

同时我们关注到第41行代码,sub_401000();函数

signed __int16 sub_401000()
{
signed int v0; // eax
int v1; // esi
char *v2; // edx
char v3; // cl
signed __int16 result; // ax v0 = ;
do
{
byte_403020[v0] += ;
v0 += ;
}
while ( v0 < );
v1 = ;
v2 = &aMnopqrstuvwxyz[];
do
{
v3 = byte_40301F[++v1];
byte_40301F[v1] = *v2;
*v2-- = v3;
}
while ( (signed int)v2 > (signed int)aMnopqrstuvwxyz );
*(_DWORD *)&aMnopqrstuvwxyz[] = '';
result = '';
word_40303E = '';
byte_403040 = ;
return result;
}

这段函数将加密表重新生成,可以在OD动态调试中获得

因此总体操作就是,将我们输入的字符串,使用新生成的加密表,base32加密,得到AdtxA66nbbdxA71tUAE2AOlnnbtrAp1nQzGtAQGtrjC7===加密字符串

4.脚本获取

使用anybase32包来解密:https://github.com/alanblevins/anybase32

from __future__ import print_function
import anybase32 arbitrary_alphabet = b"zYxWvUtSrQpOnMlKjIhGfEdCbA765321" encoded = b"nAdtxA66nbbdxA71tUAE2AOlnnbtrAp1nQzGtAQGtrjC7" flag = anybase32.decode(encoded, arbitrary_alphabet) print(flag)

5.get flag!

flag{f1ag_1s_enc0de_bA3e32!}

2017第二届广东省强网杯线上赛--Nonstandard的更多相关文章

  1. 2017第二届广东省强网杯线上赛:WEB phone number (SQL注入)

    目录 解题思路 总结 解题思路 拿到题目的时候,只有一个登录界面 拿到登录界面,而且还伴随着有注册界面,联想到SQL的二次注入漏洞 尝试注册admin'#,并使用admin登录,发现登录失败,说明可能 ...

  2. 2017年第二届广东省强网杯线上赛WEB:Musee de X writeup(模板注入漏洞)

    目录 解题思路 总结 解题思路 拿到手上,有四个页面 首先按照题目要求执行,尝试注册一个名为admin的账户 这种情况,路径都给出来了,很可能就是目录遍历或者文件上传了 回到初始界面,点击链接here ...

  3. 2019 第三届强网杯线上赛部分web复现

    0x00前言 周末打了强网杯,队伍只做得出来6道签到题,web有三道我仔细研究了但是没有最终做出来,赛后有在群里看到其他师傅提供了writeup和环境复现的docker环境,于是跟着学习一波并记录下来 ...

  4. 庞果英雄会第二届在线编程大赛·线上初赛:AB数

    题目链接 给定两个正整数a,b,分别定义两个集合L和R, 集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 <= x <=a , 1 <= ...

  5. RobotCraft 2017 第二届国际机器人学暑期学校 2nd Edition of International Robotics Summer School

    原文网址:http://www.ros.org/news/2017/02/2nd-edition-of-international-robotics-summer-school-robotcraft- ...

  6. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  7. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  8. “玲珑杯”线上赛 Round #17 河南专场

    闲来无事呆在寝室打打题,没有想到还有中奖这种操作,超开心的 玲珑杯”线上赛 Round #17 河南专场 Start Time:2017-06-24 12:00:00 End Time:2017-06 ...

  9. 2021广东省强网杯WriteUp

    个人赛 网络诈骗 参考 https://github.com/Heyxk/notes/issues/1 先把EnMicroMsg.db提出来 CompatibleInfo.cfg是0kb,用第一种方法 ...

随机推荐

  1. 【bzoj1189】[HNOI2007]紧急疏散evacuate

    *题目描述: 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是’.’,那么表示这是一块空地:如果是’X’,那么表示这是一面墙,如果是’D’,那么表示这是一扇门,人们 ...

  2. Json和XML的一些差别

    XML: 扩展标记语言,可以用来标记数据.定义数据类型, 优缺点: 1.格式统一,符合标准: 2.容易与其他系统进行远程交互,数据共享比较方便 3.XML文件庞大,文件格式复杂,传输占带宽,较复杂 J ...

  3. [design pattern](5) Factory Method

    前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...

  4. [BZOJ1902]:[NOIP2004]虫食算(搜索)

    题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 来看一个简单的例子: 43#98650#45+8468#6633=444455069 ...

  5. mysql 5.7分组报错问题 Expression #1 of ORDER BY clause is not in GROUP BY clause 的问题 MySQL

    解决方案: select version(),@@sql_mode;SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); ...

  6. Gridview中显示的值根据数据库中带出的值作更改

    前台页面对Gridview增加事件 OnRowDataBound="GridView1_RowDataBound"protected void GridView1_RowDataB ...

  7. 系统性能信息模块--psutil

    #安装psutil模块#pip install psutil -i https://pypi.doubanio.com/simple #导入psutil模块import psutilimport da ...

  8. oracle备份和还原

    用exp命令即可完成,但要看具体的备份方式. 1. 导出一个完整数据库 exp system/manager file=bible_db log=dible_db full=y 2. 导出数据库定义而 ...

  9. Flutter工程目录

    1 目录结构 当使用flutter create myapp 创建纯flutter项目后,会自动生成初始化代码. 需要注意一下几个文件夹 2 资源 像图片.视频.文字等这些资源文件,在 Flutter ...

  10. 十三、RF中对json的解析

    A.需要安装的库 1.RequestsLibrary,安装命令:pip2 install requests 2.HttpLibrary,安装命令:pip2 install robotframework ...