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 |