[Reverse]BABYRE(idapython解题)

题目下载地址:BABYRE

main:

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

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

这道题本身很简单,但是难度出现在了judge函数这里,由于ida在反编译的时候误以为这里的judge函数是数据,从而导致反编译出错.
这里提供了两种方法:

方法一:动态调试:

由于判断长度在judge判断之前所以我们需要输入14位的数据来让judge函数生成

  ; main+74↑o
.data:0000000000600B00 push    rbp
.data:0000000000600B01 mov     rbp, rsp
.data:0000000000600B04 mov     [rbp-28h], rdi
.data:0000000000600B08 mov     byte ptr [rbp-20h], 66h ; 'f'
.data:0000000000600B0C mov     byte ptr [rbp-1Fh], 6Dh ; 'm'
.data:0000000000600B10 mov     byte ptr [rbp-1Eh], 63h ; 'c'
.data:0000000000600B14 mov     byte ptr [rbp-1Dh], 64h ; 'd'
.data:0000000000600B18 mov     byte ptr [rbp-1Ch], 7Fh
.data:0000000000600B1C mov     byte ptr [rbp-1Bh], 6Bh ; 'k'
.data:0000000000600B20 mov     byte ptr [rbp-1Ah], 37h ; '7'
.data:0000000000600B24 mov     byte ptr [rbp-19h], 64h ; 'd'
.data:0000000000600B28 mov     byte ptr [rbp-18h], 3Bh ; ';'
.data:0000000000600B2C mov     byte ptr [rbp-17h], 56h ; 'V'
.data:0000000000600B30 mov     byte ptr [rbp-16h], 60h ; '`'
.data:0000000000600B34 mov     byte ptr [rbp-15h], 3Bh ; ';'
.data:0000000000600B38 mov     byte ptr [rbp-14h], 6Eh ; 'n'
.data:0000000000600B3C mov     byte ptr [rbp-13h], 70h ; 'p'
.data:0000000000600B40 mov     dword ptr [rbp-4], 0
.data:0000000000600B47 jmp     short loc_600B71
.data:0000000000600B47
.data:0000000000600B49 ; ---------------------------------------------------------------------------
.data:0000000000600B49
.data:0000000000600B49 loc_600B49:                             ; CODE XREF: .data:0000000000600B75↓j
.data:0000000000600B49 mov     eax, [rbp-4]
.data:0000000000600B4C movsxd  rdx, eax
.data:0000000000600B4F mov     rax, [rbp-28h]
.data:0000000000600B53 add     rax, rdx
.data:0000000000600B56 mov     edx, [rbp-4]
.data:0000000000600B59 movsxd  rcx, edx
.data:0000000000600B5C mov     rdx, [rbp-28h]
.data:0000000000600B60 add     rdx, rcx
.data:0000000000600B63 movzx   edx, byte ptr [rdx]
.data:0000000000600B66 mov     ecx, [rbp-4]
.data:0000000000600B69 xor     edx, ecx
.data:0000000000600B6B mov     [rax], dl
.data:0000000000600B6D add     dword ptr [rbp-4], 1
.data:0000000000600B6D
.data:0000000000600B71
.data:0000000000600B71 loc_600B71:                             ; CODE XREF: .data:0000000000600B47↑j
.data:0000000000600B71 cmp     dword ptr [rbp-4], 0Dh
.data:0000000000600B75 jle     short loc_600B49
.data:0000000000600B75
.data:0000000000600B77 mov     dword ptr [rbp-4], 0
.data:0000000000600B7E jmp     short loc_600BA9
.data:0000000000600B7E
.data:0000000000600B80 ; ---------------------------------------------------------------------------
.data:0000000000600B80
.data:0000000000600B80 loc_600B80:                             ; CODE XREF: .data:0000000000600BAD↓j
.data:0000000000600B80 mov     eax, [rbp-4]
.data:0000000000600B83 movsxd  rdx, eax
.data:0000000000600B86 mov     rax, [rbp-28h]
.data:0000000000600B8A add     rax, rdx
.data:0000000000600B8D movzx   edx, byte ptr [rax]
.data:0000000000600B90 mov     eax, [rbp-4]
.data:0000000000600B93 cdqe
.data:0000000000600B95 movzx   eax, byte ptr [rbp+rax-20h]
.data:0000000000600B9A cmp     dl, al
.data:0000000000600B9C jz      short loc_600BA5
.data:0000000000600B9C
.data:0000000000600B9E mov     eax, 0
.data:0000000000600BA3 jmp     short loc_600BB4
.data:0000000000600BA3
.data:0000000000600BA5 ; ---------------------------------------------------------------------------
.data:0000000000600BA5
.data:0000000000600BA5 loc_600BA5:                             ; CODE XREF: .data:0000000000600B9C↑j
.data:0000000000600BA5 add     dword ptr [rbp-4], 1
.data:0000000000600BA5
.data:0000000000600BA9
.data:0000000000600BA9 loc_600BA9:                             ; CODE XREF: .data:0000000000600B7E↑j
.data:0000000000600BA9 cmp     dword ptr [rbp-4], 0Dh
.data:0000000000600BAD jle     short loc_600B80
.data:0000000000600BAD
.data:0000000000600BAF mov     eax, 1
.data:0000000000600BAF
.data:0000000000600BB4
.data:0000000000600BB4 loc_600BB4:                             ; CODE XREF: .data:0000000000600BA3↑j
.data:0000000000600BB4 pop     rbp
.data:0000000000600BB5 retn
.data:0000000000600BB5
.data:0000000000600BB5 _data ends

