Welcome to http://aiqg.vip/
我才不写WP
==Difficulty: Easy==
逆向第一步,学好汇编,16位的也要学
// 64位系统运行需要DosBox
==Author: acdxvfsvd==
读十六位汇编
程序很小基本一目了然
运行有打印字符(call了一个打印函数)
有等待输入的函数(call了一个输入函数)
能猜测下一个函数就是check函数,进去
逐个取输入字符进行运算然后对比结果(向上翻一下就能看见)
for c in str:
print(chr((c<<3)+(c>>5),end='')
==Difficulty: Very Easy==
IDA了解一下
==Author: MozhuCY==
==Difficulty: medium==
这只兔子不会抖脸的
nc ctfgame.acdxvfsvd.net 30010
==Author: MozhuCY==
//给了nc 我还以为是打pwn…
看到有对几个字符的判断 猜测是迷宫之类的东西
cat flag之前判断了两处
然而找到的地图只是一串奇怪的字符
尝试着跑起来看看程序干了什么
发现地图变成了只有8、0和两个0x14的字符串
复制出来整理一下
//黄色的是起始位置, oo 是箱子, x14 是要把箱子推到的地方
在打印兔子脸之前初始化了两个箱子和起始位置
分析每个分支函数的第一句代码可以知道 'W’向上, '4’向左, '5’向下, '0’向右
然后看着地图推箱子就行了
==Difficulty: Easy++==
This is fundamental.
==Author: acdxvfsvd==
打开发现main函数中有两个strcmp 密文都已经给了
发现转换的函数(sub_400666、sub_4006BE)是两个迭代的函数,都是将input中的字符一个个放进待对比的字符串中
那我们反过来跑一下就好了
#include
using namespace std;
char s1[]="bcec8d7dcda25d91ed3e0b720cbb6cf202b09fedbc3e017774273ef5d5581794";
char s2[]="7d8dcdcaed592e1dcb07e02c36bcb2f0bf9e0bdcb0e13777237e25fd48515974";
char input1[100]={0};
int i1=0;
unsigned int func1(unsigned int a)
{
int result;
int v1=0;
if(a<=63)
{
v1=i1++;
input1[a]=s1[v1];
func1(2 * a + 1);
result = func1(2 * (a + 1));
}
return result;
}
int i2=0;
unsigned int func2(int a, int b)
{
int v2;
int result;
if(a<=63)
{
func2((2 * a + 1), b);
v2 = i2++;
input1[a]=s2[v2];
result=func2((2 * (a + 1)), b);
}
return result;
}
int main()
{
func1(0);
cout<<input1<<endl;
func2(0, 0);
cout<<input1<<endl;
return 0;
}
==Difficulty: Hard==
==Author: MozhuCY==
很经典的vm
指令集在 sub_400DAB中
运算指令在下半部分
至于它会怎么运算…
随便输入一串字符开始调试
断点下在add sub xor or and mul 和check处
得到调用运算的顺序与参数
input *0x6E +0x63 ^0x74 +0x66从左到右计算得到密文
密文就是dword_6020A0处的数组
脚本反着跑一遍就好
==DIfficulty: medium==
郁离歌!郁离歌!
flag是一串有意义的字符
==Author: ccc==
一个压缩包, 有密码里面有一个txt, 提示了密码是wcy_____ (后面是5个字节)
(cchan: 开始结束后面都要填5个空格占位)
压缩包打开后是一百张看似一样的gif //要是全都一样还藏什么flag
对比文件的md5
文件md5对比
挑出了十五张不同的图片
图片每帧的速度显然不同
用identify 查看每帧时间
将20作为二进制的1
将10作为二进制的0
正好八位一个字节
转换得到flag
import os
result = ''
for root,dirs,files in os.walk('.'):
for file in files:
if file[-4:] == '.gif':
v = 0
for i in os.popen('identify -format "%T\n" ' + file).read()[:-1].split('\n'):
v <<= 1
if i == '0':
break
v |= ord(i[0]) - 49
if v != 0:
result += chr(v)
print result
#脚本by cchan