[FTZ] level11 풀이!!!
로그인해서 ls로 무슨 파일들이 있는지 확인해봅니다
hint 파일과 attackme 파일이 있네요
file 명령어로 파일을 확인해보니 32bit짜리 실행 파일이라 하네요
한 번 실행해 보겠습니다
오류가 뜨네요
hint 파일이 소스코드인 것 같으니 한 번 읽어보도록 하겠습니다
./attackme 뒤에 인자값이 없어서 Segmentation fault 오류가 일어났네요
인자값이 str 변수에 저장되고 그 값을 출력하네요
쉘을 실행시켜주는 함수가 딱히 없으니 직접 쉘코드를 넣어줘야 할 것 같습니다
strcpy()로 str를 입력 받는 곳에 쉘코드를 삽입하고 str의 주소를 넣어주면 쉘코드가 실행되므로 gdb로 주소를 알아보도록 하겠습니다
strcpy()의 호출이 끝난 후에 bp를 걸어 변수 str 주소를 구해보겠습니다
저희가 넣어준 값이 0xbfffed40부터 있으므로 저 주소가 str의 주소인 것을 알 수 있습니다
최종 페이로드를 "쉘코드" + "\x90"*243 + "str 변수의 주소"로 하면 익스가 성공할 것 같습니다
Payload = ./attackme `python -c 'print "\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" + "\x90"*243 + "\x40\xed\xff\xbf"'`
페이로드대로 익스를 시도해봤더니
Segmentation fault가 또 떴습니다
뭔가 문제가 있나 다시 gdb로 확인해보니
세상에나 마상에나 주소가 바뀌어 있습니다
ASLR 보호 기법 땜에 바뀐 것 같네요
이럴 때는 RTL이란 공격 기법을 사용하면 됩니다
RET을 Library 함수의 주소로 리턴해서 그 함수를 실행할 수 있습니다
한 번 Library의 system 함수의 주소와 /bin/sh의 주소를 구해와서 페이로드에 넣어 익스를 해보도록 하겠습니다
각각의 명령어로 system(), /bin/sh의 주소를 구했습니다
이제 페이로드를 짜보도록 하겠습니다
페이로드 = NOP*268 + system() 주소 + NOP*4 + /bin/sh 주소
최종 Payload = ./attackme `python -c 'print "\x90"*268 + "\x40\xf3\x03\x42" + "\x90"*4 + "\xa4\x7e\x12\x42"'`
익스가 성공했슴다!