实验吧 部分逆向题解

最近搞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