实验吧 部分逆向题解
最近搞pwn 搞得很自闭 不想看pwn了 准备看点 逆向 准备刷一些实验吧的一些题 来安慰安慰我 pwn不懂的心情!~~~~~
有些题 已经刷过了 我也就不写了 那些刷过的 也没有整理成一篇博客 比较可惜吧
debug
这个题 说起来惭愧
本来我以为 ida f5粘贴复制就行 但是我发现这个根本就不行 然后我进行了限制
j前面本来 我没有加(unsigned __int8) 但是我发现结果跑的不对。。
加上去之后 就对了
太真实了。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int v3[5],k; // [esp+18h] [ebp-20h]
puts("Printing flag");
v3[0] = 0x1686F596;
v3[1] = 0x5646F537;
v3[2] = 0x76765726;
v3[3] = 0x37F52756;
v3[4] = 0xC6C696B6;
for (int i = 0; i <= 4; ++i )
{
for ( int j= v3[i],k=0; k<4; j >>= 8,k++)
{
putchar(((unsigned __int8)j >> 4) | 16 * j);
}
//getchar();
}
putchar(10);
return 0;
}
catalyst-system
参考链接 http://www.shiyanbar.com/ctf/writeup/5026
如果要是知道linux 和windows 的随机数 竟然不一样
我也不会。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
思想了一下 应该是 windows linux 的随机策略不一样 毕竟 随机 有很多 策略
阿西吧 比较可惜吧 这个题我先说我分析到哪里
本来这里我感觉可以了
然后先把username 打印出来
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int username[4];
username[0]= 0x61746163;
username[1]= 0x61746163;
username[2]=0x6F65635F;
printf("%.12s",username);
return 0;
}
然后在求 password 的时候 发现出了问题
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
unsigned int a[14];
srand(0x454D3E2E); //前面解出来的x + y + z
a[0] = 0x55EB052A + rand();
a[1] = 0x0EF76C39 + rand();
a[2] = 0xCC1E2D64 + rand();
a[3] = 0xC7B6C6F5 + rand();
a[4] = 0x26941BFA + rand();
a[5] = 0x260CF0F3 + rand();
a[6] = 0x10D4CAEF + rand();
a[7] = 0xC666E824 + rand();
a[8] = 0xFC89459C + rand();
a[9] = 0x2413073A + rand();
for(int i=0;i<10;i++)
printf("%d:%x\n",i,a[i]);
printf("%.40s",a);
return 0;
}
我 ??????????
什么鬼
然后 看了那篇wp 我才知道我有那么 年轻。。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
unsigned int a[14];
srand(0x454D3E2E); //前面解出来的x + y + z
a[0] = 0x55EB052A + rand();
a[1] = 0x0EF76C39 + rand();
a[2] = 0xCC1E2D64 + rand();
a[3] = 0xC7B6C6F5 + rand();
a[4] = 0x26941BFA + rand();
a[5] = 0x260CF0F3 + rand();
a[6] = 0x10D4CAEF + rand();
a[7] = 0xC666E824 + rand();
a[8] = 0xFC89459C + rand();
a[9] = 0x2413073A + rand();
unsigned char b[] = {0x42, 0x13, 0x27, 0x62, 0x41, 0x35, 0x6b, 0x0f, 0x7b, 0x46, 0x3c, 0x3e, 0x67, 0x0c, 0x08, 0x59, 0x44, 0x72, 0x36, 0x05, 0x0f, 0x15, 0x54, 0x43, 0x38, 0x17, 0x1d, 0x18, 0x08, 0x0e, 0x5c, 0x31, 0x21, 0x16, 0x02, 0x09, 0x18, 0x14, 0x54, 0x59};
for(int i=0;i<10;i++)
printf("%d:%x\n",i,a[i]);
char *aa = (char *)a;
printf("password: %.40s",aa);
printf("\n");
printf("ALEXCTF{");
for (int j = 0 ;j < 40 ;j++){
printf("%c",b[j] ^aa[j]);
}
printf("}\n");
return 0;
}
defcamp
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int s[6];
for(int i=0;i<6;i++)
scanf("%d",&s[i]);
printf("\n");
getchar();
for(int i=0;i<6;i++)
printf("%c",s[i]);
getchar();
return 0;
}
Byte Code 这个题 也是没有什么好讲的 这个题很简单
.class 多半就是java的 然后出现了
然后看程序逻辑 应该就是 如果 输入的字符串等于 ThisIsth3mag1calString4458 就会输入key
那么 key 就是我们的flag。
bitwise
一开始我想的是这个题 暴力跑 可是我发现了 &255 还有 左移右移 的和是 8 我感觉这个算法 还是可以逆一下的
#255 ==11111111 最后结果取 8个二进制 那么
#左移和右移 加起来是8 那么也就相当于 转个圈 最后在和 最后三位 异或一下
#那么逆推回去就是 先异或 111 然后 >>改成<< <<改成>> 即可
这个是我看源代码 给分析出来的
这是跑出来的结果和脚本
#coding:utf-8
if __name__ =='__main__':
verify_arr = [193, 35, 9, 33, 1, 9, 3, 33, 9, 225]
strs=""
for i in verify_arr:
i=i^111
temp=((i>>5)|(i<<3))&255
strs+=chr(temp)
print(strs)
这题算是很简单的
逆向观察
这个题 就更简单了。
逻辑是如此 然后可能不知道 dict 是干啥的
这。。。 应该是一个数组 然后 暴力跑一遍?????? 不过反正我们输入的字符 和他们一样就行了 至于为什么 把我们转化的字符给反转 我感觉应该用ida的导出数据 好一点 不要轻易的 转化就直接用
因为我一开始 就犯了这个错误 。。。
把前面的去掉就可以了
mercedes
回答正确。
1000
这个题 我是尽力了 这道题 做的我怀疑人生 我看着这个flag 不对 想着flag 也不会写到 文本里面 结果
人家 还真的是 然后在后面添加一个Y就行 。。。
1000 要不 是二进制 要不就是10进制 这个我是猜的出来了
但是后面的 我是真的 想不出来竟然是这个样子。 我断下了按钮
获得了 输入框 最后 断下了 writefile。。
唉
G00dTh1sIskeY
迷路
太坑了 花里胡哨的
前面过的 花里胡哨 但是到后面就感觉差了很多 。。。。。。 是真的感觉不行啦
怎么说呢 出题人太骚了 特别是那个 整易语言 我都有点受不了 更别说其他的了 我都不知道 那些大佬是怎么发现这些骚套路的
这个题 我还以为是走方格什么的 。。。。 结果不是 。。。 我硬撸 算法 发现失败了。。。。。。。。。
然后 参考链接
https://blog.****.net/qq_40827990/article/details/83212779
没错
我又看别人的博客了 呜呜呜 我哭了 没有想到 还会有一个按钮
具体看按钮情况 可以用
ShowWindow
来断点 看参数信息
点击 0 改成1就好
然后 就多出了 哪一个按钮 断 点 然后 静态分析就好
发现这里都是直接跑飞的点 断下来 ida 静态分析一波
第一个 函数 限定了他们的flag 格式
第二个 就是 算法了
像 v5 还有 v6 都可以调试调出来
b5h760h64R867618bBwB48BrW92H4w5r
那么可以写一个脚本出来
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<iostream>
using namespace std;
char s[]="b5h760h64R867618bBwB48BrW92H4w5r";
int main()
{
int temp;
printf("OOCTF{");
for(int i=0;i<strlen(s);i++)
{
if(s[i]>=48&&s[i]<=57)
{
printf("%c",s[i]);
continue;
}
if(s[i]>=65&&s[i]<=90)
{
temp=65;
}
else
{
temp=97;
}
for(int j=0;j<26;j++)
{
if((j*5+28)%26==s[i]-temp)
{
printf("%c",j+temp);
}
}
}
printf("}");
return 0;
}
NSCTF Reverse 400
这个题 看着有点像 python打包的exe 文件 以前接触过这种题
工具下载地址
https://sourceforge.net/projects/pyinstallerextractor/
直接试着能不能给直接搞定
哦吼 好像搞定了
然后打开文件夹
选定我光标的那个文件 然后 看一下文件都有什么内容
哇 直接 爆flag 正当我 有点开心的时候
突然发现。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 这个flag 不对
然后 我看了一下后面的算法 逆向了一下
用buf 还有data 都试了一下 结果 data 的对了
#!/usr/bin/env python
# encoding: utf-8
data = \
"\x1c\x7a\x16\x77\x10\x2a\x51\x1f\x4c\x0f\x5b\x1d\x42\x2f\x4b\x7e\x4a\x7a\x4a\x7b" +\
"\x49\x7f\x4a\x7f\x1e\x78\x4c\x75\x10\x28\x18\x2b\x48\x7e\x46\x23\x12\x24\x11\x72" +\
"\x4b\x2e\x1b\x7e\x4f\x2b\x12\x76\x0b"
flag=""
for i in range(len(data)-1):
flag+=chr(ord(data[i]) ^ ord(data[i+1]))
print(flag)
做出来这个题 真的是 巧合
Keylead(ASIS CTF 2015)
这个题 应该算是 简单的了 大致看了一下 我们输入的数据和 解密的函数没有关系 那么直接 修改rip 跳到 解密函数即可
(sub_4006B6) 动态调试一下 就可以
得到flag