Layer7 동아리 과제

포너블 3차시 과제

msh1307 2022. 9. 25. 17:49

Prob0

Full RELRO, PIE와 Canary가 걸려있고 rwx 권한을 가진 세그먼트가 있다.

버퍼 주소를 제공해준다.

나중에 ret 덮을때 사용하면 될 것 같다.

_bss_start는 아마 stdout일 것이다.

0x100만큼 입력을 받는다. 

근데 버퍼는 88이니까 bof가 터진다.

입력받은 버퍼 다시 출력하니까 canary leak은 널 바이트 덮어서 하면 될 것 같다.

입력을 gets로 다시 받는데, 그건 ret 덮는데 쓰면 된다.

canary는 rbp-0x8에 있으니까 0x60 - 0x8 해서 0x58 + 1 덮어주면 된다.

이렇게 해주면 

leak이 잘되는 것을 확인할 수 있다.

약간 바꿔서 출력해보면

잘 출력된다.

이제 ret를 shellcode 주소로 덮으면 된다.

이렇게 덮어주면 된다.

D0 Y0u kn0w shellc0de?

vuln가 보인다.

1로 널 바이트 덮고, 2로 canary leak 하고, 3으로 스택 버퍼 주소를 얻고 ret overwrite 하면 될 것 같다.

이렇게 짜주면 된다.

process는 remote로 바꿔서 날리면 된다.

3보다 더 큰 값을 입력하면 함수가 리턴되니 4를 입력해서 쉘을 최종적으로 딸 수 있다.

Oh..Sorry...

다 똑같은데, 버퍼 주소를 안 준다.

system plt가 보인다.

xref 해보면 

openShell 함수가 있다.

 

아까 사용했던 익스플로잇 코드에서 버퍼 주소 대신 이 함수로 ret를 overwrite 하면 된다.

도움이 필요해요!

똑같은데 64비트 버전인 거 같다.

바이너리가 정말 똑같아서 그냥 저번 익스플로잇 코드 가져와서 오프셋 계산이랑 쉘 코드만 바꿔주면 쉘을 딸 수 있을 것 같다.

0x70 - 0x8 하면 0x68이 나온다.

canary leak은 0x68 + 1만큼 덮으면 가능하다.

오프셋 바꿔줬고, leak 8바이트를 고려했다.

Return to Shellcode

rbp와 버퍼 사이의 거리를 준다.

그리고 버퍼의 주소를 준다.

그러면 제공한 버퍼와 rbp 사이의 거리 -8 + 1 만큼 입력을 보내면 canary 널 바이트를 덮을 수 있게 되고, leak을 할 수 있게 된다. 

그리고 한번 더 입력을 할 수 있는데, 이때 쉘 코드를 넣고 ret를 버퍼의 주소로 덮으면 된다.

익스플로잇 코드이다.

NX, Canary

nx bit는 코드 영역을 제외한 스택이나, bss에서 실행 권한을 제거하는 보호 기법이다.

요즘엔 nx 꺼져도 bss에 실행 권한이 기본적으로 제거되어있다.

위에서 풀이한 문제 중에 쉘 코드를 넣고, instruction pointer를 스택의 쉘 코드로 옮기는 게 가능한 이유도, 스택에 실행 권한이 있었기 때문이다. 

 

Canary는 첫 바이트가 널 바이트라는 특징이 있다.

sfp와 ret를 침범하지 못하도록 막는 역할을 한다.

만약 canary가 덮여서 달라졌다면, stack chk fail이라는 함수를 호출해서 stack smash를 감지한다.

 

'Layer7 동아리 과제' 카테고리의 다른 글

포너블 5차시 과제  (1) 2022.10.18
포너블 4차시 과제  (0) 2022.10.05
포너블 2차시 과제  (0) 2022.09.21
포너블 1차시 과제  (0) 2022.09.18
포너블 1차시 실습 라업  (0) 2022.09.14