바이너리랑 Dockerfile만 주고 코드 파일은 안 줬다...
Dockerfile은 서버 바이너리 환경을 알려준다.
ubuntu:20.04 버전을 사용하기 때문에 도커를 이용해 20.04 버전으로 풀어보자
바이너리를 실행하면 [그림 1-3]처럼 보인다.
시그널을 서버에 보낼 수 있다 하는데 gdb로 뜯어보자
bof 냄새가 나는 read 함수를 찾아보자
read 함수 실행 전 rdx 값을 보면 0x400이다.
rsi 값을 확인한 후 해당 주소 인근 값들을 확인해 보니 0x7ffc9a847d80 주소에 ret 값이 존재한다.
즉, dummy(16) + ret 값이다. -> rdx가 0x400이라 ret를 충분히 덮고도 남는다.
이제 유의미한 가젯들을 찾아보자!
search-pattern 명령어를 이용해 "/bin/sh" 문자열 주소를 찾았다. -> 0x402000
pop rax 가젯도 존재한다.
바이너리에 syscall 코드가 존재하는지 찾아본다.
0x4010b0 주소에 syscall 명령어가 존재하는지 알 수 있다.
[그림 1-9] [그림 2-1]을 참조하면 pop rax, syscall 가젯이 존재하며 ret 값을 조작이 가능하다.
즉, sigreturn 시스템 콜을 호출할 수 있다. read 함수가 0x400 만큼 입력을 받기 때문에 레지스터 값을 조작하기 충분하다.
최종 익스 코드이다.
성공
알게 된 점
1. 바이너리 안에 가젯을 찾아보자!
'Dreamhack - pwnable' 카테고리의 다른 글
bypass_valid_vtable (1) | 2023.04.04 |
---|---|
iofile_aaw (0) | 2023.03.27 |
Sigreturn-Oriented Progamming (0) | 2023.03.14 |
rtld (0) | 2023.03.12 |
environ (0) | 2023.03.06 |