DDCTF re1 writeup

下载下来是一个叫做reverse1_final的文件,打开发现是windows x86文件,直接用IDA无法反编译,提示如下

UKpqB2OeJIZb3vQ.png

怀疑被加壳了,拖进PEID里面查看PE信息

hKvQlNxSXUkTfit.png

EP段是UPX1,说明是UPX的壳,下载解压器,拖进去解压得到新的文件,发现新的文件已经无法正常运行,拖入IDA反汇编,先找到main函数,然后一通改名字

1MFEDnXg9UsNBxC.png

发现是对v4进行一系列操作后同DDCTF{reverseME} 进行比较,输入进入str_in,然后v4就是解密后的内容,进入该函数

VouKMtpCzDe5qvJ.png

发现就是对输入的字符串进行读取,让然后去匹配data里面的数值,data大概就是密码表,双击进入data是可以发现data没有在源码里面固定。

乱打乱撞,进入data里面发现这样

2RWCdanXDklS6yN.png

没有发现密码表,然后在下面翻,居然让我发现了类似密码表的东西

mAbZtyvi7hp4U9W.png

这串字符八九不离十就是密码表了,然后写脚本进行输出

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
int main()
{
char key[] = {"DDCTF{reverseME}"};
char alpha[] = {"~}|{zyxwvutsrqponmlkjihgfedcba`_^]\\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(,&%$#\"!"} ;
for (int i=0;i<strlen(key);i++){
for(int j=0;j<strlen(alpha);j++){
if(key[i]==alpha[j]) printf("%d ",j);
}
}
return 0;
}

运行结果如下58 58 59 42 56 3 12 25 8 25 12 11 25 49 57 1

根本不像是能打进去的字符串,于是进入ollydbg,发现这个地址是随机化了的,不好下断点,于是用PEtools 关闭地址空间随机化

ARPnsoW9KLTF6bC.png

J6nktLVENRfDP8S.png

然后保存,在关键函数sub_401000处下断点,然后输入测试数据就是密码表的前面几个字符ABCDEFG 进行测试

T8p92g5ijaJnEVP.png

1
2
3
4
5
6
7
8
loc_401020:
movsx eax, byte ptr [ebx+ecx]
mov dl, ds:data[eax]
mov eax, ebp
mov [ecx], dl
inc edi
inc ecx
lea esi, [eax+1]

这一块就是从堆栈里面找到data[eax]里面的内容,eax就是偏移量,然后eax是由ebx+ecx得到的,此时的寄存器信息如下

uOlmBJwN5yzW1VM.png

发现A指向的是],于是修改C

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string.h>
int main()
{
char key[] = {"ABCDEFG"};
char alpha[] = {"~}|{zyxwvutsrqponmlkjihgfedcba`_^],[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(,&%$#\"!"} ;
for (int i=0;i<strlen(key);i++){
for(int j=0;j<strlen(alpha);j++){
if(key[i]==alpha[j]) printf("%c ",j-'='+']');
}
}
return 0;
}

采用这种方式来找到偏移量,是-'='+']' 然后在OD里面验证一下,发现符合] \ [ Z Y X W然后把key换成DDCTF{reverseME} 放到OD里面进行验证

fHJZqe3P9TbuYW2.png

yjVghaFuMRcZtYG.png

LkRNiHTtzajIAX8.png

成功拿到Flag~~

撒花★,°:.☆( ̄▽ ̄)/$:.°★