send_sig

oogu ㅣ 2023. 3. 15. 17:17

[그림 1-1]

바이너리랑 Dockerfile만 주고 코드 파일은 안 줬다...

[그림 1-2]

Dockerfile은 서버 바이너리 환경을 알려준다. 

ubuntu:20.04 버전을 사용하기 때문에 도커를 이용해 20.04 버전으로 풀어보자

[그림 1-3]

바이너리를 실행하면 [그림 1-3]처럼 보인다.

시그널을 서버에 보낼 수 있다 하는데 gdb로 뜯어보자

[그림 1-4]

bof 냄새가 나는 read 함수를 찾아보자

[그림 1-5]

read 함수 실행 전 rdx 값을 보면 0x400이다. 

[그림 1-6]

rsi 값을 확인한 후 해당 주소 인근 값들을 확인해 보니 0x7ffc9a847d80 주소에 ret 값이 존재한다.

즉, dummy(16) + ret 값이다. -> rdx가 0x400이라 ret를 충분히 덮고도 남는다.

 

이제 유의미한 가젯들을 찾아보자!

[그림 1-7]

search-pattern 명령어를 이용해 "/bin/sh" 문자열 주소를 찾았다. -> 0x402000

[그림 1-8]

pop rax 가젯도 존재한다.

[그림 1-9]

바이너리에 syscall 코드가 존재하는지 찾아본다.

[그림 2-1]

0x4010b0 주소에 syscall 명령어가 존재하는지 알 수 있다.

 

[그림 1-9] [그림 2-1]을 참조하면 pop rax, syscall 가젯이 존재하며 ret 값을 조작이 가능하다.

즉, sigreturn 시스템 콜을 호출할 수 있다. read 함수가 0x400 만큼 입력을 받기 때문에 레지스터 값을 조작하기 충분하다.

[그림 2-2]

최종 익스 코드이다.

[그림 2-3]

성공

 

알게 된 점

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