BUU[羊城杯 2020]easyre
BUU[羊城杯 2020]easyre分析首先查壳,发现是无壳64位的,放入对应的IDA分析
可以看到,这里是只有那个if语句不成立才能得到到flag,于是去看一下那三个encode函数
第一个encode
这里看到这些地方,猜测是base64,于是去一下alphabet函数看一下码表
就是普通的base64
第二个encode
发现是将编码后的字符串以13个一组的换位置
第三个encode
这里看到先减去48(0) 97(a) 65(A)再位移三位然后除于再加到原来的大小写,很容易得出这是移三位的凯撒密码
脚本import base64data='EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG'data1=''for i in data:#凯撒密码部分解密 if ord(i)>=48 and ord(i)<=57: data1 += chr((ord(i)-3-48)%10+48) elif ord(i)>=65 and ord(i)<=90: data1 ...
ACTF新生赛2020 easyre
[ACTF新生赛2020]easyre分析收先查壳,发现是32位的,然后放入对应的IDA去看看
然后去看看_data_start_数组中的内容
整体逻辑十分简单,就相当于是在_data_start__数组中输入我们的数组-1,如果与v4数组相同就是正确的值。
脚本#include<stdio.h>#include<string.h>int main(){ char v4[]={42, 70, 39, 34, 78, 44, 34, 40, 73, 63, 43, 64} ; char v5[]={ 0x7e, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60, 0x5F, 0x5E, 0x5D, 0x5C ...
BUU--BabyAlgorithm
BUU–BabyAlgorithm分析首先用工具查壳看是否有壳
发现这是个64位无壳的文件,于是用IDA进行静态分析
如果要得到flag就要是数组v7与数组v8相等
sub_400874函数调用了v7我们进入sub_400874函数看它在干嘛
sub_40067A发现这是一个生产密匙流的函数,然后看看sub_400646函数在干嘛
这里是交换的意思然后退出去看看sub_400753函数在干嘛
这是进行了加密运算,也就是说我们可以从这里得到flag
flag也就是密文去异或密匙流得到的明文
脚本#include<stdio.h>void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len_k)//流密匙的生成 (也就是新的s盒生产,它由密钥和与原s盒生成) { //需要输入s表,密匙,密匙长度 int i = 0, j = 0; char k[ ...
BUU--findKey
BUU–findKey分析首先查壳,发现是32位无壳的,然后放入IDA中看看,直接shift+12去找关键点
对它进行交叉引用,去看看这个程序要干嘛
这里发现,它这里有两个一样的语句,直接nop掉一句,再声明一下就可以反汇编了
整个看起来很复杂,但是有用的也就那几个
简单分析之后可以知道有用的部分只有sub_40101E函数和sub_401005这两个函数,其中sub_401005这个函数用了两次,首先去sub_40101E函数看看它在干嘛
再结合函数库
能明白这里是一个哈希加密的东西。
然后去sub_401005函数看看在干嘛
这是一个很简单的异或。整体的逻辑也就是要得到第二个消息盒所得到的值。首先要通过第一个异或得到第二个异或需要用的东西,再通过第二个异或得到flag。
脚本#include<stdio.h>#include<string.h>int main(){ char Str[]="0kk`d1a`55k222k2a776jbfgd`06cjjb"; char v15[]="SS"; in ...
网鼎杯2020青龙组 singal
[网鼎杯 2020 青龙组]singal分析首先查壳,发现32位无壳,进入IDA看看
看到vm_operad这个函数名字就明白它可能是一个vm逆向,接着很容易知道主要的内容是在vm_operad函数中。
然后点进去看看它在干嘛,一路看下来找到两个特殊的输出
点金read函数中看看是什么
这里很容易知道这个输入是15个字符
由前面的
这个函数,知道v4的取值在unk_403040中取456位。
脚本然后我们将它跑一下,看看它的索引顺序和加密后的内容是什么
#include<string.h>#include<stdio.h>unsigned char opcode[] ={ 0x0A, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, ...