[ LOB darkelf ]
id : darkelf
pw : kernel crashed
인자는 main 함수를 통해 전달받는다.
크기 40의 버퍼가 char형식으로 선언되었고, 변수 i가 int형식으로 선언되었다. 따라서 선언된 변수의 총 바이트 수는 44 바이트이다.
main함수의 인자전달에서
argc[A] = 인자 개수가 A 개 임을 의미
argv[0] = 실행파일의 이름 ( 이름이라기보다는 실행경로의 길이가 맞을듯 하다. )
argv[1] = 첫번째 인자 ( 공백으로 구분 )
argv[2] = 두번째 인자 ( 공백으로 구분 ) 으로 나누어진다.
첫번째 if문에서는 인자가 두개 미만일때 ( 인자 전달이 아예 없을때 ) 프로그램을 종료시킨다. ( argc는 인자갯수를 의미 )
첫번째 for문은 모든 환경변수의 내용을 0으로 바꾸는 코드이다. 이 코드로 인헤 EGG SHELL이나 EXPORT를 이용하여 쉘코드를 환경변수에 올려놓고 공격하는 방법이 막힌 셈이다.
새로추가된 조건인 두번째 if문이다. 확인해보자.
if(strlen(argv[0]) != 77){
printf("argv[0] error\n");
exit(0);
처음 이 코드를 보았을때 정말당황스러웠다. 감이 하나도안잡혀서 여러가지를 돌아다니다가 답을 얻게되었다.
일단 argv[0]은 실행파일의 이름을 의미한다. 따라서 우린 실행경로의 길이를 77로 정확하게 맞춰줘야 오류없이 문제를 해결할 수 있다.
매번 하던데로 tmp디렉토리를 만들어서 실행파일을 옮기고, 조건에 맞도록 이리저리 파일을 만져보자.
첫번째 방법은 orge파일에 심볼릭 링크를 거는 것이다.
심볼릭 링크는 원본파일의 이름을 가르키는 링크이다. 원본의 내용을 그대로 따라가며, 원본이 삭제된다면 심볼릭 링크도 자기 일을 할 수 없다. 바탕화면에 있는 바로가기정도로 생각하면 편할것이다.
두번째 방법은 rename 명령어로 파일 이름을 조건에 맞게 변경하는 것이다. 첫번째 방법은 파일이름을 간접적으로 변경하는 것이고, 두번째방법은 직접적으로 변경하는 것이다. 두번째 방법은 사알짝 위험할 듯 하니 일단 첫번째 방법을 사용해볼것이다.
세번째 if문에서는 첫번째인자의 48번째 원소가 "\xbf" 인지 확인한다. 리틀엔디안방식으로 페이로드를 작성한다면, ret주소의 마지막 바이트인 48byte 째에는 무조건 "\xbf"것이므로 별 상관 없을듯 하다.
네번째 if문은 첫번째인자의 길이가 48이하인지 확인한다. 이건 argv 뒷부분에 쉘코드를 집어넣는 방식을 차단한것으로 보이는데, argv[1] 뒷부분에 쉘코드를 삽입하는 방식은 전레벨인 orc 에 포스팅하겠다.
덤으로 아래는 buffer hunter다. 짤려서 안나왔다. 버퍼의 내용을 0으로 초기화시킨다.
공격은 전레벨인 wolfman과 동일한 방법으로 하되, 실행과정에서 파일길이만 유의해주면 된다. 공격내용은 아래를 참고하자.
ln 옵션 원본파일 링크걸 파일
심볼릭 링크는 -s 옵션으로 건다.
우리는 ./파일이름 방식으로 파일을 실행하므로 ./의 길이까지 생각해서 75길이로 심볼릭 링크를 걸어준다.
링크를 걸고 strcpy전인 main+275에 브레이크포인트를 걸고 확인해보려고 했으나 문제점이 있었다.
Statring program: /home/darkelf/tmp .... 부분을 보면, 실행 경로의 길이가 심볼릭 링크길이(75)를 훨씬 초과한다. ( /home/darkelf/tmp ..부분까지 길이로 생각)
따라서 앞쪽 부분을 제외하고 심볼릭 링크를 다시걸어보면..
다음과 같이 심볼릭링크를 걸고 gdb를 이용하여 메모리를 볼 수 있다.
argv2의 부분은 bffffc08 부분부터이다.
전레벨과 같이 argv2부분을 이용하여 공격한다.
페이로드는 다음과 같다.
(77길이의 실행파일 + argv1을 이용하여 ret에 argv2의 처음주소를 덮어씀 + argv2에 내용에는 nop과 셸코드 삽입 )
위와같이 오류가 계속 나서 gdb로 코어도 뜯어보고 여러가지 확인을 다해보니 쉘이 떴다.
이와같은 방법으로 setuid가 걸려있는 폴더에 가서 똑같이 하면 된다.
이건 두번째 방법이다. rename으로 파일이름을 아예 변경해버렸다.
rename 명령어는 이렇게 사용한다.
rename (변경전 파일명) (변경후 파일명) (변경 대상)
darkelf폴더에서 원본파일을 직접 수정한것이기때문에 다음단계의 쉘이 뜨고, 패스워드도 성공적으로출력된 것을 볼 수 있다.
'System Hacking (pwnable) > hackerschool LOB Write-up' 카테고리의 다른 글
[LOB] level6 - wolfman ( write - up ) (0) | 2019.03.24 |
---|---|
[LOB] level1 - gate ( write - up ) (0) | 2019.03.22 |