본문 바로가기
C, HackerSchool FTZ

해커스쿨 FTZ level17 (HackerSchool) 풀이

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

 

 

 

 

 

힌트를 보자

 

 

level16과는 다르게 shell() 함수가 없다.

대신 uid를 level18로 바꿔주고 call() 을 하는 부분이 있다.

그렇다면 call() 함수가 printit() 함수를 불러오는게 아닌 shell을 얻는 코드로 덮어씌우자.

 

 

1. 환경변수 등록하기(bash 쉘을 띄워주는 쉘코드)

export TRAP=`python -c 'print "\x90" * 100 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" ' `

입력 후 export 입력하여 잘 등록되었는지 확인

마지막 부분에 위와 같이(?) 되어있다면 잘 입력된 것이다.

이게 맞나 싶은 분들이 있을 수 있는데 해보니까 정상적으로 되더라 ㅎ

 

 

2. 등록한 환경변수의 주소값 알아내기

/tmp에 위와같은 코드파일을 만들고 실행하면 0xbffffe7e 가 나 온다.

이 것이 방금 등록한 TRAP 환경변수의 주소값이다.

 

 

3. 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+57 : ebp-16에서 call()할 함수의 주소값을 읽어온다.

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

 

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

확인해 보자.

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

그렇다면 우리는 call() 부분에 printit() 함수의 주소값이 아닌

TRAP 환경변수의 주소값으로 덮어씌우면 된다.

 

 

3. 다음 레벨 쉘 얻기

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

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

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

TRAP 환경변수의 주소인 0xbffffe7e를 덮어씌우자.

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

 

 

 

 

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

 

 

 

728x90
반응형

댓글