sweetchip's blog




안녕하세요


해커스쿨 버퍼 오버 플로우 원정대, 레벨 1을 풀이해보도록 하겠습니다.


제일 먼저 putty 로 접속합니다.




타겟은 gremlin 이고 소스파일 gremlin.c 와 함께 있습니다.



- gremlin

- 간단한 버퍼 오버플로우 가 힌트이고,


버퍼라는 char 배열이 256바이트 만큼 선언되어있습니다.


인자가 2개 미만이라면 인자 에러를 낳고 종료합니다.


만약 2개 이상이라면 strcpy 로 argv[1]로 받은 인자를 buffer 에 복사하고


buffer 의 내용을 출력합니다.


여기서 취약점이 나는 부분은 바로 strcpy 입니다.


strcpy는 넣을때 얼마나 넣을까 생각 하지 않고 그냥 무식하게 넣어버려서 취약점이 있습니다.


strncpy를 사용 하는 것이 그나마 안전합니다.




gdb로 살펴보면 main 3 이 char buffer 이라는것을 알수 있고


256바이트 만큼 선언이 되어있다는것을 알수 있습니다 [16진수 100은 10진수로 256]


여러가지 작업을 한후 리턴합니다.



저는 이번 문제를 환경변수로 풀이해보겠습니다.


다른 프로그램을 또 생성해서 그곳에 쉘코드를 저장후 리턴 어드레스를 그쪽으로 돌리던,


환경변수로 하던, 원본 소스를 조작하던 여러가지 방법이 수없이 많습니다.


제가 사용한 쉘 코드는 인터넷에 돌아다니는 25바이트 짜리 쉘코드입니다


export로 sc 라는 환경변수에 저장합니다. 충분히 여유를 줘서 nop을 120만큼 주고 쉘코드를 올려놨습니다.



address.c 라는 소스를 짜려고 합니다.



소스의 내용은 getenv로 환경변수 sc의 주소를 구하는것입니다.


사진엔 없지만 환경변수의 주소는 0xbffffe61 입니다.


자 이제 계산을 해봅시다.


LOW | buffer (256Byte) | SFP(4byte) | RETADDR(4byte) | HIGH


인 형태의 스택에 260 만큼의 nop 을 집어넣고 리턴 어드레스를 방금 얻은 0xbffffe61 로 변조하는 시나리오를 짜보겠습니다.


gcc버전이 낮은 버전이라 더미는 붙지 않은 상태입니다.


사진엔 없지만 BASH2 를 실행시킨 상태입니다


\xff 나 \x00 을 공백으로 볼수 있는 bash의 약점을 보완시킨것이 bash2 입니다.


이제 Exploit 을 시작합니다.



./gremlin `perl -e 'print "\x90"x260,"\x61\xfe\xff\xbf"'`


펄스크립트를 이용해서 프로그램을 공격했습니다.


파이썬 스크립트를 이용한다면 다음과 같이 할수 있습니다


./gremlin `python -c 'print "\x90"*260 "\x61\xfe\xff\xbf"'`


[실험은 안해봐서 잘 모르겠네요 ^^]




결과는 Exploit 에 성공했습니다.


이것이 제가 처음으로 성공한 쉘코드를 이용한 시스템 해킹입니다... 기쁘네요 :)




**** 저는 이제 배운지 얼마 몇개월 안된 초보입니다 틀린것이 있으면 지적 해주세요 :)

신고

댓글 1