본문 바로가기

pwnable.kr/Toddler's Bottle

flag

 

해당 문제는 리버싱 문제로 바이너리만이 주어진다. 바이너리 실행 결과는 다음과 같다

 

 

--------------------------------- 여담이 길어요 죄송합니다.. ---------------------------------

그래서 나는 바이너리를 리버싱 해야겠구나 생각하고 IDA를 켜서 수십 시간 동안 꼬리에 꼬리를 무는 함수들을 타고 내려가며,

'아니 Toddler's Bottle'이라면서 너무 어려운 거 아니야..?'

라고 생각하며, 엄청난 삽질을 했다.

 

그러나 아무리 생각해도 뭔가 이상했다.

main함수는 보이지도 않고 해당 함수들을 타고 들어가면 이상한 내용의 코드들과, 꼬리에 꼬리를 무는 또 다른 이상한 함수들을 호출하는 것의 연속이었다.

 

pwndbg로 확인해도 결과는 똑같았다. malloc()과 strcpy()를 이용해 flag를 적어놓는다더니 malloc()과 strcpy()는 커녕 main()조차 보이지 않았다.

그래서 나는 뭔가 잘못되어도 단단히 잘못됐다는 걸 깨닫고, pwntools를 이용해 보호 기법을 확인해보기로 했다.

그 결과 평소에 보지 못 했던 내용이 있었다.

Packer: Packed with UPX

 

'엥..?' 하는 생각과 함께 UPX가 뭔지 구글에 쳐봤다.

https://upx.github.io/

 

UPX: the Ultimate Packer for eXecutables - Homepage

Welcome UPX is a free, secure, portable, extendable, high-performance executable packer for several executable formats. Introduction UPX is an advanced executable file compressor. UPX will typically reduce the file size of programs and DLLs by around 50%-7

upx.github.io

https://www.esecurityplanet.com/threats/upx-compression-detection-evasion/

 

How UPX Compression Is Used to Evade Detection Tools

Compression is a great way for hackers to hide malware and render it undetectable. Here's what to do about that.

www.esecurityplanet.com

UPX를 간단히 정리해보자면,

[1] 무수히 많은 타입의 파일들을

[2] disassemble 과정을 방해하도록 안전하게(Malware 탐지 또한 회피할 수 있어 악의적으로 사용되기도 한다고 한다..)

[3] 파일 크기를 획기적으로 줄이며 압축해준다

 

이 UPX로 flag라는 바이너리가 packed 되어있기 때문에 당연히 리버싱이 그토록 힘들었던 것이다.. 😢

 

이제 upx를 설치해 flag 바이너리를 unpack 시키고 다시 리버싱을 해보자

UPX는 다음 링크를 통해 설치할 수 있다.

https://github.com/upx/upx/releases/tag/v4.0.2

 

Release v4.0.2 · upx/upx

Please see the file NEWS for a detailed list of changes. Note: all versions are functionally equivalent, i.e. each version can handle all executable formats, so you only need the file that runs on ...

github.com

 

설치 후 다음 명령어를 통해 UPX로 packing 되어있는 바이너리를 unpack 할 수 있다

 

나는 unpack한 flag를 flag_unpacked 라는 이름으로 따로 저장해줬다.

 

이제 flag_unpacked를 리버싱 해보자..!

 

flag_unpacked의 main을 Hex-Ray로 나타낸 모습이다. 이제서야 malloc()과 strcpy()가 보인다.. ㅜㅜ

flag를 살펴보자

flag는 data 세그먼트에 위치한 char 포인터형 변수이다.

 

그리고 flag가 가리키는 rodata 세그먼트 위치의 값을 읽어보면(위의 사진에도 나타나있지만..)

flag는 다음과 같음을 알 수 있다.

 

 

 

ps. 앞으로는 무작정 바로 문제로 뛰어들기보다는, 우선적으로 여러 조건을 잘 살펴보는 습관을 길러야겠다.

 

 

'pwnable.kr > Toddler's Bottle' 카테고리의 다른 글

random  (0) 2023.08.04
passcode  (0) 2023.08.03
bof  (1) 2023.06.14
collision  (0) 2023.06.14
fd  (0) 2023.06.14