以上是生成出来的函数

file

首先和13进行比较,小于或者等于13就进入循环

循环的内容是将上面字符串循环13次恰好等于[rbp+var_13]的长度,也就是进行处理字符串

处理方式就是进行异或,xor edx,ecx ecx就是循环的次数 每个字符与当前循环的次数进行xor

异或结束后调入下一个地址

又是进行循环判断[rbp+var_4]作为循环因子逐次+1 直到等于13结束

file

[rbp+var_4]是次数作为元素下标处理放入rdx

[rbp+var_28]是用户输入的flag放入rax中

最后相加是依次对输入的flag进行处理

为了更直白的看出来
我们按p将函数声明了,然后按f5反编译

file

这样就能更加直白的看出flag的处理方式了!

方法二:嵌入式脚本(idapython)

首先介绍以下idapython在ida7.0后按shitf + f2可以打开如下窗口

file

我们可以在其中运行脚本来对代码进行处理。
首先我们进入主函数发现
file

这一段对judge函数进行了处理,那我们思路就来了我们只需要按照这个方式将judge数组里面的东西处理了之后再按c分析代码就可以出来judge函数了。
我们需要用到的是idc_bc695库
说明一下这个库非常的离谱我的7.7ida居然没有搞得我弄了好久这个玩意,后面发现我的ida7.5里面居然存在这个库,果断移植过来
首先我们找到judge的首地址0x0600B00然后从这里开始修改它。
脚本内容就是每一位数字对0xC也就是12进行异或,我们这里需要使用到的是 PatchByte 函数.(我个人的理解 PatchByte函数就是将后面的值赋值给前面的地址)
脚本如下:

from idc_bc695 import*
a = 0x600B00
for i in range(182):
    PatchByte(a+i,Byte(i+a)^0xc)

file

我们点击下面的run运行之后会发现judge的值已经被我们改变了。
我们选中0x600B00到0x600BB5的数据按c然后选择force模式分析代码
file

然后我们依然需要选中他们按p声明代码后按f5反编译就得到了原本的judge函数

__int64 __fastcall judge(__int64 a1)
{
  char v2[5]; // [rsp+8h] [rbp-20h] BYREF
  char v3[9]; // [rsp+Dh] [rbp-1Bh] BYREF
  int i; // [rsp+24h] [rbp-4h]

  qmemcpy(v2, "fmcd", 4);
  v2[4] = 127;
  qmemcpy(v3, "k7d;V`;np", sizeof(v3));
  for ( i = 0; i <= 13; ++i )
    *(i + a1) ^= i;
  for ( i = 0; i <= 13; ++i )
  {
    if ( *(i + a1) != v2[i] )
      return 0LL;
  }
  return 1LL;
}

解题脚本

#include<iostream>
using namespace std;
char flag[] = {
    0x66,0x6d,0x63,0x64,0x7f,0x6b,0x37,0x64,0x3b,0x56,0x60,0x3b,0x6e,0x70
};
int main ()
{
    for(int i = 0 ; i < 0xe; i++ )
    {
        printf("%c",flag[i]^i);
    }
//  printf("%s",flag);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