상세 컨텐츠

본문 제목

[Write-up] Level 19

Pwnable Write-Up/01.hackerschool F.T.Z

by RACC8N 2019. 12. 10. 00:12

본문

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으로 올라가 보자.

'Pwnable Write-Up > 01.hackerschool F.T.Z' 카테고리의 다른 글

[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

관련글 더보기

댓글 영역