wolfman의 소스코드를 한번 보도록 하겠습니다.

orc의 소스코드와 상당히 유사합니다.

차이점이라면 마지막에 buffer hunter라고 해서 memset(buffer, 0, 40)으로 buffer를 초기화해주는 코드가 추가 되었습니다.

buffer hunter가 적용 되어 있으니, buffer에 쉘코드를 넣는 방법은 안될듯 합니다.

그렇다면 orc를 풀었을 때와 마찬가지로 argv[2]에 쉘코드를 넣는 방식을 통하여 문제를 풀도록 하겠습니다.

orc와 동일한 방법으로 ebp를 구하고 페이로드를 작성했습니다.

(goblin->orc 풀이 : http://grayfieldbox.tistory.com/entry/LOBLord-Of-BufferOverflow-goblin-orc)


작성한 페이로드를 입력해 보겠습니다.

ret 주소가 0xbffffbf0이면 될줄 알았는데 뜨질 않았네요.


core dump가 생성 되었으니 core dump를 이용해 문제를 해결하겠습니다.

core dump를 이용해 디버깅을 열었더니 0xbffffc04에 있는 값이 무엇인지 알수 없다고 나오네요.

그럼 0xbffffc04의 값이 무엇인지 확인해 봐야겠죠.

확인결과 ret가 들어있는 부분이었네요. 그 뒤부분으로 NOP 썰매가 들어가 있는 것을 확인 할 수 있습니다. 그럼 ret에 넣어준 값을 NOP이 들어있는 주소로 변경해 주면 될듯 하네요.


Ret0xbffffc14로 바꿔 주도록 하겠습니다.

빙고 쉘이 떳습니다. Setuid가 걸린 wolfman이 아닌 복사한 파일에 해서 wolfman권한이 없을테니 원본 wolfman에 입력하여 비밀번호를 획득하도록 하겠습니다.

정상적으로 wolfman의 쉘을 획득하였습니다. 비밀번호는 love eyuna이네요.

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입니다.

LOB 3번째는 cobolt를 잡고 goblin으로 레벨업 하는 문제입니다.

 

우선 goblin의 코드를 확인해 보도록 하겠습니다.

LOB 2번째와 마찬가지로 버퍼의 크기가 매우 작고, 바뀐 점이라면 매개변수를 통한 입력에서 표준입력으로 변경되었네요.

 

버퍼의 크기가 작기때문에 환경변수에 쉘을 등록하고, 그 주소값으로 ret를 덮어야 할것 같습니다.

 

우선 gdb를 통해 ret를 덮기 위해서 필요한 입력 수를 확인해 보도록 하겠습니다.

필요한 입력의 크기는 20byte임을 알 수 있네요.

 

이제 환경변수에 쉘코드를 입력하고 주소값을 확인하도록 하겠습니다.

0xbffffe31에 쉘코드가 올라가 있네요.

20byte입력을 하고 쉘코드 주소를 입력해 ret를 덮도록 하겠습니다.

됫네요. 정상적으로 goblin의 쉘을 획득 하였습니다.

 


goblin의 패스워드는 hackers proof이네요.

+ Recent posts