[pwnable.kr] flag
문제 설명
Papa brought me a packed present! let’s open it.
아빠가 포장된(packed) 선물을 사져왔어요! 열어볼게요.
처음 문제를 확인했을 땐 이게 뭔가 했습니다.
선물을 포장해왔다 해서 무슨 힌트를 준것일까 생각하게 되었습니다.
필요한 파일을 다운로드 받고 프로그램의 시작 흐름을 확인해 봅니다.
1
2
3
4
❯ wget http://pwnable.kr/bin/flag
❯ chmod +x ./flag
❯ ./flag
I will malloc() and strcpy the flag there. take it.
프로그램을 실행 시켰을 때 malloc()과 strcpy에 flag가 있다고 가져가라고 합니다.
문제 풀이
Decompile
ghidra로 프로그램을 디컴파일 후 분석을 시도하려고 한다. main함수가 보이지 않아 주어진 문자열 (I will malloc()...)을 기준으로 main을 찾기 위해 시도 했습니다.
하지만 주어진 문자열로 검색을 했을 때 문자열을 찾을 수 없었습니다.
문자열이 암호화 되어 저장되어 있거나 패킹되어 있을 확률이 높습니다.
다른 쓸만한 문자열이 있을지 필터를 지우고 문자열들을 확인해 보았을 때, 다음과 같은 힌트를 발견할 수 있습니다.
위의 사진의 힌트를 통해서 해당 프로그램은 upx프로그램을 통해서 packing되어 있다는 것을 알 수 있습니다.
packing이란 실행압축을 의미하게 됩니다.
패킹을 수행 했을 때, 프로그램은 메모리에서 압축을 해제 시킨 후 실행을 시키게 되고, 이런 과정을 거쳐 프로그램의 크기를 줄일 수 있으며 어플리케이션 분석의 시간을 늦출 수 있는 효과가 있습니다.
unpack & decompile
unpack
upx로 패킹되어 있다는 것을 확인 했으므로 upx를 이용해 언패킹을 수행합니다. upx가 설치 되어 있지 않다면 sudo apt-get install upx를 통해 설치할 수 있습니다.
설치 이후 upx를 실행해 보면 다음과 같은 화면을 확인 가능합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
❯ upx
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..
Commands:
-1 compress faster -9 compress better
-d decompress -l list compressed file
-t test compressed file -V display version number
-h give more help -L display software license
Options:
-q be quiet -v be verbose
-oFILE write output to 'FILE'
-f force compression of suspicious files
-k keep backup files
file.. executables to (de)compress
Type 'upx --help' for more detailed help.
UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io
- d 옵션을 부여해서 패킹된 파일을 decompress할 수 있습니다.
- o 옵션을 사용하면 결과 파일을 다른 이름으로 저장할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
❯ upx -d -o flag_unpack ./flag
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
File size Ratio Format Name
-------------------- ------ ----------- -----------
883745 <- 335288 37.94% linux/amd64 flag_unpack
Unpacked 1 file.
언패킹된 파일의 용량을 확인 했을 때, 기존의 패킹된 파일보다 용량이 늘어난 것을 확인할 수 있습니다.
용량은 변화 하였지만 실행 결과는 동일한 모습도 확인할 수 있습니다.
1
2
3
4
5
6
❯ ls -l
total 1192
-rwxrwxr-x 1 ott3r ott3r 335288 5월 16 2019 flag
-rwxrwxr-x 1 ott3r ott3r 883745 5월 16 2019 flag_unpack
❯ ./flag_unpack
I will malloc() and strcpy the flag there. take it.
decompile
언팩된 파일을 다시 기드라에 올려서 분석하면 main함수의 심볼을 찾을 수 있습니다.
언팩된 파일은 처음에 main을 찾기위해 검색을 시도 했던 문자열(I will malloc()...)을 확인할 수 있습니다.
또한 코드를 살펴보면 strcpy(__dest, flag);를 확인할 수 있습니다.
결과
flag변수 명을 더블 클릭 하게 되면 문자열이 들어 있는 주소를 다음과 같이 확인할 수 있습니다.
여기서 다시 한번 해당 주소를 더블 클릭하게 되면 저장 되어 있는 문자열을 확인할 수 있습니다.
upx로 패킹된 바이너리를 다시 언패킹 하여 분석할 수 있는 문제였습니다.
flag : UPX...? sounds like a delivery service :)





