https://dreamhack.io/lecture/roadmaps/2
System Hacking
시스템 해킹을 공부하기 위한 로드맵입니다.
dreamhack.io
[ Pwnable : stage 5_Stack Buffer Overflow ]
[함수 호출 규약]
: 함수의 호출 및 반환에 대한 약속
: 함수를 호출할 때는 반환된 이후를 위해 호출지(caller)의 상태 및 반환 주소(Return Address)를 저장해야 함
: 호출자는 피호출자(callee)가 요구하는 인자를 전달해줘야 하며, 피호출자의 실행이 종료될 때는 반환 값을
전달받아야 함
[함수 호출 규약의 종류]
: x86(32bit) 아키텍처 –> 스택으로 인자 전달하는 규약 사용
: x86-64 아키텍처 -> 적은 수의 인자는 레지스터만 사용하여 인자 전달, 인자 많은 경우 스택 사용
[x86호출 규약 : cdecl]
: 스택을 통해 인자 전달
: 인자를 전달하기 위해 사용한 스택을 호출자가 정리함
: 스택을 통해 인자를 전달할 경우 마지막 인자부터 첫번째 인자까지 거꾸로 스택에 push 함
<예제>


Caller 함수에서 2를 먼저 스택에 저장하여 callee의 인자로 전달
이후 1을 스택에 저장하여 callee의 인자로 전달
Add esp, 8 -> 스택 정리
[x86-64 호출 규약: SYSV]
* SYSV에서 정의한 함수 호출 규약
1. 6개의 인자를 RDI, RSI, RDX, RCX, R8, R9에 순서대로 저장하여 전달. 더 많은 인자를 사용해야 할 때는 스택을 추가로 이용
2. Caller에서 인자 전달에 사용된 스택 정리
3. 함수의 반환 값은 RAX로 전달
[버퍼 오버플로우]
- 일반적으로 버퍼는 메모리상에 연속해서 할당되어 있으므로, 어떤 버퍼에서 오버플로우가 발생하면, 뒤에 있는 버퍼들의 값이 조작될 위험이 있음
-> 중요 데이터 변조
-> 데이터 유출
-> 실행 흐름 조작
[Exploit Tech: Return Address Overwirte]
* 취약한 함수
- scanf에 %s 포맷스트링 사용 금지 -> “%[n]s”의 형태로 사용해야 함
- strcpy, strcat, sprint 사용 금지(길이 입력 x) -> strncpy, strncat, snprintf, fgets, memcpy 등 사용 o
< 취약한 문자열 입력함수 >

<return address overwrite 문제>

get_shell 함수의 주소는 0x4006aa
함께하는 실습 강의와 주소만 다르길래 바꿔서 똑같이 해봤는데
오류가 떠서 그냥 코드로 작성해서 실행시켰다.


아래는 pwntool로 작성한 코드이다!


'Pwnable > 개념' 카테고리의 다른 글
[Pwnable] Dreamhack STAGE 8 (0) | 2022.08.26 |
---|---|
[Pwnable] Dreamhack STAGE 8 (0) | 2022.08.26 |
[Pwnable] Dreamhack STAGE 7 (0) | 2022.08.26 |
[Pwnable] Dreamhack STAGE 6 (0) | 2022.08.25 |
[Pwnable] Dreamhack STAGE 1 ~ 3 (0) | 2022.08.15 |