HINT : attackme의 소스코드
코드를 보면, gets 함수로 buf에 받아 print 해준다.
setreuid 해주는 부분도 없고, /bin/sh를 실행시켜주는 부분도 없다.
아는 정보가 없으니 Return to Library 기술을 써보자.
우선 buf부터 ret 까지의 거리를 알아 보자.
buf(40) + sfp (4) + ret (4) 임을 알 수 있다.
main 함수가 끝나면 setreuid(3100,3100)을 해준 다음, system("/bin/sh")를 해주면 될 것 같다.
우선 lib에서 setreuid와 system 함수의 주소를 알아 보자.
두 함수의 주소를 알았다.
setreuid를 사용할 때는 함수의 인자값이 2개가 필요하다.
따라서 여기서 가젯이 필요하다.
attackme에 대한 가젯을 구해보자.
필요한 인자는 2개이므로 0x804849d 주소를 쓰면 될 것 같다.
이제 마지막으로 필요한건 system함수의 인자인 "/bin/sh" 문자열이 들어있는 주소 값이다.
/bin/sh가 들어있는 주소를 알았다.
정리해 보면,
현재 buf (40) + sfp (4) + ret (4) 상태인데, ret을 setreuid시작 주소로 변경하면, setreuid가 실행 될 것이다.
하지면 여기서 setruid의 인자는 2개이므로 pop pop ret 가젯이 필요하다.
따라서 buf (40) + sfp (4) + ret (4) (setreuid) + ppr (4) + arg1 (4) + arg2 (4) + setreuid's ret (4) 가 된다.
setreuid가 끝나면 바로 system 함수를 실행 시켜야 하므로 setreuid's ret에는 system 함수가 들어간다.
system 함수의 인자는 한 개 이므로, 추가 가젯은 필요 없다.
따라서 buf (40) + sfp (4) + ret (4) (setreuid) + ppr (4) + arg1 (4) + arg2 (4) + setreuid's ret (4) (system) + (4) + arg1(4) 가 된다.
payload를 작성해서 쉘을 따보자.
쉘을 성공적으로 땄다.
이제 level 20으로 올라가 보자.
[Write-up] Level 20 (0) | 2019.12.10 |
---|---|
[Write-up] Level 18 (0) | 2019.12.09 |
[Write-up] Level 17 (0) | 2019.12.07 |
[Write-up] Level 16 (0) | 2019.12.07 |
[Write-up] Level 15 (0) | 2019.12.07 |
댓글 영역