测试文件: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. HDU 6578 Blank

    hdu题面 Time limit 1000 ms Memory limit 262144 kB OS Windows Source 2019 Multi-University Training Con ...

  2. vue 使用 vue-awesome-swiper (基础版)

    1.0 安装 vue-awesome-swiper(稳定版本 2.6.7) npm install vue-awesome-swiper@2.6.7 --save 2.0 引入配置(全局使用) 2.1 ...

  3. CCPC哈尔滨E题

    一堆序列拼接起来,找出现次数大于n/2的数 假设一个数出现次数大于n/2 那么它减去其他数出现的次数一定非负: = c) { cnt += t[i]; } } } } //cout<<c& ...

  4. spring boot redis session

    1. pom.xml 这里 spring parent的版本 2.1.5会报错 2.1.0和2.1.4经过测试正常 <?xml version="1.0" encoding= ...

  5. Elasticsearch Java Rest Client API 整理总结 (一)

    http://www.likecs.com/default/index/show?id=39549

  6. nginx location的优先级

    原来一直以为location的优先级是先后顺序,结果有次项目中傻眼了,赶紧百度一下,下面的内容参考了这个链接 location表达式类型 ~ 表示执行一个正则匹配,区分大小写~* 表示执行一个正则匹配 ...

  7. (转)使用NMAP工具扫描端口

    原文:http://www.linuxde.net/2013/02/12354.html nmap 是一个用于网络探索或安全评测的工具.它支持 ping 扫描(判定哪些主机在运行),多端口扫描技术(判 ...

  8. 淘淘相关工具类【json,httpClient,id,FTP,exception,cookie(包括共享cookie的设置等)】

    json package com.taotao.common.utils; import java.util.List; import com.fasterxml.jackson.core.JsonP ...

  9. 阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置

    一对多的配置,一个用户对应多个账户 需要在Accout里面增加根据用户的uid查询的方法 在user里面指定子一对多的查询配置 换行显示 测试 把这里注销掉.测试延迟加载,代码注释掉后,延迟加载就没有 ...

  10. visualSVN提交强制添加注释

    Visual SVN Server下 右键项目  “所有任务”>“Manage Hooks” >选中Pre-commit hook然后edit编辑,添加如下代码 @echo off set ...