测试文件: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. 上传200G文件

    最近遇见一个需要上传百G大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  2. [HNOI2015]菜肴制作贪心的证明

    [HNOI2015]菜肴制作贪心的证明 先吐槽一句为什么网上都没人证这个东西,我觉得一点也不显然啊... 判环不用说了,现在处理一个DAG.考虑按题意模拟:建反图(边从后选的点连向先选的点),每次找全 ...

  3. Oracle生成ASH报告

    1.ASH (Active SessionHistory) ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成. v ...

  4. git创建公钥匙

    目的: 使用SSH公钥可以让你在你的电脑和码云通讯的时候使用安全连接(git的remote要使用SSH地址) 1.打开终端进入.ssh目录输入当下命令 cd ~/.ssh 如果.ssh文件夹不存在,执 ...

  5. OOM和SOF代码

    OutOfMemoryError大数组,例如图片加载. public class MockOutOfMemoryError { public static void main(String[] arg ...

  6. activemq 笔记

    官网下载好后,修改下conf下activemq.xml配置文件就可以了. 主要将这里的ip改成我们这里用的locahost就可以了: <transportConnectors> <! ...

  7. material of DeepLearning

    下面这个链接是深度学习相关的资料,内含很多dl的链接资料: http://blog.csdn.net/augusdi/article/details/20238157 MIT Deep Learnin ...

  8. LibUsbDotNet使用方法

    最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便. LibUsbDotNet ...

  9. 如何让css与js分离

    在 webpack 我们如何让 css 与 js 分离: 我们需要安装插件:extract-text-webpack-plugin 1. 用:npm 下载插件 npm install extract- ...

  10. 从 sourcemap 中获取源码

    使用 paazmaya/shuji: Reverse engineering JavaScript and CSS sources from sourcemaps 可以从 sourcemap 中获取源 ...