힌트를 보자
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에 접속했다.
도움이 되었다면 아래에 하트 눌러주기~
'C, HackerSchool FTZ' 카테고리의 다른 글
해커스쿨 FTZ level20 (HackerSchool) 풀이 (2) | 2021.11.18 |
---|---|
해커스쿨 FTZ level19 (HackerSchool) 풀이 (0) | 2021.03.29 |
해커스쿨 FTZ level18 (HackerSchool) 풀이 (0) | 2021.02.12 |
해커스쿨 FTZ level16 (HackerSchool) 풀이 (0) | 2020.12.28 |
댓글