본문 바로가기
# write-up/- ctf

[ALEX CTF] RE5: packed movement

by ddddh 2017. 2. 7.





Please click once before reading this write-up. thx :D





ddddh@ubuntu:~/Desktop$ file move

move: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, stripped


file 명령어를 사용하면 elf 32-bit 바이너리인 걸 확인할 수 있다.


ddddh@ubuntu:~/Desktop$ binwalk move


DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

0             0x0             ELF, 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux)

1636424       0x18F848        Copyright string: "Copyright (C) 1996-2013 the UPX Team. All Rights Reserved. $"


binwalk 로 바이너리를 한 번더 분석하면 UPX Packer 로 Packing 되있다는 걸 예상할 수 있다.


ddddh@ubuntu:~/Desktop$ upx -d move

                       Ultimate Packer for eXecutables

                          Copyright (C) 1996 - 2013

UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013


        File size         Ratio      Format      Name

   --------------------   ------   -----------   -----------

  10308504 <-   2623460   25.45%  netbsd/elf386  move


Unpacked 1 file.


upx -d 명령어를 통해 간단하게 unpacking 후에 동적분석을 진행해본다.


ddddh@ubuntu:~/Desktop$ ./move

Guess a flag: ddddhkim.github.io

Wrong Flag!


언패킹 된 move 파일을 다시 한 번 binwalk를 통해 분석해본다.

ddddh@ubuntu:~/Desktop$ binwalk move


DECIMAL       HEXADECIMAL     DESCRIPTION

--------------------------------------------------------------------------------

0             0x0             ELF, 32-bit LSB executable, Intel 80386, version 1 (SYSV)

1339753       0x147169        Unix path: /z/y/x/w/v/u/t/s/r/q/p/o/n/m/l/k/j/i/h/g/f/e/d/c/b/a/`/_/^/]/\/[/Z/Y/X/W/V/U/T/S/R/Q/P/O/N/M/L/K/J/I/H/G/F/E/D/C/B/A/@/?/>/=/</;

8164749       0x7C958D        Unix path: /home/oddcoder/projects/movfuscator/build//crtd.o


여기서 확인해야될 단어는 'movfuscator'다. (https://github.com/xoreaxeaxeax/movfuscator)


compiler 종류 중 하나로 이번 대회에서 처음 봤다 -_ -;;


decompiler 를 찾으려 해봐도 따로 존재하는 것 같지는 않았다.


그렇기 때문에 IDA를 사용하여 일단 바이너리를 열어 보았다.












IDA의 Strings option 을 보면 "Well Done", "Wrong flag", "Guess flag" 등등 보인다.






그리고 확인 해보면 "Well Done"의 문자열에 비해서 "Wrong flag"의 문자열의 xrefs 가 매우 많은 걸 볼 수 있다.


즉, 무수히 많은 if 문을 통과해야지 "Well Done"을 띄을 수 있다는 뜻이된다.


우선은 "Wrong flag"의 아무 xref offset 으로 가서 주위를 확인 한다.


그 윗 부분에서 비교가 일어나는 걸 예측할 수 있기 때문이다.







"Wrong Flag" 문자열의 조금 윗 부분에 edx와 'A'를 비교하는 것 같은 부분이 있다.


아마 소스는 이런식으로 짜여있을 것 같다는 예상할 수 있다.


if ( input_data[0] == 'A')

{

if ( input_data[1] == 'L')

{

if ( input_data[2] == 'E')

{

if (input_data[3] == 'X')

{

...

printf("Well Done!\n");

exit();

}

}

}

}

printf("Wrong flag!\n");






















ALEXCTF{M0Vfusc4t0r_w0rk5_like_m4g1c}






'# write-up > - ctf' 카테고리의 다른 글

[DEFCON 2017] alchemy  (0) 2017.05.02
[Plaid CTF 2017] no_mo_flo  (0) 2017.04.27
[RC3 2016] 메모리 포렌식 - 500pt  (0) 2016.11.27
[RC3 2016] - Reversing 200pt  (0) 2016.11.21
[RC3 2016] - Reversing 350pt  (0) 2016.11.21