level 11
실행파일 하나, hint에는 strcpy 함가 눈에 띄네요. 또한, main 함수로 인자가 들어가는군요.
attackme라고 이름이 지어진 것을 보니 이 실행파일의 소스코드인가 봅니다.
BOF 취약점이 발생할 수 있는, 입력 값을 검증하지 않는 함수들을 많습니다.
그 중에 하나가 strcpy이죠.
str 변수의 크기를 생각하지 않고 그냥 복사만 수행합니다.
그렇게 되면 ret 주소를 덮을 수 있겠죠.
일단 tmp 파일로 복사해서 gdb를 통해 디버깅해보겠습니다.
intel을 선호하기에 setting 해주고.
이게 이 소스코드의 어셈블리어입니다.
str 변수가 256바이트인 반면, main+3에서 공간 264바이트를 할당하는 것을 보면 8바이트가 dummy인 것을 확인할 수 있습니다.
그러고는 main+48에서 strcpy를 call할 때 위에 보면 인자로 $ebp-0x108의 주소를 가져오는군요.
이제 ret 주소를 변조시킬 수 있을 것 같습니다.
256바이트(str) + 8바이트(dummy) + 4바이트(SFP, Saved Frame Pointer) + 4바이트(RET, RETurn adress)
ret을 덮는데 두 가지 방법이 있죠.
첫 번째는 직접 인자로 쉘코드를 전달.
두 번째는 환경변수를 통한 쉘코드 전달.
main 함수내에 쉘코드를 던져서 NOP을 통해 내려오게하는 방법도 있지만, ASLR로 인해 main 함수의 시작 주소가 계속 변화하므로 저는 argv[1]의 주소를 알아내 ret에 덮겠습니다.
\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
제가 이용할 쉘코드는 위와 같습니다.
exit()가 없는 system("/bin/bash")만 있는 코드입니다.
25바이트입니다.
출처 - https://xerxes-break.tistory.com/212
argv의 주소를 알아내봅시다.
41414141이 연속으로 들어가있는 부분을 찾으면 되겠죠?
찾았네요.
0xbffffad8의 주소를 사용하겠습니다.
어차피 NOP Sled를 탈거니깐요 ^.^
성공적으로 쉘을 획득했습니다.
환경변수를 이용하는게 안되는데 왜 안되는지 모르겠네요..
나중에 알아봐야겠습니다 ^^