처음부터 무시무시하다. 리버싱이 필요하다니....
우선 cat, vi, gdb 모든 명령어로 시도해봤을때 글자가 깨지거나 퍼미션 불가가 떴다.
다만 실행했을때는 이런 문구가 출력되었다. 무슨 말일까?
또 다시 write-up을 참고한다.
IDA를 설치하여 flag 파일을 넣으라고 한다.
UPX로 패킹되었다는 표시를 찾을 수 있었다.
Q. 다른 Write-up을 보면 거의다 게씽해서 때려맞추던데, 실제로 어떻게 알 수 있을까??
이 문제는 차차 알아보도록 하자.
우선 UPX에 대해서 알아보자
UPX(Ultimate Packer for eXecutables) : 여러 운영체제에서 수많은 파일 포멧을 지원하는 오픈 소스 실행 파일 압축 프로그램.
sudo apt install upx 를 이용하여 upx설치후,
upx -d flag를 해주었다.
그리고 flag를 gdb로 돌려봤는데 어떻게 하는 지 알수없었다.
간단하게 보여주는 IDA를 리눅스에 설치하여 보는데도....뭐가 뭔지....
우선 GDB로 해결하는 법을 알아보도록 하자.
0x0000000000401184 <+32>: mov rdx,QWORD PTR [rip+0x2c0ee5] # 0x6c2070 <flag>
이부분이 의심스럽다 집중적으로 보도록 하자.
요렇게 해결할 수 있다고 한다. (모르는 게 엄청 많은데 밑에서 정리할 것)
IDA는 아직 사용법이 익숙치 않아서 잘 모르겠다. 나중에 천천히 배워야 겠다.
우선 모르는 것을 정리해보면...
call은 함수의 호출이다. 그렇다면 flag가 있는 mov와 rdx는 무엇일까?
mov : 데이터를 복사하는 명령어다. (MOVE가 아니다!!!)
- 레지스터에서 같은 사이즈의 데이터끼리만 복사 가능하다.
- 메모리에서 메모리로 복사가 안된다. 고로 레지스터를 통해서 복사해야한다.
- 세그먼트 레지스터의 내용은 범용 레지스터가 아닌 곳으로 이동 가능. 반대는 불가. (뭔소리야;;)
ex) mov eax, ebx : ebx의 값을 eax로 복사한다.
1. EAX(Extended Accumulator Register)
산술(덧셈, 곱셈, 나눗셈 등), 논리연산을 수행하며 함수의 반환값이 저장. 호출 함수의 성공 여부, 실패 여부를 쉽게 파알할 수 있으며, 반환값을 쉽게 얻어올 수 있다. 32bit로 구성되어 있으며, EAX를 반으로 쪼개면 AX(16bit)가 됨.
또 다시 AX를 반으로 쪼개면 AH, AL로 나뉘고 각자 8bit를 가지게 됨.
2. EBX(Extended Base Register)
이 EBX레지스터는 메모리 주소를 저장하기 위한 용도로 사용된다. 다른 레지스터들과 마찬가지로 32bit로 구성되어 있으며, EBX를 반으로 쪼개면 BX(16bit)가 된다. 그 BX를 또 반으로 쪼개면 BH, BL로 나뉘고 각자 8bit를 가지게 됩니다.
3. ECX(Extended Counter Register)
카운터 레지스터이다. 주로 반복 명령어 사용시 반복 카운터로 사용되는 레지스터. ecx레지스터에 반복할 횟수를 지정하고, 반복 작업을 수행.
4. EDX(Extended Data Register)
다른 레지스터들과 똑같다. 이 EDX레지스터는 EAX레지스터와 같이 부호 확장 명령 등에 쓰이고 큰수의 곱셈 또는 나눗셈 등의 연산이 이루어질때 EDX 레지스터가 사용된다. 32bit로 구성되어 있고 EDX를 반으로 쪼개면 DX(16bit)가 된다. DX를 또 쪼개면 DH(4bit), DL(4bit)가 된다.
5. ESI(Extended Source Index) // EDI(Extended Destination Index)
ESI는 데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장된다.
EDI는 복사 시에 목적지의 주소가 저장된다.
6. ESP(Extended Stack Pointer) // EBP(Extended Base Pointer)
ESP는 스택 프레임의 끝 지점 주소(스택의 가장 아랫부분, 스택의 마지막)저장. PUSH, POP 명령에 따라 ESP의 값이 4바이트씩 변한다.
EBP는 스택프레임의 시작 지점 주소(스택의 가장 윗 부분, 스택의 처음)가 저장. ebp레지스터는 현재 사용되는 스택 프레임이 소멸되지 않는 이상 EBP레지스터의 값은 변하지 않음.
모든 레지스터들은 상황에 따라서 다른 용도로 쓰일 수 있다. (EAX 대신 ECX를 사용할 수도 있음)
Q. 레지스터들은 정리 했지만 rdx와 같은건 뭘까?
> 32bit환경에서는 E로 시작하고 64bit환경에서는 R로 시작하는 단순한 이유다
번외로 amd cpu와 intel cpu의 표기 방법도 다른데 그것은 나중에 기회되면 정리해 보도록 하자
Q. 리눅스에서 어떤 패킹이 됬는지 확인하는 방법은 없을까??
아이다를 써야만 하는듯??
'pwnable' 카테고리의 다른 글
[Toddler's Bottle] col (0) | 2024.05.11 |
---|---|
[Toddler's Bottle] bof (0) | 2024.05.11 |
[Toddler's Bottle] passcode (0) | 2024.05.11 |
[Toddler's Bottle] random (0) | 2024.05.11 |
[Toddler's Bottle] mistake (0) | 2024.05.11 |