2017第二届广东省强网杯线上赛--Nonstandard
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)
这段加密方式是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的更多相关文章
- 2017第二届广东省强网杯线上赛:WEB phone number (SQL注入)
		
目录 解题思路 总结 解题思路 拿到题目的时候,只有一个登录界面 拿到登录界面,而且还伴随着有注册界面,联想到SQL的二次注入漏洞 尝试注册admin'#,并使用admin登录,发现登录失败,说明可能 ...
 - 2017年第二届广东省强网杯线上赛WEB:Musee de X writeup(模板注入漏洞)
		
目录 解题思路 总结 解题思路 拿到手上,有四个页面 首先按照题目要求执行,尝试注册一个名为admin的账户 这种情况,路径都给出来了,很可能就是目录遍历或者文件上传了 回到初始界面,点击链接here ...
 - 2019 第三届强网杯线上赛部分web复现
		
0x00前言 周末打了强网杯,队伍只做得出来6道签到题,web有三道我仔细研究了但是没有最终做出来,赛后有在群里看到其他师傅提供了writeup和环境复现的docker环境,于是跟着学习一波并记录下来 ...
 - 庞果英雄会第二届在线编程大赛·线上初赛:AB数
		
题目链接 给定两个正整数a,b,分别定义两个集合L和R, 集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 <= x <=a , 1 <= ...
 - RobotCraft 2017 第二届国际机器人学暑期学校 2nd Edition of International Robotics Summer School
		
原文网址:http://www.ros.org/news/2017/02/2nd-edition-of-international-robotics-summer-school-robotcraft- ...
 - 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
		
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
 - 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛  F题 Clever King(最小割)
		
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
 - “玲珑杯”线上赛 Round #17 河南专场
		
闲来无事呆在寝室打打题,没有想到还有中奖这种操作,超开心的 玲珑杯”线上赛 Round #17 河南专场 Start Time:2017-06-24 12:00:00 End Time:2017-06 ...
 - 2021广东省强网杯WriteUp
		
个人赛 网络诈骗 参考 https://github.com/Heyxk/notes/issues/1 先把EnMicroMsg.db提出来 CompatibleInfo.cfg是0kb,用第一种方法 ...
 
随机推荐
- 6.Python缩进规则(包含快捷键)
			
和其它程序设计语言(如 Java.C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次. 在 Python 中,对于类定义.函数定义.流程控制语 ...
 - Spring Data Jpa (二)JPA基础查询
			
介绍Spring Data Common里面的公用基本方法 (1)Spring Data Common的Repository Repository位于Spring Data Common的lib里面, ...
 - wannafly 挑战赛9 E 组一组 (差分约束)
			
链接:https://www.nowcoder.com/acm/contest/71/E 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言131072K Spec ...
 - 测试常用命令之awk篇
			
awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...
 - [LeetCode]-algorithms-Longest Substring Without Repeating Characters
			
Given a string, find the length of the longest substring without repeating characters. For example, ...
 - ES排序值相同顺序随机的问题
			
ES排序值相同顺序随机的问题 code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: ...
 - @清晰掉 spi协议及工作原理分析
			
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...
 - LibUsbDotNet使用方法
			
最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便. LibUsbDotNet ...
 - 常见iPhone设备尺寸及分辨率(持续更新)
			
开发中常用的px与pt区别 px就是表示pixel,像素,是屏幕上显示数据的最基本的点: pt就是point,是印刷行业常用单位,等于1/72英寸. px全称为pixel,是一个点,它不是自然界的长度 ...
 - 【c++进阶:c++ 顺序容器vector,string,deque,list,forward_list,array常用性质】
			
常用5种顺序容器性质: https://blog.csdn.net/oil_you/article/details/82821833 关于deque https://www.cnblogs.com/L ...