
第一题:
https://pan.baidu.com/s/1ZewvywceSIPI3KnGqbsM4g
这是我做的第一道逆向题目。
首先这个exe是有问题的,当我们在打开的时候发现会打不开的,我的打开时是这样的提示:
上面说让咨询软件发布者,我想我们没办法去找到谁发布的,所以我们就需要修改一下这个软件,再次我们就需要一个软件010editor
(SweetScape 010 Editor是一个全新的十六进位文件编辑器,它有别於传统的十六进位编辑器在於它可用’范本’来解析二进位文件, 从而让你读懂和编辑它. 它还可用来比较一切可视的二进位文件)
将这个exe拖进这个软件会出现01代码。首先我们找PE的位置,这个上面PE的位置是E8然后我们就找第E行也就是00E0h,从0开始数,数到8,我们会发现它是错误的,PE是00 45 50然而那个位置是45 50 00如图所示:
所以我们需要修改,修改之后为:
修改完之后再次打开试一下,结果如图:(目前对01代码不够熟悉,详细讲解将会在学好之后继续上传)
这就可以运行程序了。
看到这个提示框之后,我们先输入一下试一试,看看结果如何。
出现的结果就是wrong,可以再次输入。
接着我们就可以逆向解决问题了,首先将该exe拖进IDA(32位)中。
会看到乱七八糟的代码,我么先搜索一下吧,search,无论什么程序一般都会有主程序也就是mian函数,所以我们先搜索main函数,结果还真搜索到了。(如果没有的话我们可以根据输入错误的回答信息来比如wrong来搜索)点击main,使用fn+f5就可以进入我们的main函数了。
进入之后就要我们分析函数,并且将这个函数逆向出来,并且将它解出来了。
int64 main_0()
{
int v0; // edx
int64 v1; // ST00_8
int v3; // [esp+0h] [ebp-1A0h]
const char v4; // [esp+4h] [ebp-19Ch]
const char v5; // [esp+8h] [ebp-198h]
int v6; // [esp+Ch] [ebp-194h]
int i; // [esp+D4h] [ebp-CCh]
int v8; // [esp+E0h] [ebp-C0h]
int v9; // [esp+ECh] [ebp-B4h]
int v10; // [esp+F0h] [ebp-B0h]
int v11; // [esp+F4h] [ebp-ACh]
int v12; // [esp+F8h] [ebp-A8h]
int v13; // [esp+FCh] [ebp-A4h]
int v14; // [esp+100h] [ebp-A0h]
int v15; // [esp+104h] [ebp-9Ch]
int v16; // [esp+108h] [ebp-98h]
int v17; // [esp+10Ch] [ebp-94h]
int v18; // [esp+110h] [ebp-90h]
int v19; // [esp+114h] [ebp-8Ch]
int v20; // [esp+118h] [ebp-88h]
int v21; // [esp+11Ch] [ebp-84h]
int v22; // [esp+120h] [ebp-80h]
int v23; // [esp+124h] [ebp-7Ch]
int v24; // [esp+128h] [ebp-78h]
int v25; // [esp+12Ch] [ebp-74h]
int v26; // [esp+130h] [ebp-70h]
int v27; // [esp+134h] [ebp-6Ch]
int v28; // [esp+138h] [ebp-68h]
int v29; // [esp+13Ch] [ebp-64h]
int v30; // [esp+140h] [ebp-60h]
char v31; // [esp+14Fh] [ebp-51h]
char v32[17]; // [esp+178h] [ebp-28h]
char v33; // [esp+189h] [ebp-17h]
char v34; // [esp+18Ah] [ebp-16h]
char v35; // [esp+18Bh] [ebp-15h]
char v36; // [esp+18Ch] [ebp-14h]
char v37; // [esp+18Dh] [ebp-13h]
v31 = 0;
v9 = 1;
v10 = 4;
v11 = 14;
v12 = 10;
v13 = 5;
v14 = 36;
v15 = 23;
v16 = 42;
v17 = 13;
v18 = 19;
v19 = 28;
v20 = 13;
v21 = 27;
v22 = 39;
v23 = 48;
v24 = 41;
v25 = 42;
v26 = 26;
v27 = 20;
v28 = 59;
v29 = 4;
v30 = 0;
printf(“please enter flag:”);
while ( 1 )
{
v6 = getch();
v32[v31] = v6;
if ( !(_BYTE)v6 || v32[v31] == 13 )
break;
if ( v32[v31] == 8 )
{
printf(“bb”);
–v31;
}
else
{
printf(“%c”, v32[v31++]);
}
}
v8 = 0;
for ( i = 0; i < 17; ++i )
{
if ( v32[i] != byte_415768[(&v9 + i)] )
v8 = 1;
}
if ( v33 != 49 || v34 != 48 || v35 != 50 || v36 != 52 || v37 != 125 )
v8 = 1;
v32[v31] = 0;
printf(“rn”);
if ( v8 )
{
printf(“wrongn”);
main(v3, v4, v5);
}
else
{
printf(“successn”);
}
system(“pause”);
HIDWORD(v1) = v0;
LODWORD(v1) = 0;
return v1;
}
这个主函数的代码有100多行,首先看上面的,全是定义的一些类型。所以我们就可以大致看一下,继续看下面的。
接着就是while循环,这是一个无限循环。所以要让这个循环结束的条件就是break,恰好这个程序里面就有一个判断语句
if ( !(_BYTE)v6 || v32[v31] == 13 )如果这个语句成立就break,而且如果鼠标点到13,点一下“r“你会发现它会编程/n同样是跳出循环。
所以if循环肯定成立。
在while循环中,getch()是我们输入的字符串,所以v6就是我们需要得到的值。
下面我们就可以看for循环了,for循环中的byte—415768我们已更改能够看出来它是一个数组或者字符串,所以我们把它点开看一下。
果然是一个字符串,但是上面的73h一定不要忘记,它也是字符串的一部分,点一下人,将73h的格式转化一下,将会转化为s。
然后后看下面的如果成功就要让v8 = 0
所以for 循环里面的if语句若果不成立则v8就不会为一,所以我们可以让
v32[i] == byte_415768[(&v9 + i)],所以我们只要求出来byte_415768[(&v9 + i)]我们就求出来了我们需要的答案。
(&v9 + i)从这个里面我们知道v9所在地址后面的16位地址的值将会是我们需要的,且需要将放在一个数组里面。如何知道他们的的值呢。这个时候上面的信息就有用了。
所以我们可以下脚本了,下面就是我的python脚本
c =[1,4,14,10,5,36,23,42,13,19,28,13,27,39,48,41,42,26,20,59,4,0]
a = ‘sKfxEeft}f{gyrYgthtyhifsjei53UUrrr_t2cdsef66246087138 087138’
for i in range(17):
print(a[c[i]],end =’’)
得出来的结果为:KEY{e2s6ry3r5s8f6
你会发现这个钥匙少了一部分。那么就继续看下面的部分,下面又是一个if判断语句,如果你是一个逆向高手,我想你会发现这些东西其实就是要是的后面部分。按r键转化为assic表就会得到:
加在钥匙后面就是KEY{e2s6ry3r5s8f61024}。这就是一个完整的钥匙了下面我们输上去试一试。
事实证明答案是对的!
第二题:
题目链接(https://pan.baidu.com/s/1MZu6AL7joa66hp1GApouCA
这是一道简单的逆向题目,只需要将它在python反编译中反编译一下就能得到主函数。
!/usr/bin/env python
import base64
def encode(message):
s = ‘’
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)
return base64.b64encode(s)
correct = ‘XlNkVmtUI1MgXWBZXCFeKY+AaXNt’
flag = ‘’
print ‘Input flag:’
flag = raw_input()
if encode(flag) == correct:
print ‘correct’
else:
print ‘wrong’
然后我们就开始分析代码。这单体代码也很简单,我就不详细分析了,从尾部开始向上分析写出代码即可。
最后的代码为:
flag = []
s = ‘^SdVkT#S ]`Y!^)ism’
for i in s:
i = ord(i)
i = i - 16
x = i ^ 32
flag.append(chr(x))
for i in flag:
print(i,end =’’)
结果为:nctf{d3c0mpil1n9_PyC}
第三道题:
题目链接(




近期评论