攻防世界--game
题目链接:https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074
准备
打开测试用例
首先分析程序
得到是win32程序
第一种方法
分析代码
使用IDA打开,找到main函数,F5得到C代码
得知主要是main_0这个函数,打开
"If m of the Nth lamp is 1,it's on ,if not it's off\n"
"At first all the lights were closed\n");
sub_45A7BE("Now you can input n to change its state\n");
sub_45A7BE(
"But you should pay attention to one thing,if you change the state of the Nth lamp,the state of (N-1)th and (N+1)th w"
"ill be changed too\n");
sub_45A7BE("When all lamps are on,flag will appear\n");
sub_45A7BE("Now,input n \n");
while ( )
{
while ( )
{
sub_45A7BE("input n,n(1-8)\n");
sub_459418();
sub_45A7BE("n=");
sub_4596D4("%d", &v1);
sub_45A7BE("\n");
if ( v1 >= && v1 <= )
break;
sub_45A7BE("sorry,n error,try again\n");
}
if ( v1 )
{
sub_4576D6(v1 - );
}
else
{
for ( i = ; i < ; ++i )
{
if ( (unsigned int)i >= )
j____report_rangecheckfailure();
byte_532E28[i] = ;
}
}
j__system("CLS");
sub_458054();
if ( byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] == )
{
sub_457AB4();
}
}
}
通过
if ( byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] == )
判断出我们需要将这八个数组的值都变为1,也就是8盏灯都闭合。
分析规则
打开sub_4576D6(v1 - 1);函数
bool __cdecl sub_45E640(int a1)
{
bool result; // al if ( a1 )
{
if ( a1 == )
{
byte_532E28[] = byte_532E28[] == ;
byte_532E27[] = byte_532E27[] == ;
result = ;
byte_532E28[] = byte_532E28[] == ;
}
else
{
byte_532E28[a1] = byte_532E28[a1] == ;
byte_532E27[a1] = byte_532E27[a1] == ;
result = byte_532E29[a1] == ;
byte_532E29[a1] = result;
}
}
else
{
byte_532E28[] = byte_532E28[] == ;
byte_532E29[] = byte_532E29[] == ;
result = ;
byte_532E28[] = byte_532E28[] == ;
}
return result;
}
分析得到按键与电路闭合的关系:
- 按1--闭合1,2,8
- 按8--闭合1,7,8
- 按i(除1,8)--闭合i-1,i,i+1
暴力破解
由此并结合C,汇编代码我们写出暴力破解的C++代码:
#include <iostream>
#include <vector> using namespace std; #define for(a,b,c) for(int a = b; a < c; ++a)
#define N 8 vector<int> flag(,-); void func(int *arr){
for(i,,N){
int n = arr[i];
if(n == ){
flag[] *= -;
flag[] *= -;
flag[] *= -;
}else{
if(n == ){
flag[] *= -;
flag[] *= -;
flag[] *= -;
}else{
flag[n] *= -;
flag[n-] *= -;
flag[n+] *= -;
}
}
}
} bool Judge(){
for(i,,)
if(flag[i] == -)
return false; return true;
} int main(void)
{
int array[N] = {};
for(i,,)
for(j,,)
for(k,,)
for(m,,)
for(n,,)
for(p,,)
for(q,,)
for(t,,){
array[] = i;
array[] = j;
array[] = k;
array[] = m;
array[] = n;
array[] = p;
array[] = q;
array[] = t;
func(array);
if(Judge()){
cout << "success:" << i+1 << j+1 << k+1 << m+1 << n+1 << p+1 << q+1 << t+1 << endl;
system("PAUSE");
}else{
for(x,,)
fill(flag.begin(), flag.end(), -);
}
} cout << "over!"; system("PAUSE");
return ;
}
get flag!
输入到程序中
第二种方法
分析代码
通过分析代码,我们很容易获知sub_457AB4()就是输出flag的函数
if ( byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] ==
&& byte_532E28[] == )
{
sub_457AB4();
}
int sub_45E940()
{
char v1; // [esp+0h] [ebp-164h]
signed int i; // [esp+D0h] [ebp-94h]
char v3; // [esp+DCh] [ebp-88h]
char v4; // [esp+DDh] [ebp-87h]
char v5; // [esp+DEh] [ebp-86h]
char v6; // [esp+DFh] [ebp-85h]
char v7; // [esp+E0h] [ebp-84h]
char v8; // [esp+E1h] [ebp-83h]
char v9; // [esp+E2h] [ebp-82h]
char v10; // [esp+E3h] [ebp-81h]
char v11; // [esp+E4h] [ebp-80h]
char v12; // [esp+E5h] [ebp-7Fh]
char v13; // [esp+E6h] [ebp-7Eh]
char v14; // [esp+E7h] [ebp-7Dh]
char v15; // [esp+E8h] [ebp-7Ch]
char v16; // [esp+E9h] [ebp-7Bh]
char v17; // [esp+EAh] [ebp-7Ah]
char v18; // [esp+EBh] [ebp-79h]
char v19; // [esp+ECh] [ebp-78h]
char v20; // [esp+EDh] [ebp-77h]
char v21; // [esp+EEh] [ebp-76h]
char v22; // [esp+EFh] [ebp-75h]
char v23; // [esp+F0h] [ebp-74h]
char v24; // [esp+F1h] [ebp-73h]
char v25; // [esp+F2h] [ebp-72h]
char v26; // [esp+F3h] [ebp-71h]
char v27; // [esp+F4h] [ebp-70h]
char v28; // [esp+F5h] [ebp-6Fh]
char v29; // [esp+F6h] [ebp-6Eh]
char v30; // [esp+F7h] [ebp-6Dh]
char v31; // [esp+F8h] [ebp-6Ch]
char v32; // [esp+F9h] [ebp-6Bh]
char v33; // [esp+FAh] [ebp-6Ah]
char v34; // [esp+FBh] [ebp-69h]
char v35; // [esp+FCh] [ebp-68h]
char v36; // [esp+FDh] [ebp-67h]
char v37; // [esp+FEh] [ebp-66h]
char v38; // [esp+FFh] [ebp-65h]
char v39; // [esp+100h] [ebp-64h]
char v40; // [esp+101h] [ebp-63h]
char v41; // [esp+102h] [ebp-62h]
char v42; // [esp+103h] [ebp-61h]
char v43; // [esp+104h] [ebp-60h]
char v44; // [esp+105h] [ebp-5Fh]
char v45; // [esp+106h] [ebp-5Eh]
char v46; // [esp+107h] [ebp-5Dh]
char v47; // [esp+108h] [ebp-5Ch]
char v48; // [esp+109h] [ebp-5Bh]
char v49; // [esp+10Ah] [ebp-5Ah]
char v50; // [esp+10Bh] [ebp-59h]
char v51; // [esp+10Ch] [ebp-58h]
char v52; // [esp+10Dh] [ebp-57h]
char v53; // [esp+10Eh] [ebp-56h]
char v54; // [esp+10Fh] [ebp-55h]
char v55; // [esp+110h] [ebp-54h]
char v56; // [esp+111h] [ebp-53h]
char v57; // [esp+112h] [ebp-52h]
char v58; // [esp+113h] [ebp-51h]
char v59; // [esp+114h] [ebp-50h]
char v60; // [esp+120h] [ebp-44h]
char v61; // [esp+121h] [ebp-43h]
char v62; // [esp+122h] [ebp-42h]
char v63; // [esp+123h] [ebp-41h]
char v64; // [esp+124h] [ebp-40h]
char v65; // [esp+125h] [ebp-3Fh]
char v66; // [esp+126h] [ebp-3Eh]
char v67; // [esp+127h] [ebp-3Dh]
char v68; // [esp+128h] [ebp-3Ch]
char v69; // [esp+129h] [ebp-3Bh]
char v70; // [esp+12Ah] [ebp-3Ah]
char v71; // [esp+12Bh] [ebp-39h]
char v72; // [esp+12Ch] [ebp-38h]
char v73; // [esp+12Dh] [ebp-37h]
char v74; // [esp+12Eh] [ebp-36h]
char v75; // [esp+12Fh] [ebp-35h]
char v76; // [esp+130h] [ebp-34h]
char v77; // [esp+131h] [ebp-33h]
char v78; // [esp+132h] [ebp-32h]
char v79; // [esp+133h] [ebp-31h]
char v80; // [esp+134h] [ebp-30h]
char v81; // [esp+135h] [ebp-2Fh]
char v82; // [esp+136h] [ebp-2Eh]
char v83; // [esp+137h] [ebp-2Dh]
char v84; // [esp+138h] [ebp-2Ch]
char v85; // [esp+139h] [ebp-2Bh]
char v86; // [esp+13Ah] [ebp-2Ah]
char v87; // [esp+13Bh] [ebp-29h]
char v88; // [esp+13Ch] [ebp-28h]
char v89; // [esp+13Dh] [ebp-27h]
char v90; // [esp+13Eh] [ebp-26h]
char v91; // [esp+13Fh] [ebp-25h]
char v92; // [esp+140h] [ebp-24h]
char v93; // [esp+141h] [ebp-23h]
char v94; // [esp+142h] [ebp-22h]
char v95; // [esp+143h] [ebp-21h]
char v96; // [esp+144h] [ebp-20h]
char v97; // [esp+145h] [ebp-1Fh]
char v98; // [esp+146h] [ebp-1Eh]
char v99; // [esp+147h] [ebp-1Dh]
char v100; // [esp+148h] [ebp-1Ch]
char v101; // [esp+149h] [ebp-1Bh]
char v102; // [esp+14Ah] [ebp-1Ah]
char v103; // [esp+14Bh] [ebp-19h]
char v104; // [esp+14Ch] [ebp-18h]
char v105; // [esp+14Dh] [ebp-17h]
char v106; // [esp+14Eh] [ebp-16h]
char v107; // [esp+14Fh] [ebp-15h]
char v108; // [esp+150h] [ebp-14h]
char v109; // [esp+151h] [ebp-13h]
char v110; // [esp+152h] [ebp-12h]
char v111; // [esp+153h] [ebp-11h]
char v112; // [esp+154h] [ebp-10h]
char v113; // [esp+155h] [ebp-Fh]
char v114; // [esp+156h] [ebp-Eh]
char v115; // [esp+157h] [ebp-Dh]
char v116; // [esp+158h] [ebp-Ch] sub_45A7BE((int)"done!!! the flag is ", v1);
v60 = ;
v61 = ;
v62 = ;
v63 = ;
v64 = ;
v65 = ;
v66 = ;
v67 = ;
v68 = ;
v69 = ;
v70 = ;
v71 = ;
v72 = ;
v73 = ;
v74 = ;
v75 = ;
v76 = ;
v77 = ;
v78 = ;
v79 = ;
v80 = ;
v81 = ;
v82 = ;
v83 = ;
v84 = ;
v85 = ;
v86 = ;
v87 = ;
v88 = ;
v89 = ;
v90 = ;
v91 = ;
v92 = ;
v93 = ;
v94 = ;
v95 = ;
v96 = ;
v97 = ;
v98 = ;
v99 = ;
v100 = ;
v101 = ;
v102 = ;
v103 = ;
v104 = ;
v105 = ;
v106 = ;
v107 = ;
v108 = ;
v109 = ;
v110 = ;
v111 = ;
v112 = ;
v113 = ;
v114 = ;
v115 = ;
v116 = ;
v3 = ;
v4 = ;
v5 = ;
v6 = ;
v7 = ;
v8 = ;
v9 = ;
v10 = ;
v11 = ;
v12 = ;
v13 = ;
v14 = ;
v15 = ;
v16 = ;
v17 = ;
v18 = ;
v19 = ;
v20 = ;
v21 = ;
v22 = ;
v23 = ;
v24 = ;
v25 = ;
v26 = ;
v27 = ;
v28 = ;
v29 = ;
v30 = ;
v31 = ;
v32 = ;
v33 = ;
v34 = ;
v35 = ;
v36 = ;
v37 = ;
v38 = ;
v39 = ;
v40 = ;
v41 = ;
v42 = ;
v43 = ;
v44 = ;
v45 = ;
v46 = ;
v47 = ;
v48 = ;
v49 = ;
v50 = ;
v51 = ;
v52 = ;
v53 = ;
v54 = ;
v55 = ;
v56 = ;
v57 = ;
v58 = ;
v59 = ;
for ( i = ; i < 56; ++i )
{
*(&v3 + i) ^= *(&v60 + i);
*(&v3 + i) ^= 0x13u;
}
return sub_45A7BE((int)"%s\n", (unsigned int)&v3);
}
这实际上就是一段经过计算,输出flag的代码,for上面是已知条件,下面进行变换,我们可以转换为Python代码,输出flag
脚本获取flag
arr1 = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32,
1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16, 97, 54, 16, 44,
52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]
arr2 = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49,
83, 108, 94, 108, 84, 6, 96, 83, 44, 121, 104, 110, 32, 95, 117, 101, 99,
123, 127, 119, 96, 48, 107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86,
13, 114, 1, 117, 126, 0] str = '' for i in range(0, 56):
arr2[0 + i] ^= arr1[0 + i]
arr2[0 + i] ^= 0x13
str = str + chr(arr2[i]); print(str)
get flag!
zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
攻防世界--game的更多相关文章
- 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框即可 后来在 ...
随机推荐
- pwd 显示当前所在的工作路径
1.功能说明 pwd命令是“print working directory ”首字母缩写,显示当前目录的绝对路径. 2.语法格式 pwd [option] pwd 选项 3.命令参数 参数 参数说明 ...
- 体验一把haskell
这几天做到PAT一道比较数据大小的题PAT1065,题目不难,应该说是一道送分题,就是开数组,然后模拟人工计算的过程进行计算,再比较下就行.做完之后,联想到haskell的Integer类型是无限大的 ...
- Ubuntu16.04 重新安装误删的某个*.so文件
在使用Ubuntu系统时,如果不小心将某个*.so文件删除,该如何重新安装呢? 如果直接使用命令:sudo apt-get install *.so 可能会报错或者找不到这个*.so文件. 正确 ...
- 【LeetCode】前缀树 trie(共14题)
[208]Implement Trie (Prefix Tree) (2018年11月27日) 实现基本的 trie 树,包括 insert, search, startWith 操作等 api. 题 ...
- 封装 pyinstaller -F -i b.ico excel.py
安装pywin32,可以参考<怎么给python安装pywin32模块?> 一定要注意对应的python版本,否则不能安装. 5怎么给python安装pywin32模块? 2 用命 ...
- linux运维、架构之路-keepalived高可用
一.Keepalived介绍 Keepalived起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能,Ke ...
- 阿里HBase的数据管道设施实践与演进
摘要:第九届中国数据库技术大会,阿里巴巴技术专家孟庆义对阿里HBase的数据管道设施实践与演进进行了讲解.主要从数据导入场景. HBase Bulkload功能.HImporter系统.数据导出场景. ...
- 浅谈MySQL优化
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体 ...
- day26—JavaScript对CSS样式的获取和修改实践
转行学开发,代码100天——2018-04-11 通过JavaScript获取和修改HTML元素及CSS属性是其一个基本功能.对于CSS样式通常有行内样式,外部样式,内嵌样式之分. 如: 行内样式: ...
- eclipse调试debug时出现source not found
eclipse调试debug时出现source not found 在代码中设置了断点,程序调试过程中可以继续运行使用断点,但是看不见程序走到哪了,debug页面出现source not found, ...