Wargame/FTZ
FTZ Level17
Sqix_ow
2018. 7. 20. 10:53
저번에는 shell 함수가 있었는데 사라졌습니다. 대신 setreuid가 call 호출 이전에 주어졌네요.
그렇다면 RTL 기법을 활용해서 문제를 해결해 보겠습니다.
objdump, strings 명령어를 이용해서 system(), /bin/sh의 주소를 구합니다. libASLR이 없으니 저 주소는 고정적입니다.
call의 위치에 system() 함수의 주소를 넣어 놓고, fgets에 들어가는 인자를 조작해서 call 직전 stack의 최상단에 /bin/sh 주소를 넣으면 system(/bin/sh) 호출이 됩니다.
이를 위해서는 어셈을 한번 봐야겠죠
gdb 인자로 값을 밀어넣고 실행을 시켜 보도록 하겠습니다.
*call이 가리키는 함수를 호출하기 직전에 스택의 맨 위에 buf의 첫 4bytes가 존재하므로, 이 부분을 /bin/sh로 바꿔주고, call에 시스템 함수의 주소를 넣습니다.
이렇게 하면 setreuid가 실행된 상태에서 /bin/sh이 실행되어 상위 권한을 얻을 수 있습니다.
$(python -c 'print "\xa4\x7e\x12\x42" + "A" * 36 + "\xc0\xf2\x03\x42"'; cat) | ./attackme