auctf
starts 4/3/2020 at 8:00 AM CST and ends 4/5/2020 at 11:00 PM CST

ti_83_beta

这个题本来没有一点头绪,后来在里面字符串看见两个不一样的字符串,merr derr,输入之后会出现under construction,觉得这句很可疑,去交叉引用看了一下,看见了一个atoi,是把字符串转换成整型数的一个函数,尝试输入之后,flag蹦出来了。。。

看了wp发现不是这么回事,merr是整数乘法,derr是整数除法,前面用div除法是浮点数所以可以除0,但是整数除0不行,这个程序作者把flag放在了除零异常里,在里面有一点点混淆处理,OD走异常走不过去,用IDA就可以了

flag:auctf{oops_did_i_do_tht}


dont_break_me_

首先看到了反debug 这个好操作点进那个call,直接修补ret就好了

贴一下encrypet

1
2
3
4
5
6
7
8
for ( i = 0; strlen(s) > i; ++i )
{
if ( s[i] == ' ' )
v5[i] = s[i];
else
v5[i] = (a2 * (s[i] - 65) + a3) % 26 + 65;//这个%表明不能从这里解密
}
return v5;

main的分析到此为止了,那么只能去看别的地方了

然后就发现了一个奇怪的call,为什么呢,因为没有被引用到

里面还有个inverse 贴一下

1
2
3
4
5
6
7
v3 = 0;
for ( i = 0; i <= 25; ++i )
{
if ( i * a1 % 26 == 1 )
v3 = i;
}
return v3;

然后把这里的解密带进去发现出现了明文 IKILLWITHMYHEART

然后开开心心的去服务器上的程序交,开开心心的得到了flag

贴一下exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
char key[]="SASRRWSXBIEBCMPX";//这是动态内存里找到的key

int v3;
for ( int i = 0; i <= 25; ++i )
{
if ( i * 17 % 26 == 1 )
v3 = i;
}//这是inverse

for(int i=0;key[i];i++)
key[i] = v3* (key[i]+65-12)% 26 + 65 ;//decrypt直接照抄
printf("%s",key);
//auctf{static_or_dyn@mIc?_12923}
} //a2=17 a3=12

flag:auctf{static_or_dyn@mIc?_12923}


chestburster

这道题目输入假码后跟踪发现把假码换位置之后,把假码换了个位置,再去与welcome_to_the_jungle!比较,那么把这个字符串按他换位置的顺序换一下就可以得到key了

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
char a[]="welcome_to_the_jungle!";
char b[]={5,11,0,6,12,1,7,13,21,2,8,14,20,19,3,9,15,18,17,16,4,10};
char flag[100]={0};
for(int i=0;i<22;i++)
{
flag[b[i]] = a[i];
}
printf("%s",flag);
} //lmo_ewce_j!eo_tulgneht

然而事情并没有这么简单,连上服务器交了以后让我去另一个地方

结果这个地方啥也找不到

然后到这里就没得了思路

好了现在看了wp,简单讲讲吧

如wp所说,用binwalk发现里面有两个PE,再用winhex把9392后面的全部复制到一个新的文件,然后cmd打开提示输入IP和PORT,这个就是输入challenges.suctf.com:30009,然后再用Wireshark分析该文件与网址端口的交互就可以了,就可以了,就可以了.


cracker_barrel

这个题,题目标的很清晰了

check里面check_1,check_2,check_3

cheak_1

check_2就一句话

1
*(_BYTE *)(i + input) = key_[v3 - 1 - i];

cheeck_3

前面还有个key是直接在内存里面找的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
char key1[]="si siht egassem terces";
char flag1[100]={0};
for(int i=0;i<22;i++)
flag1[i]=key1[22-1-i];
printf("%s\n",flag1);

char flag2[100]={0};
char key2[]="z!!b6~wn&`";
for(int i=0;i<10;i++)
{
flag2[i] = (key2[i]^0x14)-2;
}
printf("%s",flag2);
}

starwars

secret message this is

l33t hax0r

flag我没得,做完得时候服务器关了

sora

这个题结构十分清晰

encrypt也很简单

1
if ( (8 * *(i + a1) + 19) % 61 + 65 != secret[i] )

从secret反推是不行的

那就正推

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
char key[]="aQLpavpKQcCVpfcg";
char flag[100];
for(int i=0;key[i];i++)
for(int j=' ';j<'}';j++)
if(((8*j+0x13)%0x3D)+65==key[i])
{
flag[i]=j;
break;//开始没有break出现奇怪的东西
}//"我们要相信IDA"自己的问题不要甩给IDA~
printf("%s",flag);
}

75<”72”%5($.”0(

flag忘记了,反正也没啥用

文章作者: Usher
文章链接: https://usher2008.github.io/2020/04/06/auctf/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Usher