# Description
What do you do if you encounter Flutter on Linux?
Plain Text
복사
# 분석
slutter.zip 파일을 다운로드 받을 수 있다.
해당 파일을 다운로드 받아 압축을 풀어보면 아래와 같은 파일 구조를 확인할 수 있다.
./
├── data
│ ├── flutter_assets
│ │ ├── AssetManifest.bin
│ │ ├── AssetManifest.json
│ │ ├── FontManifest.json
│ │ ├── NOTICES.Z
│ │ ├── fonts
│ │ │ └── MaterialIcons-Regular.otf
│ │ ├── kernel_blob.bin
│ │ ├── packages
│ │ │ └── cupertino_icons
│ │ │ └── assets
│ │ │ └── CupertinoIcons.ttf
│ │ ├── shaders
│ │ │ └── ink_sparkle.frag
│ │ └── version.json
│ └── icudtl.dat
├── lib
│ └── libflutter_linux_gtk.so
└── slutter
Bash
복사
slutter 파일을 확인해보면 아래와 같이 ELF 파일인 것을 알 수 있다.
file ./slutter
./slutter: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=c77dcc8e7423c8e589ceca8752cadcc937408f1d, for GNU/Linux 4.4.0, with debug_info, not stripped
Bash
복사
실행해보면 아래와 같이 0x13371337번 클릭하라고 뜬다.
클릭하면 1씩 증가하지만 계속 현실적으로 클릭을 하고 있을 수가 없다…
삽질
1.
앱이면 string으로 박혀있다고 생각했다.
→ gdb로 attach 후 memory dump후 확인해봤지만 없음
2.
linux에서 cheat engine 같은걸로 memory value 변조
→ memory에서 검색은 되는데 변경해도 아무런 변화가 일어나지 않음
Flutter Debug Mode
Flutter가 Debug 모드에서는 컴파일을 할 때 kernel_blob.bin을 남긴다고 한다.
즉 kernel_blob.bin 파일에 소스코가 남아있다고 확인했고 우리는 앞에서 tree 명령어를 통해서 kernel_blob.bin 파일이 존재하는 것을 확인했다.
extract string
kernel_blob.bin에서 string을 추출한다.
strings kernel_blob.bin > strings.txt
Bash
복사
소스코드가 추출된다.
이제 저 문자열을 찾아본다.
Ctrl + F로 “push this button” 검색 후 위 아래를 보면 flag가 박혀있다.
if (_counter == 0x13371337) {
flag = [
70,
77,
67,
84,
70,
123,
100,
49,
68,
95,
121,
48,
117,
95,
117,
53,
51,
95,
56,
108,
117,
55,
55,
51,
82,
95,
48,
82,
95,
119,
104,
52,
55,
63,
125
];
}
Bash
복사
웃긴점은 진짜 0x13371337번 클릭했어도 풀렸다는 것이다.
python 코드로 복호화해보면 flag를 얻을 수 있다.
[print(chr(i),end='') for i in [70, 77, 67, 84, 70, 123, 100, 49, 68, 95, 121, 48, 117, 95, 117, 53, 51, 95, 56, 108, 117, 55, 55, 51, 82, 95, 48, 82, 95, 119, 104, 52, 55, 63, 125]]
Python
복사
# Flag
FMCTF{d1D_y0u_u53_8lu773R_0R_wh47?}
Plain Text
복사