fkillrra 2018. 1. 6. 20:52

all clear 까지 얼마 안남았네용 ㅎ


풀이 시작합니다.



로그인 후 힌트파일을 열어보면 이와 같은 소스코드가 출력됩니다.


기존 문제와 다른 부분은 setreuid()함수가 없는것입니다.


하지만 ls -al attackme 로 attackme의 권한을 확인해 보면



이렇게 setuid가 걸려있는것을 확인 할 수 있습니다.


또한 gets()함수에서 문자열의 길이를 지정하지 않는점을 이용하여 bof 공격을 할 수 있습니다.



스택구조를 확인하기 위해 gdb로 disassemble 해보면


힌트파일의 소스코드와는 다른 40을 할당한것을 알 수 있습니다.


dummy 값이 20이 들어간것이죠.


이제 공격 시나리오를 생각해보면


의미 없는 값을 40바이트로 dummy와 버퍼를 덮어고, SFP 를 4바이트로 덮고, 마지막 RET에 쉘코드의 주소로 덮어주면 될것같습니다.


하지만 여기서 주의할 점이 있죠.


아까도 말씀드렸듯이 setreuid()가 없기때문에 쉘코드에 이를 포함 시켜줘야한다는점입니다.


저는 그 쉘코드를 구글에서 가져왔습니다 :)


그 쉘코드를 환경변수로 등록하고, 그 환경변수의 주소를 알아내어 RET에 덮어주면 성공합니다.



쉘코드를 fkillrra 라는 이름으로 환경변수로 만들어주고..



tmp 디렉토리로 이동하여 fkillrra라는 이름의 환경변수 주소를 구하는 프로그램을 만들어줍니다.



fkillrra 환경변수의 주소를 알아내고..



페이로드를 A*40 (buf[20]+dummy(20)) + SFP (4) + RET (환경변수 주소)


이렇게 작성해주면 쉘을 level20으로 띄울 수 있습니다.


이상 풀이를 마칩니다.







반응형