Description

Category: Reversing

Source: CONFidence CTF 2019 Teaser

Points: 57

Author: Jisoon Park(js00n.park)

Description:

Elementary, my dear Watson.

elementary.tar.gz

Write-up

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4; // [rsp+0h] [rbp-90h]
  unsigned __int64 v5; // [rsp+88h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  printf("Password: ", argv, envp);
  __isoc99_scanf("%s", &v4);
  if ( (unsigned int)checkFlag(&v4) )
    printf("Good job!", &v4);
  else
    printf("Wrong!", &v4);
  return 0;
}

Password를 입력 받는데, 특정 조건을 만족하는 Password 자체가 flag인 전형적인 angr 문제이다.

_BOOL8 __fastcall checkFlag(char *a1)
{
  if ( (unsigned int)function0(a1[64] & 1) )
    return 0LL;
  if ( (unsigned int)function1((a1[64] >> 2) & 1) )
    return 0LL;
  if ( (unsigned int)function2((a1[64] >> 5) & 1) )
    return 0LL;
  if ( (unsigned int)function3((a1[64] >> 4) & 1) )
    return 0LL;

[...]

checkFlag() 함수는 function0() 부터 function831() 까지의 함수를 이용해서 Password를 체크한다.

더 볼것도 없이 angr를 이용해서 password를 찾아보자.

import angr
succ_addr = 0x40077f
fail_addr = 0x400792

proj = angr.Project('./elementary', load_options={"auto_load_libs": False})

sm = proj.factory.simulation_manager()
sm.explore(find = (succ_addr,), avoid = (fail_addr,))

if len(sm.found) < 1:
    print "not found!"
else:
    s = sm.found[0].state.posix.dumps(0)
    print "found : " + s

위와 같이 exploit을 작성하여 실행해 보았으나, angr는 path 탐색에 실패했다. 이래저래 다르게 구현해봤는데 안되는걸 보니, 나중에 다른사람들 writeup을 좀 찾아봐야 할것 같다.

각각의 function이 400개가 넘는 instruction으로 구성되어 있는걸 보면 각각의 함수가 좀 복잡해서 그럴 수도 있을 것 같다. 하지만 IDA에서 decompile 해보면 argument를 그대로 리턴하거나 1과 xor하여 리턴하거나 둘 중의 하나이다.

바이너리를 분석하기 어렵게 일부러 꼬아둔 것 같으니, IDApython을 이용해서 checkFlag 함수와 각각의 functionX 함수들의 decompile한 결과를 파일로 저장하였다.

checkFlag() 함수의 구성 자체는 별다른 예외 없이 일률적으로, if문 하나가 functionX 함수 하나를 이용해서 Password의 한 bit를 확인하는 식이다.

python을 이용해서 조건을 만족시기는 문자열을 찾는 코드를 작성하여 flag를 찾을 수 있었다.

Flag : p4{I_really_hope_you_automated_this_somehow_otherwise_it_might_be_a_bit_frustrating_to_do_this_manually}

'writeups > Reversing' 카테고리의 다른 글

Easy Crack Me  (0) 2019.11.26
i can count  (0) 2019.11.26
ELF Crumble  (0) 2019.11.26
Super Secure Vault  (0) 2019.11.26
Feed_me  (0) 2019.11.25

+ Recent posts