본문 바로가기
C, HackerSchool FTZ

해커스쿨 FTZ level16 (HackerSchool) 풀이

by 오렌지마끼야또 2020. 12. 28.
728x90
반응형

 

 

 

 

바로 hint부터 보자

 

level17의 uid로 쉘을 열어주는 shell() 함수가 있고

printit() 함수가 정의되어 있다.

하지만 main()에는 printit() 함수만 call() 한다.

fgets() 함수의 BOF 취약점을 이용해서

call() 하는 부분에 shell() 함수의 주소값을 덮어씌워보자.

 

 

1. call() 함수가 어디에서 실행할 함수를 불러오는지 주소값 알아내기

 

gdb를 해보자.

 

set disassembly-flavor intel 코드가 뭔지 궁금한 사람

더보기

------------------------------------------------------------------------------------------------

set disassembly-flavor intel 은 어셈블리코드를 intel문법으로 바꿔주는 명령어이다.

어셈블리코드를 작성하는 문법으로 at&t, intel 두가지가 있다.

일반적으로 gdb를 하고서 보이는 코드는 at&t 문법이다.

상황에 따라 intel 문법으로 보는게 더 편할때 사용하고 있다.

------------------------------------------------------------------------------------------------

 

main+3 : 0x38 = 56byte 의 메모리를 할당해주었다.

main+24 : ebp-56 부분부터 fgets() 함수를 통해 문자열을 입력한다.

main+36 : ebp-16에서 call()할 함수의 주소값을 읽어온다.

main+6 : ebp-16에 0x8048500을 넣었다는 것을 알 수 있다.

 

그러다면 0x8048500 은 printit() 함수일 것이다.

확인해 보자.

printit() 함수의 시작주소라는 것을 알 수 있다.(이 주소는 코드영역에 있는 주소값이다.)

그렇다면 우리는 call() 부분에 printit() 함수의 주소값이 아닌 shell() 함수의 주소값으로 덮어씌우면 된다.

 

2. shell() 함수의 주소값을 확인하기

shell() 함수의 시작주소는 0x080484d0 이다.

이렇게 보니 코드영역에 shell() 함수, printit() 함수, main() 함수가 나란히 있다는 것을 알 수 있다.

 

3. 다음 레벨 쉘 얻기

이제 마지막이다.

ebp-56 부터 우리가 입력한 문자열이 들어가고

ebp-16에 함수의 주소값이 들어간다는 것을 확인했다.

그러다면 fgets() 의 BOF 를 이용해 40byte를 입력한 후

shell() 함수의 시작주소인 0x080484d0 를 덮어씌우자.

성공적으로 level17 권한의 shell에 접속했다.

 

 

 

 

 

도움이 되다면 아래에 하트 눌러주기~

 

 

 

 

728x90
반응형

댓글