攻防世界--ReverseMe-120
测试文件: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的更多相关文章
- CTF--web 攻防世界web题 robots backup
攻防世界web题 robots https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=506 ...
- CTF--web 攻防世界web题 get_post
攻防世界web题 get_post https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5 ...
- 攻防世界 web进阶练习 NewsCenter
攻防世界 web进阶练习 NewsCenter 题目是NewsCenter,没有提示信息.打开题目,有一处搜索框,搜索新闻.考虑xss或sql注入,随便输入一个abc,没有任何搜索结果,页面也没有 ...
- 【攻防世界】高手进阶 pwn200 WP
题目链接 PWN200 题目和JarvisOJ level4很像 检查保护 利用checksec --file pwn200可以看到开启了NX防护 静态反编译结构 Main函数反编译结果如下 int ...
- XCTF攻防世界Web之WriteUp
XCTF攻防世界Web之WriteUp 0x00 准备 [内容] 在xctf官网注册账号,即可食用. [目录] 目录 0x01 view-source2 0x02 get post3 0x03 rob ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
- 攻防世界 robots题
来自攻防世界 robots [原理] robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在, ...
- 【攻防世界】 高手进阶区 Recho WP
0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...
- CTF -攻防世界-crypto新手区(5~11)
easy_RSA 首先如果你没有密码学基础是得去恶补一下的 然后步骤是先算出欧拉函数 之后提交注意是cyberpeace{********}这样的 ,博主以为是flag{}耽误了很长时间 明明没算错 ...
- 攻防世界web新手区做题记录
学校信安协会第一次培训结束后的作业,要求把攻防世界的web新手区题目做一遍并写题解. 第一题 view_source 查看源代码右键不能用,但是F12能用,于是找到源代码 输入到flag框即可 后来在 ...
随机推荐
- vue addRoutes路由动态加载
需求:增加权限控制,实现不同角色显示不同的路由导航 思路:每次登陆后请求接口返回当前角色路由 核心方法:vue-router2.2.0的addRoutes方法 + vuex 以下是我实现的获取菜单路由 ...
- 千呼万唤始出来——DataV私有部署功能
DataV的开发者们,今天进入你的用户中心,就会发现有一个小惊喜默默的在等待着你.那就是——私有部署功能上线啦! 一直以来私有部署都是一些有需要的小伙伴所望尘莫及的,毕竟高贵的身份摆在那里,现在不用再 ...
- HDU 6230 Palindrome ( Manacher && 树状数组)
题意 : 给定一个字符串S,问你有多少长度为 n 的子串满足 S[i]=S[2n−i]=S[2n+i−2] (1≤i≤n) 参考自 ==> 博客 分析 : 可以看出满足题目要求的特殊回文子串其 ...
- 软件安装——internal error2503/2502
安装新的软件后先报internal error 2503,随后报internal error 2502.就是不让我装新的软件,提示说发生严重错误,然后安装失败. Solution for intern ...
- 【bzoj1398】Vijos1382寻找主人 Necklace
*题目描述: 给定两个项链的表示,判断他们是否可能是一条项链. *输入: 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). *输出: 如果两条项链不可能同 ...
- 「HNOI2016」矿区
https://loj.ac/problem/2052 题解 平面图转对偶图.. 首先我们转的话需要给所有的平面标号,然后找到每条边看看他们隔开了哪两个平面. 做法就是对每个点维护它的所有排好序的出边 ...
- git本地文件提交
一.github在线上传文件夹 1.点击上传文件 2 .直接拖拽 直接拖拽即可上传文件夹及文件夹里面的文件.如果点击 choose your files 就只能上传单个文件. 二.通过git工具上传本 ...
- 11 November
Weakness 求数列区间 \(\{a_n\}\) 中满足 \(i < j < k, a_i > a_j > a_k\) 的 \((i, j, k)\) 对的数目. 设对 \ ...
- 深入探究JVM(1) - Java的内存区域解析
http://blog.csdn.net/sczyh22/article/details/46652901<br>Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这 ...
- 【C++进阶:STL常见性质】
STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac) 转载自:https://blog.csdn.net/u0134 ...