취약한 파일을 실행하면 아래와 같이 16진수의 어떤 값들을 뿌려준다. input을 바꾸어 가면서 여러번 입력해 보았지만 결과값은 전부 같은 것이 출력 되는것 같다.
setuid 가 걸린 파일은 gdb로 분석이 안되므로 /tmp/ 디렉토리(쓰기가 가능한 디렉토리) 에 복사하여 setuid 를 없애고
k1rha@ubuntu:~/zANruhPR_public_html/vortex/vortex1$
이후 파일을 다운받아 IDA 의 헥스레이를 이용하여 간단하게 복구를 해보았다.
코드는 다음과 같다 .
while 문을 통해 글자를 한글자씩 받는다.
그리고 그 문자열이 -1 (EOF) 일때까지 돌리고 EOF이면 종료 된다.
문자열이 헥사코드 10 (\n) 이면 버퍼의 주소값부터 512개를 출력 시킨다.
그리고 문자열중 \\ (헥사코드 c5 를 문자열로 바꿈)이 나오면 포인터를 하나 감소시킨다(문자이므로 1바이트 임)
그리고 그외에는 그 포인터의 값이 256 값일때 (0xff와 & 연산한 부분의 값이 ) 0xCA 와 같을때 setuid 를 셋팅하고 /bin/bash를 실행해 준다. 때문에 ptr을 257번 빼준뒤 ca를 넣어서 256값이 ca가 되도록 해줘야 한다.
PTR은
Payload 를 그려보면
[ ,,, ][x (변수)][ buff[0--> 256] ][e()][sfp][ret][argc][argv][env] 이다.
^ (ptr 포인터 부분)
처음 OS 환경이 x86인 intel CPU 이기에 메모리주소값은 little endian 방식을 취하므로 buff 에서 ret 으로 갈수록 작은 주소값을 가진다.
이때 x 가 \\ 가 들어올때마다 ptr 이 하나씩 감소한다. 즉 buff[0]부터 하나씩 포인터가 감소하여 buff[256]을 지나는 순간의 값이 0xCA가 되면 되는것이다.
인자값 전달은 perl 을 사용하였다. 받는 값이 getchar 이니, perl로 출력된 값을 그대로 전달하면 될것이다.
쉘이 떨어지긴하는데 바로 exit가 되버린다. 이럴때 ;cat 명령어와 함께 사용해 주어, 멈추게 하는 방법을 hackerschool 문제때 사용했으나 이경우엔 먹통이 되어 아무 명령도 실행 할 수 없었다.
검색을 해본결과 아래와 같은 부분을 찾을 수 있었다.
========================================================================================================
리눅스에서 사용되는 |(파이프) 명령어는 4096바이트를 차지한다는 것이다.
즉, 4096바이트 크기를 넘지않는 4096바이트 안에 포함된 모든 입력값들은 파이프 명령어가 꿀꺽하기 때문에 쉘에 명령어가 전달이 되지 못한다는 것이다.
즉, 쉘을 획득한 상태에서 파이프로 인자를 넘기려면 4096이상 넘겨야 쉘코드로 인자를 넘겨 실행하는 것이 가능하다는 말이군!
[출처] Vortex Level1|작성자 hks9999
===========================================================================================================
좋아~ 일정 바이트를 넘겨야 한다 이거군..
테스트를 해보자.. 우선 패스워드는 /etc/vortex_pass/에 있다고 했으니 그곳을 읽는 걸로 바로 명령어를 쳐보자
위와같이 a를 3838개를 넣었을때 command not found 에서 명령어 a가 다 사라졌다. 그리고 vortex2의 패스워드를 얻을 수 있었다.
PW : 23anbT\rE
'War_Game > Vortex' 카테고리의 다른 글
[vortex] level3 -> level4 (0) | 2013.10.10 |
---|---|
[Vortex] level0 -> level1 (0) | 2013.07.29 |
[vortex] level2 -> level3 (0) | 2012.03.31 |