本文最后编辑于 前,其中的内容可能需要更新。
no-strings-attached
csaw2013reversing2
getit
maze
no-strings-attached main里的4个函数只有一个是重要的
显然要让cmp就是比较,就是要让ws=s2,而ws是通过fgetws输入进来的,s2的生成由第六行的decrypt而来 unk_8048B44在rodata段上,Success! unk_8048BA4在rodata段上,accessdenied
可以看到这边的decrypt,先准备好了wchar_t * 和s,然后直接call到decrypt的地方。然后再把eax的值赋给ebp+s2。那eax就是我们所需要的值
1 2 3 4 5 6 7 8 9 b decrypt run n x/5sw $eax x:examine–>检测内存地址中保存的值 5:显示5行目标数据 s:以字符串形式打印 w:以双字打印
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))
为了能执行到弹出flag这里
往上找到这句语句,f4运行到这里
他跳过了中间的flag,直接把他nop了
有个int 3也nop掉
又有个退出的跳转,继续nop掉
弹出了一个并不是真的flag,继续走
继续nop,看到flag
getit 可以选择断在循环的入口
1 2 b *0x400819,然后单步几次便可以看到flag search SharifCTF
一路调下去就可以看到flag了
还有一种是逆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。
这里就是判断字符数是否为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; }
再去把图画出来,不能碰到空格
nctf{o0oo00O000oooo..OO}