orc의 소스파일을 확인해 보도록 하겠습니다.


egghunter라고 해서 환경 변수 메모리를 초기화 하는 코드가 보이네요.

그리고 첫번째 매개변수의 48번째 데이터가 \bf를 확인하는 코드도 보입니다.

LOBgcc의 버전이 2.91.66이므로 스택에 더미가 생성이 되지 않고 따라서 buffer[40]은 스택에서 40bytes만큼 공간을 차지할 것입니다. 그러면 입력시점부터 ret까지의 거리는 44bytes가 되겠죠.

 

그럼 현재까지 습득한 정보들을 정리해 보도록 하겠습니다.

1.    환경변수를 이용한 쉘코드 입력 불가

2.    첫번째 인자 48번째 데이터는 \xbf

3.    입력시점부터 ret까지 거리는 44bytes

 

이 문제 또한 쉘코드를 입력하고 ret주소를 쉘코드가 들어있는 메모리의 주소로 변경하여 풀면 될듯 합니다.

입력을 해줄수 있는 메모리는 두가지가 있습니다. 첫번째로 40byte크기의 버퍼안에 쉘코드를 입력해 줄 수 있고요, 두번째로 두번째 인자로 쉘코드를 넘겨 줄 수 있습니다.


두번째 방법을 이용해 문제를 풀도록 하겠습니다. 

그렇다면 입력 페이로드는 다음과 같이 되겠네요.

 

./orc `python –c ‘print “A”*44 + “argv[2]주소”’` `python –c ‘print “쉘코드”’`

우선 argv[2]의 주소를 한번 알아보도록 하겠습니다.

 

argv[2]ebp를 기준으로 8byte + strlen(argv[1]) 만큼 떨어져 있습니다.

argv[1]의 입력값이 48byte이므로 ebp+56byte지점이 argv[2]지점이 됩니다. 그럼 ebp값을 구해보도록 하겠습니다.

 

Gdb로 파일을 열어 프롤로그가 지난 지점에 중단점을 걸고 레지스트리를 확인해보겠습니다. 이때 중요한건 입력값에 따라 스택의 메모리 주소가 바뀔수 있기 때문에 최대한 입력값을 동일하게 줘서 실행해야 한다는 것입니다.

 

main+3지점에 중단점을 걸고 페이로드를 넣어 실행하도록 하겠습니다.

ebp의 주소는 0xbffffa68이네요. 그럼 argv[2]의 주소는 0xbffffaa0이라고 예상할 수 있습니다.

 

그럼 페이로드의 주소값을 반영해 입력해 보도록 하겠습니다.

정상적으로 쉘이 떳네요.

만약 쉘이 뜨지 않고 segmentation falut(core)라고 뜨신 분들은 gdb –q orc core명령어를 통해 core 디버깅 해서 ret에 들어갈 주소값을 수정해 주시면 됩니다.

 

이제 원본 파일에 시도해 보도록 하겠습니다.

orc권한의 쉘이 떳네요.

 


orc의 비밀번호는 cantata입니다.

+ Recent posts