测试文件:https://adworld.xctf.org.cn/media/task/attachments/a5c0e8322d9645468befabddfe0cb51d.exe

1.准备

获取信息

  • 32位文件

2.IDA打开

 int __cdecl main(int argc, const char **argv, const char **envp)
{
unsigned int v3; // edx
unsigned int v4; // ecx
__m128i v5; // xmm1
unsigned int v6; // esi
const __m128i *v7; // eax
__m128i v8; // xmm0
int v9; // eax
char v11; // [esp+0h] [ebp-CCh]
char v12; // [esp+1h] [ebp-CBh]
char v13; // [esp+64h] [ebp-68h]
char v14; // [esp+65h] [ebp-67h]
unsigned int v15; // [esp+C8h] [ebp-4h] printf("please input your flah:");
v11 = ;
memset(&v12, , 0x63u);
scanf("%s", &v11);
v13 = ;
memset(&v14, , 0x63u);
sub_401000(&v15, &v13, (unsigned __int8 *)&v11, strlen(&v11));
v3 = v15;
v4 = ;
if ( v15 )
{
if ( v15 >= 0x10 )
{
v5 = _mm_load_si128((const __m128i *)&xmmword_414F20);// 这部分对我们的结果没有影响
v6 = v15 - (v15 & 0xF);
v7 = (const __m128i *)&v13;
do
{
v8 = _mm_loadu_si128(v7);
v4 += ;
++v7;
_mm_storeu_si128((__m128i *)&v7[-], _mm_xor_si128(v8, v5));
}
while ( v4 < v6 );
}
for ( ; v4 < v3; ++v4 ) // 对每位字符进行异或0x25
*(&v13 + v4) ^= 0x25u;
}
v9 = strcmp(&v13, "you_know_how_to_remove_junk_code");// 处理之后的字符串为"you_know_how_to_remove_junk_code"
if ( v9 )
v9 = -(v9 < ) | ;
if ( v9 )
printf("wrong\n");
else
printf("correct\n");
system("pause");
return ;
}

其中的一些函数解释

__m128i _mm_load_si128 (__m128i *p);
//返回可以存放在代表寄存器的变量中的值,即*p的值 __m128i _mm_load_si128 (__m128i *p);
//返回可以存放在代表寄存器的变量中的值,即*p的值 void _mm_storeu_si128 ( __m128i *p, __m128i a);
//将__m128i 变量a的值存储到p所指定的变量中去;

3.代码分析

这道题思路很清晰,就是逆向操作结果字符串就行。

我们输入v11,在下面有个关键的sub_401000(&v15, &v13, (unsigned __int8 *)&v11, strlen(&v11));函数

 signed int __usercall sub_401000@<eax>(unsigned int *a1@<edx>, _BYTE *a2@<ecx>, unsigned __int8 *a3, unsigned int a4)
{
int v4; // ebx
unsigned int v5; // eax
int v6; // ecx
unsigned __int8 *v7; // edi
int v8; // edx
bool v9; // zf
unsigned __int8 v10; // cl
char v11; // cl
_BYTE *v12; // esi
unsigned int v13; // ecx
int v14; // ebx
unsigned __int8 v15; // cl
char v16; // dl
_BYTE *v18; // [esp+Ch] [ebp-Ch]
unsigned int *v19; // [esp+10h] [ebp-8h]
int v20; // [esp+14h] [ebp-4h]
unsigned int v21; // [esp+14h] [ebp-4h]
int i; // [esp+24h] [ebp+Ch] v4 = ;
v18 = a2;
v5 = ;
v6 = ;
v19 = a1;
v20 = ;
if ( !a4 )
return ;
v7 = a3;
do
{
v8 = ;
v9 = v5 == a4;
if ( v5 < a4 )
{
do
{
if ( a3[v5] != )
break;
++v5;
++v8;
}
while ( v5 < a4 );
v9 = v5 == a4;
}
if ( v9 )
break;
if ( a4 - v5 >= && a3[v5] == && a3[v5 + ] == || (v10 = a3[v5], v10 == ) )
{
v6 = v20;
}
else
{
if ( v8 )
return ;
if ( v10 == && (unsigned int)++v4 > )
return ;
if ( v10 > 0x7Fu )
return ;
v11 = byte_414E40[v10];
if ( v11 == || (unsigned __int8)v11 < 0x40u && v4 )
return ;
v6 = v20++ + ;
}
++v5;
}
while ( v5 < a4 );
if ( !v6 )
return ;
v12 = v18;
v13 = ((unsigned int)( * v6 + ) >> ) - v4;
if ( v18 && *v19 >= v13 )
{
v21 = ;
v14 = ;
for ( i = ; v5; --v5 )
{
v15 = *v7;
if ( *v7 != && v15 != && v15 != )
{
v16 = byte_414E40[v15];
v21 -= v16 == ;
v14 = v16 & 0x3F | (v14 << );
if ( ++i == )
{
i = ;
if ( v21 )
*v12++ = BYTE2(v14);
if ( v21 > )
*v12++ = BYTE1(v14);
if ( v21 > )
*v12++ = v14;
}
}
++v7;
}
*v19 = v12 - v18;
return ;
}
*v19 = v13;
return -;
}

