해당 문제는 리버싱 문제로 바이너리만이 주어진다. 바이너리 실행 결과는 다음과 같다
--------------------------------- 여담이 길어요 죄송합니다.. ---------------------------------
그래서 나는 바이너리를 리버싱 해야겠구나 생각하고 IDA를 켜서 수십 시간 동안 꼬리에 꼬리를 무는 함수들을 타고 내려가며,
'아니 Toddler's Bottle'이라면서 너무 어려운 거 아니야..?'
라고 생각하며, 엄청난 삽질을 했다.
그러나 아무리 생각해도 뭔가 이상했다.
main함수는 보이지도 않고 해당 함수들을 타고 들어가면 이상한 내용의 코드들과, 꼬리에 꼬리를 무는 또 다른 이상한 함수들을 호출하는 것의 연속이었다.
pwndbg로 확인해도 결과는 똑같았다. malloc()과 strcpy()를 이용해 flag를 적어놓는다더니 malloc()과 strcpy()는 커녕 main()조차 보이지 않았다.
그래서 나는 뭔가 잘못되어도 단단히 잘못됐다는 걸 깨닫고, pwntools를 이용해 보호 기법을 확인해보기로 했다.
그 결과 평소에 보지 못 했던 내용이 있었다.
Packer: Packed with UPX
'엥..?' 하는 생각과 함께 UPX가 뭔지 구글에 쳐봤다.
https://www.esecurityplanet.com/threats/upx-compression-detection-evasion/
UPX를 간단히 정리해보자면,
[1] 무수히 많은 타입의 파일들을
[2] disassemble 과정을 방해하도록 안전하게(Malware 탐지 또한 회피할 수 있어 악의적으로 사용되기도 한다고 한다..)
[3] 파일 크기를 획기적으로 줄이며 압축해준다
이 UPX로 flag라는 바이너리가 packed 되어있기 때문에 당연히 리버싱이 그토록 힘들었던 것이다.. 😢
이제 upx를 설치해 flag 바이너리를 unpack 시키고 다시 리버싱을 해보자
UPX는 다음 링크를 통해 설치할 수 있다.
https://github.com/upx/upx/releases/tag/v4.0.2
설치 후 다음 명령어를 통해 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 |