最近看pwn的堆 还有其它的题看的很是自闭 然后打算看看 简单的ctf平台是刷一下
逆向部分:
第一题 简单逆向
这个题名副其实 是简单逆向
flag{db2f62a36a018bce28e46d976e3f9864}
第二题 安卓加密
安卓题 拖入 看 java反编译的源码
去找check2
str1=goodluck 那么一目了然
写出脚本
# coding: UTF-8
if __name__ =='__main__':
str1='goodluck'
flag=""
l=[15, 10, 3, 8, 3, 89, 20, 4, 21, 3, 11, 20, 30, 16, 16, 24]
for i in range(len(l)):
flag+=chr(l[i]^ord(str1[i%len(str1)]))
print(flag)
whaleCTF{hello,worldpress}
第三题 不可能完成的使命
dump文件 直接去 010里面是搜索 然后 找到flag
BITCTF{B4d_bad_U5B}
第四题 风险和回报
这个题 一开始以为是加壳的 后来 发现不是 然后ida 打开也是 byte file 一开始很懵 然后我试着用010 瞅瞅
然后看到了这里
猜测是 数据段 ~~~~ 但是 不知道内容怎么处理
然后搜索到了这篇博客 恍然大悟。。。https://blog.csdn.net/xiangshangbashaonian/article/details/82867698
后面的是index 。。
# coding: UTF-8
str1='tjb3csFt0rrutrh_wiv5__fi}k_1ih`{xIcrhsoyBmyw1CyT3rvxStT_jq40_zrq'
mapp=[0x28,0x21,0x2f,0x34,0x2d,0x36,0x06,0x1f,0x25,0x3b,0x29,0x03,0x37,0x3e,0x1b,0x05,0x22,0x13,0x14,0x3a,0x31,0x30,0x1a,0x10,0x08,0x23,0x07,0x24,0x3c,0x2c,0x00,0x18]
if __name__ =='__main__':
flag=""
for i in mapp:
flag+=str1[i]
print(flag)
BITSCTF{s0m3_r1sc5_4r3_w0rth_1t}
第五题 还是比较 好玩的
有个反调试 但是这个反调试 随便一个反调试od插件 应该就能破除 然后还有一个time 来辨别 被调试的时间
如果时间如果超过2s 得出的答案还是不对。。。。。。。。。 其实有两个办法
第一个就是硬核分析算法 第二个就是改跳转
把这里的if 去掉应该就行
这里是判断时间之一改变了xornum 那么就会改变 最后的结果
整体上还是很简单的
有两个异或点 一个是xornum 一个是一开始
程序的流程就是 str1异或v90 异或xornum 然后在异或str2 str2 就是我们要的flag
这道题还是比较灵性的
下面是脚本
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<time.h>
#include <stdlib.h>
#include<windows.h>
char str1[] =
{
0x02, 0x37, 0x0F, 0x35, 0x0F, 0x3C, 0x15, 0x07, 0x3C, 0x30,
0x2A, 0x30, 0x55, 0x12, 0x37, 0x15, 0x1E, 0x35, 0x01, 0x51,
0x00
};
char str2[] =
{
0x13, 0x21, 0x38, 0x15, 0x3D, 0x33, 0x57, 0x47, 0x2D, 0x27,
0x6A, 0x73, 0x44, 0x05, 0x26, 0x59, 0x5C, 0x79, 0x17, 0x44,
0x45, 0x77, 0x1A, 0x75, 0x49, 0x7D, 0x05, 0x4A, 0x78, 0x74,
0x6A, 0x70, 0x42, 0x02, 0x71, 0x05, 0x0F, 0x22, 0x08, 0x00
};
using namespace std;
int main()
{
int xor1=16,xor2=100;
int len=strlen(str1);
for(int i=0;i<len;i++)
{
str1[i]^=xor1;
str1[i]^=xor2;
}
int len2=strlen(str2);
int j=0;
for(int i=0;i<len2;i++)
{
str2[i]^=str1[j];
j++;
if(j>=len)
{
j=0;
}
}
printf("%s\n",str2);
return 0;
}
ebCTF{64ec47ece868ba34a425d90044cd2dec}
至于那个0CTF那个 看的头大 就不写了 网上可以搜得到 wp
然后是第二期的 wp
第一个 py逆向
关于py的反编译 有个网站 https://tool.lu/pyc/
得到的结果是
#!/usr/bin/env python
# encoding: utf-8
# 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc
import md5
md5s = [
0x1EBFD5913EF450B92B9E65B6DE09ACADL,
0x1C6B2CF25EB36540376A3B3FA208A9FBL,
0x6696D088517C9390167FEDB2BC876E12L,
0x944891A872A4891002F7CAF24C70FD79L,
0x22D1BDC61CC009B82C178607A3569FD2L,
0x964DE3CD368503D06156731676AFF358L,
0x68B05F0EA56017A63E7255C991FD5D15L,
0x4FBA80ED85D2B50ECE2DD336DA68B220L,
0x4DC6E4668713974D68D44544FA7177C9L,
0x919C5A8E20AE0DA98CA1F673F7AE519DL]
print 'Can you turn me back to python ? ...'
flag = raw_input('well as you wish.. what is the flag: ')
if len(flag) > 50:
print 'nice try'
exit()
if len(flag) % 5 != 0:
print 'nice try'
exit()
for i in range(0, len(flag), 5):
s = flag[i:i + 5]
if int('0x' + md5.new(s).hexdigest(), 16) != md5s[i / 5]:
print 'nice try'
exit()
continue
print 'Congratz now you have the flag'
这样看起来 其实感觉很简单 直接用 网站查询就好 用python 暴力跑的话 。。 太麻烦 而且 很耗费时间
然后 得出的flag 是 whaleCTF{qAxcx2M3gRf3MGRDFZ2aI6FiNC7Mrm3qEQETD1ew}
第二题 这个题我以前在实验吧做过 https://blog.csdn.net/qq_41071646/article/details/89056010 就不详解了
第三题move!move! 这个题是有upx壳的
第四题入门语言 以前也做过。。。 https://blog.csdn.net/qq_41071646/article/details/83314492 也不详解了。。。
第五题 还没有什么思路。。。。 先等我缓一下
第六题 包剪锤 这个题还是简单的啊
起初我看到这个东西感到很迷茫 我并不晓得这个题是怎么搞。。然后再往上看看 会发现
emmmmm 好像不对劲 。。。。
SECCON{ 这里有点像 flag处 然后我们看一下这个东西
那么 再看的话 就会发现其实就很明朗了
(MainActivity.this.cnt + MainActivity.this.calc()) * 107) 这里 cnt的值是1000 那么 就看calc的值了 这个去so库里面看
然后。。。。就对了
SECCON{ 107749} 这个是flag
最后一题的转子检查。。。。 也是实验吧上面的题 也做过 https://blog.csdn.net/qq_41071646/article/details/89056010 这个是链接 。