본문 바로가기

System Hacking

[드림핵] Return to Shellcode 풀이 - 티스토리

 

문제 코드이다

 

 

대충 보자면 buf를 입력 받는 부분에서 BOF가 발생하고, 이를 통해 카나리 릭을 하여 ret에 buf주소를 덮어씌워 쉘 코드를 실행 시키면 된다

 

 

지금까지 배운 것들에 점점 살이 더 덮여지는 느낌이라 문제 자체는 어렵지 않고 배운 개념을 확인하기에 좋은 문제였다고 생각한다!

 

 

 

 

실행결과 buf 주소는 출력하고 있으므로 따로 구하지 않아도 된다

 

 

또한 buf와 rbp의 거리도 출력해주고 있다

 

 

 

gdb로 뜯어본 내용을 살펴보면

 

 

함수의 앞부분에서 fs레지스터에 랜덤으로 배정된 값을 rbp - 8인 카나리가 있는 주소에 저장 시켜주고 있다

 

 

또한 함수의 마지막 부분에서 카나리에 저장된 값과 fs레지스터 (초기 카나리 값을 랜덤 배정해둔 곳)의 값과 비교해서 같은 같이면 정상 진행하고 다른 값이면 지정된 함수 호출을 통해 프로그램을 강제종료 시키는 모습을 볼 수 있다

 

 

이렇게 카나리가 정상 작동 하고 있는 것을 확인했다

 

 

main함수 stack frame

 

 

카나리는 64비트 환경에선 널 바이트 포함 8바이트의 값으로 실제 7바이트의 값을 가지고 있다

ex) 0xaabbccddeeffgg00의 형태

 

 

메모리에 저장 시 리틀엔디언 방식으로 널값이 낮은 주소로 저장 되는 것을 고려하여

첫 입력에서 buf에 89바이트 만큼의 값을 삽입해서 널값을 제거 후,

카나리 값을 구한 뒤,

두 번째 입력에서 쉘코드를 포함한 페이로드를 집어넣으면 된다!

 

 

 

pwntools 사용법이 미숙해서 구글링을 2시간 넘게 하다가 포기하고 찾아봤다..

 

 

정리한 후 pwntools  사용법 익숙해지자 얼른..

 

 

* 내가 pwntools 작성 시 헷갈렸던 점들

 

- 카나리 값 받을 때 패킹된 상태로 오기 때문에 널값 포함해서 7바이트만 받아준 후 언팩 시킨다!

 

- 마지막 페이로드 전송 시 sendline을 한 이유는 gets함수 특성상 '\n'까지 읽는 특성을 고려

 

- buf주소 받을 시 문자열로 넘어오기 때문에 패킹을 위해 16진수 정수형으로 변환!

 

 


느낀점

 

- 재밌다