攻防世界-逆向-新手下篇(9 to 12)


  • no-strings-attached
  • csaw2013reversing2
  • getit
  • maze

no-strings-attached

main里的4个函数只有一个是重要的
no-strings-attached-1.png

显然要让cmp就是比较,就是要让ws=s2,而ws是通过fgetws输入进来的,s2的生成由第六行的decrypt而来
unk_8048B44在rodata段上,Success!
unk_8048BA4在rodata段上,accessdenied
no-strings-attached-2.png

可以看到这边的decrypt,先准备好了wchar_t * 和s,然后直接call到decrypt的地方。然后再把eax的值赋给ebp+s2。那eax就是我们所需要的值
no-strings-attached-3.png

1
2
3
4
5
6
7
8
9
b decrypt
run
n
x/5sw $eax

x:examine–>检测内存地址中保存的值
5:显示5行目标数据
s:以字符串形式打印
w:以双字打印

no-strings-attached-4.png

9447{you_are_an_international_mystery}


csaw2013reversing2

参考链接:https://blog.csdn.net/qq_43786458/article/details/102150779

1
2
3
4
5
直接在ida patch代码。
edit->patch program->assemble,最后在apply patches to input files
把jnz short loc_401096 改为jmp short loc_401096 ,不判断直接下去
把int 3(debugbreak)改为nop(不中断)
把jmp short loc_4010EF(exitprocess退出)改为 jmp short loc_4010B9(左边的messagebox(flag))

csaw2013reversing2-1.png

为了能执行到弹出flag这里
csaw2013reversing2-2.png

csaw2013reversing2-3.png

往上找到这句语句,f4运行到这里
csaw2013reversing2-4.png

他跳过了中间的flag,直接把他nop了
csaw2013reversing2-5.png

有个int 3也nop掉
csaw2013reversing2-6.png

又有个退出的跳转,继续nop掉
csaw2013reversing2-7.png

弹出了一个并不是真的flag,继续走
csaw2013reversing2-8.png

继续nop,看到flag
csaw2013reversing2-9.png

csaw2013reversing2-10.png


getit

可以选择断在循环的入口

1
2
b *0x400819,然后单步几次便可以看到flag
search SharifCTF

getit-1.png

一路调下去就可以看到flag了

getit-2.png

还有一种是逆flag的
就是看他i&1的结果来判断v3的值,从而去-1还是+1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <windows.h>
#include <string.h>
int main(){
int i,v3;
char s[]="c61b68366edeb7bdce3c6820314b7498";
char t[]="SharifCTF{????????????????????????????????}";
for(i=0;i<strlen(s);i++){
if(i&1){
v3=1;
}
else{
v3=-1;
}
t[i+10]=s[i]+v3;
}
printf("%s",t);
system("pause");
return 0;
}

maze

1
2
行列的关系,关系到四个方向的走向。
rcx*8+rax。可得rcx为行,就是第几行的意思。然后+rax。就是第几行的第几个值。然后判断当前的值是否是#。如果是就输出flag。

maze-1.png

这里就是判断字符数是否为24位,然后前五位是nctf{,最后一位为125(“}”)

1
if ( strlen(&s1) != 24 || strncmp(&s1, "nctf{", 5uLL) || *(&byte_6010BF + 24) != 125 )

然后就是判断行列然后去+-操作,就是上下左右了
但是左右是一组,上下也是一组
v10是列。那O就是左(-),o是右(+)
v9是行。0就是下(+),.就是上(-)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ( v4 > 'N' )
{
if ( (unsigned __int8)v4 == 'O' )
{
v6 = sub_400650(v10);
goto LABEL_14;
}
if ( (unsigned __int8)v4 == 'o' )
{
v6 = sub_400660(v10);
goto LABEL_14;
}
}
else
{
if ( (unsigned __int8)v4 == '.' )
{
v6 = sub_400670(&v9);
goto LABEL_14;
}
if ( (unsigned __int8)v4 == '0' )
{
v6 = sub_400680(&v9);
LABEL_14:
v5 = v6;
goto LABEL_15;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
bool __fastcall sub_400650(_DWORD *a1)
{
int v1; // eax


v1 = (*a1)--;
return v1 > 0;
}


bool __fastcall sub_400660(int *a1)
{
int v1; // eax


v1 = *a1 + 1;
*a1 = v1;
return v1 < 8;
}


bool __fastcall sub_400670(_DWORD *a1)
{
int v1; // eax


v1 = (*a1)--;
return v1 > 0;
}

bool __fastcall sub_400680(int *a1)
{
int v1; // eax


v1 = *a1 + 1;
*a1 = v1;
return v1 < 8;
}

再去把图画出来,不能碰到空格
maze-2.png

nctf{o0oo00O000oooo..OO}