Pwnable/FTZ

[FTZ] level 19 풀이 <BOF>

lvolzoo 2024. 1. 18. 12:55
반응형

ID : level19

PW : swimming in pink


 

1.

 

level19로 로그인 하고, hint파일을 읽어주자. 간단한 코드이다.

buf배열을 gets으로 입력받을 때 길이에 대한 제약이 존재하지 않아서 취약점이 발생할 것이다.

이 코드에는 level20의 권한에 관한 코드가 없기 때문에 setreuid를 따로 넣어서 풀어줘야 한다.

 

 

구글링 결과, setreuid가 포함된 41Byte Shell Code가 존재한다.

"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"'`

이 쉘코드를 이용하면 될 것 같다.

 

 

 

2.

우선 buf에서 ret까지의 거리를 알아야 한다.

attackme를 tmp로 복사하여 gdb로 디버깅을 해주자!

 

<main+3> sub 부분을 보면 0x28만큼 공간이 할당된 것을 알 수 있다. 0x28은 10진수로 40이다.

스택구조가 <<buf(20) + dummy(20) + SFP(4) + RET(4)>> 임을 알 수 있다.

그렇다면 NOP로 buf부터 SFP까지 44바이트를 덮어주고 RET를 쉘코드가 저장된 환경변수를 주소로 덮어주면 문제가 풀릴 것이다.

 

 

export로 환경변수에 쉘코드 주소를 넣어줬다. shellcode를 shellcodee로 작성해 오타가 났지만 그냥 그대로 진행했다.

 

환경변수를 읽는 코드를 만들어 컴파일 하고 실행했다.

setreuid가 포함된 쉘코드가 있는 환경변수 주소는 0xbfffa70이다. 페이로드를 작성할 때 ret위에 덮어주면 되겠다!

 

 

버퍼부터 SFP까지 44바이트를 NOF로 덮어주고, ret에 환경변수 주소를 넣어줬다.

이로써 level20의 쉘을 땄다.

 

 

 


다른 풀이

chaining return to lib 기법으로 푸는 방법도 있다. setreuid가 포함된 쉘코드를 쓰지 않고 setreuid 함수의 주소를 직접 찾는 방법인데, 밑에 대략적인 문제 해결 순서를 서술하겠다. 나중에 참고해서 풀어보도록 하자.

  1. system(), setreuid()함수의 주소를 획득 (명령어 p사용)
  2. sysetem함수 내부에 존재하는 /bin/bash의 주소 획득
  3. setreuid 인자 정보 알아내기
  4. chaining을 위한 pop과 ret 명령어 그룹 ← ??

 

또 다른 방법도 있다.

RET를 setreuid 주소 + shellcode 삽입 주소 + ruid + euid 로 덮기

 

 

(2020.02에 작성한 글을 가져왔습니다.)

반응형