Translated ['binary-exploitation/format-strings/README.md'] to kr

This commit is contained in:
Translator 2024-09-25 16:31:43 +00:00
parent 2b2a0fdeab
commit d3aed604b7

View file

@ -17,11 +17,11 @@ Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-s
## Basic Information
C에서 **`printf`**는 문자열을 **출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **형식 지정자가 포함된 원시 텍스트**입니다. 이 원시 텍스트의 **형식 지정자**를 **대체**할 **값**은 **다음 매개변수**로 기대됩니다.
C에서 **`printf`**는 문자열을 **출력**하는 데 사용할 수 있는 함수입니다. 이 함수가 기대하는 **첫 번째 매개변수**는 **형식 지정자가 포함된 원시 텍스트**입니다. 이 원시 텍스트의 **형식 지정자**를 **대체**할 **값**이 기대되는 **다음 매개변수**입니다.
다른 취약한 함수로는 **`sprintf()`**와 **`fprintf()`**가 있습니다.
취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf 형식** 문자열 기능을 악용하여 **특별한 입력**을 만들어 **읽기 및 쓰기 가능한 모든 주소의 데이터를 읽고 쓸 수** 있습니다. 이렇게 해서 **임의 코드를 실행**할 수 있습니다.
취약점은 **공격자 텍스트가 이 함수의 첫 번째 인수로 사용될 때** 발생합니다. 공격자는 **printf 형식** 문자열 기능을 악용하여 **특별한 입력**을 만들어 **읽을 수 있는/쓸 수 있는** 모든 주소에서 **데이터를 읽고 쓸 수** 있습니다. 이렇게 해서 **임의 코드를 실행**할 수 있습니다.
#### Formatters:
```bash
@ -70,11 +70,11 @@ return 0;
```c
printf("%x %x %x %x")
```
그리고 첫 번째부터 네 번째 매개변수까지 읽을 수 있습니다.
그리고 첫 번째에서 네 번째 매개변수까지 읽을 수 있습니다.
또는 다음과 같이 할 수 있습니다:
```c
printf("$4%x")
printf("%4$x")
```
and read directly the forth.
@ -100,7 +100,7 @@ p.sendline(payload)
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
```
{% hint style="danger" %}
입력의 시작 부분에 0x8048000 주소를 넣을 수 없다는 점에 유의하세요. 문자열은 해당 주소의 끝에 0x00에서 잘리기 때문입니다.
입력의 시작 부분에 0x8048000 주소를 넣을 수 없다는 점에 유의하세요. 문자열은 해당 주소의 끝에서 0x00으로 잘리기 때문입니다.
{% endhint %}
### 오프셋 찾기
@ -145,7 +145,7 @@ p.close()
임의 읽기는 다음과 같은 용도로 유용할 수 있습니다:
* **메모리에서** **바이너리**를 **덤프**하기
* **민감한** **정보**가 저장된 메모리의 특정 부분에 **접근**하기 (예: [**CTF 챌린지**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)에서와 같이 카나리, 암호화 키 또는 사용자 정의 비밀번호)
* **민감한** **정보**가 저장된 메모리의 특정 부분에 **접근하기** (예: 이 [**CTF 챌린지**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value)와 같이)
## **임의 쓰기**
@ -160,13 +160,13 @@ AAAA.%500\$08x —> Param at offset 500
따라서 이 취약점은 **임의의 주소에 무엇이든 쓸 수 있게** 합니다.
이 예제에서 목표는 **나중에 호출될** **함수**의 **주소**를 **덮어쓰는** 것입니다. 이는 다른 임의 쓰기를 악용하여 exec 기술을 사용할 수 있습니다:
이 예제에서 목표는 **나중에 호출될** **GOT** 테이블의 **함수**의 **주소**를 **덮어쓰는** 것입니다. 이는 다른 임의 쓰기를 악용하여 exec 기술을 사용할 수 있습니다:
{% content-ref url="../arbitrary-write-2-exec/" %}
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
{% endcontent-ref %}
우리는 **사용자**로부터 **인수**를 **받는** **함수**를 **덮어쓰고**, 이를 **`system`** **함수**를 가리키도록 할 것입니다.\
우리는 **사용자**로부터 **인수**를 **받는** **함수**를 **덮어쓰고**, 이를 **`system`** **함수**를 가리키 할 것입니다.\
언급했듯이 주소를 쓰기 위해 일반적으로 2단계가 필요합니다: 먼저 주소의 2바이트를 쓰고, 그 다음에 나머지 2바이트를 씁니다. 이를 위해 **`$hn`**이 사용됩니다.
* **HOB**는 주소의 2개의 높은 바이트를 호출합니다.
@ -225,11 +225,11 @@ p.interactive()
* [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
* [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak)
* [https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html)
* 32비트, no relro, no canary, nx, no pie, 스택에서 플래그를 누출하기 위한 형식 문자열의 기본 사용 (실행 흐름을 변경할 필요 없음)
* 32 비트, no relro, no canary, nx, no pie, 스택에서 플래그를 누출하기 위한 형식 문자열의 기본 사용 (실행 흐름을 변경할 필요 없음)
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
* 32비트, relro, no canary, nx, no pie, win 함수로 `fflush` 주소를 덮어쓰는 형식 문자열 (ret2win)
* 32 비트, relro, no canary, nx, no pie, win 함수로 `fflush` 주소를 덮어쓰는 형식 문자열 (ret2win)
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
* 32비트, relro, no canary, nx, no pie, `.fini_array`에 있는 main 내부의 주소에 쓰기 위한 형식 문자열 (흐름이 한 번 더 루프하도록) 및 `strlen`을 가리키는 GOT 테이블의 `system` 주소에 쓰기. 흐름이 main으로 돌아가면, `strlen`이 사용자 입력과 함께 실행되고 `system`을 가리키면, 전달된 명령이 실행됩니다.
* 32 비트, relro, no canary, nx, no pie, `.fini_array` 내의 main에 있는 주소를 쓰기 위한 형식 문자열 (흐름이 한 번 더 루프됨) 및 `strlen`을 가리키는 GOT 테이블의 `system` 주소를 쓰기. 흐름이 main으로 돌아가면, `strlen`이 사용자 입력과 함께 실행되고 `system`을 가리키면, 전달된 명령이 실행됩니다.
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\