해커스쿨FTZ - 14단계

14단계에 로그인 후, 힌트를 보았더니 다음과 같다고 한다.

이번에는 main이 인자를 아무것도 받지 않고있고, 공격에 성공한다면 sh를 틀어주기 때문에 셸코드를 사용할 필요 없이 그저 check의 값만 0xdeadbeef로 수정해주면 된다!

그래서 gdb로 뜯어보았고, 그 해당 어셈블리어 명령어들을 c언어로 해독해보았다.

변수를 만드는 부분(esp의 값을 0x38만큼 빼주는 부분)을 보아 스택에 할당되는 지역변수들의 크기는 총 0x38, 10진수로 56이라고 할 수 있고, fgets 호출을 하기에 앞서 인자값 전달을 위해 스택에 ebp-56의 주소를 넣는것으로 보아 배열 buf의 시작주소는 ebp-56 이라는것을 알 수 있다.

또한 cmp부분을 보면 ebp-16과 비교하는것을 알 수 있다. 따라서 int형 변수 check의 위치는 ebp-16인것을 알 수 있다.

따라서 페이로드는 다음과 같이 구상하면 될것이다. (아무값)*40+"\xef\xbe\xad\xde"

그런데 이번에는 실행할때 인자로 값을 받는것이 아닌, fgets로 값을 받기 때문에, 리눅스의 파이프 기능을 이용해야 한다. 이와 관한 내용은 구글링을 통해 답을 얻었다.

그래서 다음과 같은 페이로드로 공격을 할 수 있었다.

(python -c 'print "A"*40+"\xef\xbe\xad\xde"';cat)|./attackme

Comments

Popular Posts