Write-up

[bytebandits 2020] baby_rust writeup

ch4rli3kop 2020. 4. 14. 03:52
반응형

[bytebandits 2020] baby_rust writeup

[Summary] rust reversing

ch4rli3kop at ubuntu in ~/WRITE-UP/bytebandits2020/baby_rust
$ ./chall
AAAAAAAAA
you fail

대충 위와같이 동작하는 프로그램

Analysis

sub_0053A0() 함수가 키 포인트다. 0x0543D에 존재하는 sub_0092A0()을 통해 사용자의 입력을 받는다.

힙을 할당하여 사용자의 입력 값을 저장하는데, 이후 힙 할당을 하고 사용자의 입력 값을 복사하는 작업을 두 번정도 한다. (아마 rust 상의 function을 이동할 때마다 새로운 힙에 데이터를 복사하는 것 같다.)

그리고 사용자의 입력은 0x054A8에 위치한 다음의 루틴에서 연산된다. 사용자의 입력과 7부터 1씩 증가시킨 값과 xor 연산을 하는 모습이다.

 do
  {
     v9 = v6[idx] ^ (idx + 7);
     if ( v7 == (void **)v14 )
    {
       alloc_new_process((__int64)&v13, (__int64)v7, 1uLL);
       v7 = (void **)*((_QWORD *)&v14 + 1);
    }
     ++idx;
     *((_BYTE *)v7 + (_QWORD)v13) = v9;
     v7 = (void **)++*((_QWORD *)&v14 + 1);
  }

...
   
   
 if ( v23 == v7 )
{
   v10 = 0LL;
   while ( v7 != v10 )
  {
     v11 = *((_BYTE *)v10 + (_QWORD)v21) == *((_BYTE *)v10 + (_QWORD)v13);
     v10 = (void **)((char *)v10 + 1);
     if ( !v11 )
       goto LABEL_15;
  }
   *(_QWORD *)&flag = &off_343F0;
   *((_QWORD *)&flag + 1) = 1LL;
   v16 = 0LL;
   v17 = "you fail\n"
         "assertion failed: `(left == right)`\n"
         " left: ``,\n"
         " right: ``: destination and source slices have different lengths";
   v18 = 0LL;
   sub_A0D0(&flag, v7);
}

0x005507에 존재하는 cmp [rsp+0C8h+var_48], rsi에서 키 길이를 체크한다. 0x31을 비교하였음.

0x005529에 존재하는 cmp bl, [rax+rdx]에서 연산한 결과 값을 특정 문자열과 비교하는 것을 볼 수 있는데, 해당 결과가 모두 참이어야 성공루틴으로 들어가는 것을 볼 수 있음.

FLAG

a = 'adhmp`badO|sL}JuvvFmiui{@IO}QQVRZ'
result = ''
for i in range(7, 0x21+7):
   result += chr(ord(a[i-7]) ^ i)
print(result)

# flag{look_ma_i_can_write_in_rust}


반응형

'Write-up' 카테고리의 다른 글

Uncrackable 3 write up  (0) 2020.07.10
[Defenit CTF 2020] warmup writeup  (0) 2020.06.14
[bytebandits 2020] fmt-me writeup  (0) 2020.04.14
[pwnable.kr] fix writeup  (0) 2019.07.13
[pwnable.kr] dragon writeup  (0) 2019.07.13