对于这段函数实际上是base64解密,关键代码在于

 if ( v18 && *v19 >= v13 )
{
v21 = ;
v14 = ;
for ( i = ; v5; --v5 )
{
v15 = *v7;
if ( *v7 != && v15 != && v15 != )
{
v16 = byte_414E40[v15];
v21 -= v16 == ;
v14 = v16 & 0x3F | (v14 << );
if ( ++i == ) // 4字节为一组处理
{
i = ;
if ( v21 ) // 分为3字节输出
*v12++ = BYTE2(v14);
if ( v21 > )
*v12++ = BYTE1(v14);
if ( v21 > )
*v12++ = v14;
}
}
++v7;
}

要了解base64加密原理可以看:https://www.cnblogs.com/Mayfly-nymph/p/11644823.html

解密代码可以看:https://blog.csdn.net/prsniper/article/details/7097643

byte_414E40

00414E40  7F 7F 7F 7F 7F 7F 7F 7F  7F 7F 7F 7F 7F 7F 7F 7F  ................
00414E50 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F ................
00414E60 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 3E 7F 7F 7F 3F ...........>...?
00414E70 3A 3B 3C 3D 7F 7F 7F 7F 7F :;<=...@..
00414E80 7F 0A 0B 0C 0D 0E ................
00414E90 0F 7F 7F 7F 7F 7F ................
00414EA0 7F 1A 1B 1C 1D 1E 1F ....... !"#$%&'(
00414EB0 29 2A 2B 2C 2D 2E 2F 30 31 32 33 7F 7F 7F 7F 7F )*+,-./0123.....

也可以猜测是base64相关的操作

4.脚本解密

import base64

str1='you_know_how_to_remove_junk_code'

flag=''

for i in str1:
flag += chr(ord(i)^0x25) print(base64.b64encode(flag))

5.get flag!

XEpQek5LSlJ6TUpSelFKeldASEpTQHpPUEtOekZKQUA=

攻防世界--ReverseMe-120的更多相关文章

  1. CTF--web 攻防世界web题 robots backup

    攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...

  2. CTF--web 攻防世界web题 get_post

    攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...

  3. 攻防世界 web进阶练习 NewsCenter

    攻防世界 web进阶练习 NewsCenter   题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...

  4. 【攻防世界】高手进阶 pwn200 WP

    题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...

  5. XCTF攻防世界Web之WriteUp

    XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...

  6. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  7. 攻防世界 robots题

    来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...

  8. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

  9. CTF -攻防世界-crypto新手区(5~11)

    easy_RSA 首先如果你没有密码学基础是得去恶补一下的 然后步骤是先算出欧拉函数 之后提交注意是cyberpeace{********}这样的 ,博主以为是flag{}耽误了很长时间  明明没算错 ...

  10. 攻防世界web新手区做题记录

    学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...

随机推荐

  1. vue的.sync 修饰符

    很多时候,我们会对 prop (父子组件传递数据的属性) 进行“双向绑定” 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的值时,这个变化也会 ...

  2. LeetCode--102--二叉树的层次遍历(python)

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3    / \  9 20  / \ 15 7 ...

  3. ExoPlayer + 边缓存边播放

    在此基础上改动:https://www.cnblogs.com/candyzhmm/p/9957928.html private void openPlayer(String videoUrl) { ...

  4. 【bzoj2064】【分裂】状态压缩表示合并子集

    (上不了p站我要死了,画师当然是wlop大大啦) 感觉这个做法还是挺难想的. 但还是总结一下思路吧.. "只可意会不可言传的状压dp"(乱说) Description 背景: 和久 ...

  5. window cmd 命令行下创建文件夹和文件

    新建文件夹命令: makedir 文件名 新建文件命令: type null> 文件名.文件类型 链接

  6. 常见的七种Hadoop和Spark项目案例

    常见的七种Hadoop和Spark项目案例 有一句古老的格言是这样说的,如果你向某人提供你的全部支持和金融支持去做一些不同的和创新的事情,他们最终却会做别人正在做的事情.如比较火爆的Hadoop.Sp ...

  7. python开发环境准备

    python 以版本众多,包之间依赖复杂而著称,所以一个趁手的开发环境还是很有必要的. 我的建议是用Anaconda做环境隔离.包管理,PyCharm做项目开发,jupyter做笔记,ipython和 ...

  8. fedora23解决gedit和vim中文乱码的问题

    fedora23解决gedit和vim中文乱码的问题 a, an, the这些不定/定 冠词并不是在所有的名词 前面都要加. 只有在语义上需要时,才加. 名词的单数/复数 前面不加 冠词的 例子多的是 ...

  9. leetcode 46 全排列 (python)

    给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] ...

  10. mysql慢查询解析-linux命令

    使用mysqldumpslow 命令可以解析mysql慢查询日志,mysqldumpslow的参数如下: -s ,是按照任何方式排序,c.t.l.r分别是按照记录次数.时间.查询时间.返回的记录数 来 ...