본문 바로가기

Pwnable/개념

[Pwnable] Dreamhack STAGE 5

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