WHCTF2017-ONLINE逆向题目BabyREwriteup

题目链接:http://oj.xctf.org.cn/media/task/2b0a8eaf-72ee-4893-bd4e-304f145cc970.babyRE

IDAx64载入  很容易找到关键就在main()

WHCTF2017-ONLINE逆向题目BabyREwriteup_第1张图片

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+0h] [rbp-20h]
  int v5; // [rsp+18h] [rbp-8h]
  int i; // [rsp+1Ch] [rbp-4h]

  for ( i = 0; i <= 181; ++i )
  {
    envp = (const char **)(*((unsigned __int8 *)judge + i) ^ 0xCu);
    *((_BYTE *)judge + i) ^= 0xCu;
  }
  printf("Please input flag:", argv, envp);
  __isoc99_scanf("%20s", &s);
  v5 = strlen(&s);
  if ( v5 == 14 && (unsigned int)judge(&s) )
    puts("Right!");
  else
    puts("Wrong!");
  return 0;
}

如果想走到Right就得满足两个条件   第一就是输入的字符串长度得等于14第二个就要分析judge函数了 

judge           endp ; sp-analysis failed

报错堆栈不平衡

解决办法看这里https://blog.csdn.net/xiangshangbashaonian/article/details/81950110

void __usercall judge(__int64 a1@, int a2@)
{
  bool v2; // zf
  __int64 v3; // [rsp-8h] [rbp-8h]

  v2 = (a2 & *(_DWORD *)(a1 - 44)) == 0;
  JUMPOUT(v3, v3);
}

F5之后还是很模糊   main()中有对judge的操作   刚开始想不通是干嘛(ps:太菜了)

IDA远程动态调试一下看看到底是怎么回事

我是在for循环开始这里下的断点   其实感觉下在main入口更好点

WHCTF2017-ONLINE逆向题目BabyREwriteup_第2张图片

分析可知:judge()函数刚开始是需要在main()中解密的   具体过程看下边

.text:0000000000400615 jmp     short loc_400637                
.text:0000000000400617 ; ---------------------------------------------------------------------------
.text:0000000000400617
.text:0000000000400617 loc_400617:                             ; CODE XREF: main+38↓j
.text:0000000000400617 mov     eax, [rbp+var_4]
.text:000000000040061A cdqe                                    ; 使用eax的最高位拓展rax高32位的所有位
.text:000000000040061C movzx   eax, byte ptr judge[rax]        ; 取出judge位置的值赋给eax
.text:0000000000400623 xor     eax, 0Ch                        ; 让eax与0xC异或  并把结果放回eax
.text:0000000000400626 mov     edx, eax                        ; 把eax得值赋给edx
.text:0000000000400628 mov     eax, [rbp+var_4]
.text:000000000040062B cdqe
.text:000000000040062D mov     byte ptr judge[rax], dl
.text:0000000000400633 add     [rbp+var_4], 1                  ; 这里存放循环变量i  每次到这里加1
.text:0000000000400637
.text:0000000000400637 loc_400637:                             ; CODE XREF: main+F↑j
.text:0000000000400637 cmp     [rbp+var_4], 181                ; 比较i与181的大小
.text:000000000040063E jle     short loc_400617                ; 若i<=181  则跳转继续循环  否则跳出
.text:0000000000400640 mov     edi, offset format              ; "Please input flag:"
[stack]:00007FFF8E6AB7FC db    2                                 ; 循环变量i在堆栈中的位置  第二次循环时值为2

那么我们只需要写个脚本解密一下  就可以看到正常的judge()函数啦

在IDA中看初始位置0x600B00

IDC脚本就可以

auto i;
for(i=0;i<0xb5;i++)
{
	PatchByte(0x600b00+i,Byte(0x600b00+i) ^ 0xc);}

然后必须delete掉judge函数进行重新CreateFunction  这个函数才可以还原他的真面目    这是因为静态分析的时候IDA就确定了函数的大小

(ps:夜影师傅教我的 嘻嘻)

WHCTF2017-ONLINE逆向题目BabyREwriteup_第3张图片

删除就是   点击这个函数名   按U即可   创建就是按P

最后F5就可以得到

void __fastcall judge(__int64 a1)
{
  char v1; // [rsp+8h] [rbp-20h]
  char v2; // [rsp+9h] [rbp-1Fh]
  char v3; // [rsp+Ah] [rbp-1Eh]
  char v4; // [rsp+Bh] [rbp-1Dh]
  char v5; // [rsp+Ch] [rbp-1Ch]
  char v6; // [rsp+Dh] [rbp-1Bh]
  char v7; // [rsp+Eh] [rbp-1Ah]
  char v8; // [rsp+Fh] [rbp-19h]
  char v9; // [rsp+10h] [rbp-18h]
  char v10; // [rsp+11h] [rbp-17h]
  char v11; // [rsp+12h] [rbp-16h]
  char v12; // [rsp+13h] [rbp-15h]
  char v13; // [rsp+14h] [rbp-14h]
  char v14; // [rsp+15h] [rbp-13h]
  int i; // [rsp+24h] [rbp-4h]

  v1 = 102;
  v2 = 109;
  v3 = 99;
  v4 = 100;
  v5 = 127;
  v6 = 107;
  v7 = 55;
  v8 = 100;
  v9 = 59;
  v10 = 86;
  v11 = 96;
  v12 = 59;
  v13 = 110;
  v14 = 112;
  for ( i = 0; i <= 13; ++i )
    *(_BYTE *)(i + a1) ^= i;
  for ( i = 0; i <= 13 && *(_BYTE *)(i + a1) == *(&v1 + i); ++i )
    ;
  __asm { iret }
}

解密后关键代码就是  将序号与对应位置字符进行异或    可以对照下面的汇编WHCTF2017-ONLINE逆向题目BabyREwriteup_第4张图片

WHCTF2017-ONLINE逆向题目BabyREwriteup_第5张图片

那么我们只要写个脚本异或一下就可以得到flag

a = [0x66,0x6D,0x63,0x64,0x7F,0x6B,0x37,0x64,0x3B,0x56,0x60,0x3B,0x6E,0x70]
flag = ''
for i in range(len(a)):
	flag +=chr(a[i] ^ i)
	print flag
print flag
#flag{n1c3_j0b}

 

参考链接https://blog.csdn.net/whklhhhh/article/details/78005589

你可能感兴趣的:(我的逆向之路,我的CTF之路,我的CTF进阶之路)