상세 컨텐츠

본문 제목

[LOB] level10: vampire -> skeleton

SYSTEM HACKING/LOB Redhat

by koharin 2019. 5. 1. 20:12

본문

728x90
반응형

 

 

 

if(argc < 2) : 실행파일 이름에 주는 인자가 1개 이상 아니면 종료

=>인자를 argv[1] 이상 줘야한다.

egghunter: memset() 함수로 환경변수를 0으로 초기화한다.

if(argv[1][47] != ‘\xbf’): argv[1]48번째 원소가 ‘\xbf’가 아니면 종료. ret이 꼭 argv[1]45~48번째를 차지해야 한다.

if(strlen(argv[1]) > 48): argv[1]의 크기가 48보다 크면 종료

=>argv[1]에는 NOP+shellcode를 줄 수 없고, 주려면 argv[0]이나 argv[2]에서 줘야한다.

strcpy(buffer, argv[1]): argv[1]에 든 것을 buffer에 복사한다. 길이를 검사하지 않고 복사하므로 bufferoverflow 취약점이 있다.

memset(buffer, 0, 40): buffer 크기인 40바이트를 0으로 초기화한다.

saved_argc = argc: 인자의 개수를 saved_argc에 저장해놓는다. 모든 인자를 초기화할 때 사용한다

memset(argv[i], 0, strlen(argv[i])): 아까 저장한 인자 개수를 이용해서 모든 인자를 0으로 초기화한다.

=>memset(buffer, 0, 40)만 있었을 때는 buffer의 처음 40바이트만 초기화하므로 앞에 40바이트는 제외하고 ret 뒤에 NOP shellcode를 주면 돼서 상관없었는데, strlen(argv[i])로 인자 길이만큼을 초기화해버리므로 문제가 생겼다.

 

 

복사한 파일에서는 core dumped가 됐다일단 ret에 넣을 주소를 찾아보자.

(다 초기화되겠지만 일단 되니까 해보고 생각하자.)

 

 

역시 보면 argv가 다 초기화된 것을 확인할 수 있다.

 

 

 

x/200s로 확인해봤을 때도 보면 argv를 제외한 부분은 모두 초기화된 것을 확인할 수 있다. argv니까 파일 이름도 초기화되는 것 같다. 없는 것을 보니.

인자로 주지 않는 방법이 있을까?

아예 파일이름을 바꿔도똑같을 것 같은데…(처음엔 이렇게 생각했는데 파일이름을 바꿔야 했다!)

 

 

Leave 부분의 주소에서 breakpoint를 잡아보자.

 

 

여기에 argv[1]이 조금 잘려있는 것을 확인할 수 있고

 

 

x/3000s로 확인하니까 끝부분에 파일 이름이 남아있는 것을 확인할 수 있다.

이것은 실행했을 때 명령어가 남아있는 것을 의미한다.

따라서 파일이름에 NOPshellcode를 주면 된다. 위에서 보면 ret부분은 안 없어지는 것을 보니 ret에 주소를 문제없이 넣을 수 있을 것이다.

쉘코드는 \x2f가 없는 것을 사용해야 한다.

 

 

Core 파일이 생성되었으니 ret에 넣을 주소를 찾아보자.

$ gdb -q -c core

(gdb) x/3000s $esp

 

 

./부분을 제외한 “\x90” 위치의 주소를 선택하면 된다.

 

 

0xbfffff9a? 주소를 사용해보자.

 

주소가 제대로 안 구해진 것 같으니 이번엔 더 정확하게 바이너리 상태로 주소를 구해보자.

(주소가 제대로 안 구해진 것이 아니었다...뒤에 나올 것)

 

 

 

 

 

“\x90”shellcode가 들어가있다. NOP이 위치한 0xbfffffb0을 주소로 선택해보자.

 

 

왜 안 되나 했는데...

 

 

쉘코드가 너무 스택의 바닥에 가까우면 제대로 작동하지 않는다고 한다.

따라서 쉘코드 뒤에 NOP을 더 채워봤다.

 

 

 

 

 

0xbfffff30ret에 넣을 주소로 선택하겠다.

이번엔 쉘코드가 NOP으로 충분히 바운딩되서 쉘코드가 제대로 작동할 수도 있을 것 같은데…!

 

 

뒤에 NOP100만 줘도 쉘코드가 충분히 바운딩되어서 작동하는데는 문제가 없나보다.

임시 디렉터리에서는 성공! 이제 홈디렉터리에서 원본파일의 심볼릭 링크 파일로 해보자.

 

 

 

아까 만든 파일에 인자만 주면 된다.

./skeleton `python -c ‘print “A”*44+”\xff\xff\xff\xff”’`

 

이것처럼 생성한 NOP+shellcode가 든 파일도 파일이름이므로 앞에 ./만 붙이면 실행하는 명령어이다.

./`python -c ‘print “\x90”’`* `python -c ‘print “A”*40+”B”*4+”\x30\xff\xff\xbf”’`

 

 

홈 디렉터리에서 원본파일에 대한 심볼릭 링크 파일로 공격해도 성공!

“shellcoder”

 

728x90
반응형

관련글 더보기