Packer¶
اومدیم با چالش ریورس! picoCTF که فلگ رو پیدا کنیم.
نام چالش و نکته درباره اندازه فایل به ما میگوید که از یک ابزار فشردهسازی (packer) برای این باینری استفاده شده است.
ابتدا تحلیل اولیه فایل را شروع میکنیم:
└─$ file out
out: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, no section header
فایل یک باینری ELF 64 بیتی است. حالا رشتهها را بررسی میکنیم:
└─$ strings -n 8 out
AWAVAUATUS
7069636fH
Enter the password
o unlock,is file:
lagX7069636f4354467b5539585f
$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.95 Copyright (C) 1996-2018 the UPX Team. All Rights Reserved. $
/proc/self/exe
مشخص شد که از UPX (Ultimate Packer for eXecutables) استفاده شده و به نظر میرسد به دنبال یک رمز عبور هستیم.
فایلهای فشردهشده با UPX را میتوان با دستور upx -d باز کرد:
└─$ upx -d -o unpacked out
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2024
UPX 4.2.2 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 3rd 2024
File size Ratio Format Name
-------------------- ------ ----------- -----------
[WARNING] bad b_info at 0x4b718
[WARNING] ... recovery at 0x4b714
877724 <- 336520 38.34% linux/amd64 unpacked
Unpacked 1 file.
└─$ file unpacked
unpacked: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=2e06e54daad34a6d4b0c7ef71b3e1ce17ffbf6db, for GNU/Linux 3.2.0, not stripped
حالا دوباره رشتهها را بررسی میکنیم:
└─$ strings -n 8 unpacked | more
AWAVAUATUSH
[]A\A]A^A_
7069636fH
4354467bH
Enter the password to unlock this file:
You entered: %s
Password correct, please see flag: 7069636f4354467b5539585f556e5034636b314e365f42316e34526933535f65313930633366337d
Access denied
xeon_phi <--- رمز عبور احتمالی
../csu/libc-start.c
FATAL: kernel too old
یک رمز عبور احتمالی (xeon_phi) و چیزی که به نظر میرسد پرچم کدگذاریشده در مبنای هگز است پیدا کردیم. این رشته با 7069636f شروع میشود که در ASCII به معنای pico است.
رمز عبور (xeon_phi) اشتباه بود، اما میتوانیم پرچم را با استفاده از دستورات تکخطی در python یا xxd به دست آوریم.
python :
└─$ python -c "print(bytes.fromhex('7069636f4354467b5539585f556e5034636b314e365f42316e34526933535f65313930633366337d'))"
b'picoCTF{U9X_UnP4ck1N6_B1n4Ri3S_5de...}'
و فلگ پیدا شد !
FLAG 
picoCTF{U9X_UnP4ck1N6_B1n4Ri3S_5de...}نویسنده