hacktricks/binary-exploitation/array-indexing.md

32 lines
4 KiB
Markdown
Raw Normal View History

# 배열 인덱싱
{% hint style="success" %}
AWS 해킹 학습 및 실습:<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">\
GCP 해킹 학습 및 실습: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>HackTricks 지원</summary>
* [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* 💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃헙 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
</details>
{% endhint %}
## 기본 정보
이 범주에는 배열의 인덱스 처리 오류로 인해 특정 데이터를 덮어쓸 수 있는 취약점이 모두 포함됩니다. 취약점의 조건에 완전히 의존하기 때문에 이는 특정 방법론이 없는 매우 넓은 범주입니다.
그러나 여기에서 몇 가지 좋은 **예시**를 찾을 수 있습니다:
* [https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19\_dreamheaps/index.html)
* **2개의 충돌하는 배열**이 있습니다. 데이터가 저장된 주소를 나타내는 하나와 해당 데이터의 **크기**를 나타내는 다른 하나가 있습니다. 한 배열에서 다른 배열로 덮어쓸 수 있어 임의의 주소를 크기로 지정할 수 있습니다. 이를 통해 `free` 함수의 주소를 GOT 테이블에 쓰고, 그 주소를 `system`의 주소로 덮어쓴 다음 `/bin/sh`가 있는 메모리에서 free를 호출할 수 있습니다.
* [https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18\_doubletrouble/index.html)
* 64비트, nx 없음. 크기를 덮어쓰면 모든 것이 더블 숫자로 사용되고 가장 작은 것부터 가장 큰 것까지 정렬되는 버퍼 오버플로우가 발생합니다. 이를 충족하는 셸코드를 작성해야 하며, 캐너리가 위치에서 이동되어서는 안 되며, 마지막으로 RIP를 ret 주소로 덮어쓰고, 스택의 시작을 가리키는 새 주소를 가장 큰 주소로 놓아야 합니다. 이를 통해 ret를 사용하여 해당 위치로 점프할 수 있습니다.
* [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
* 64비트, relro 없음, 캐너리 없음, nx 없음, pie 없음. 스택의 배열에서 발생하는 off-by-one을 통해 포인터를 제어할 수 있어 모든 숫자의 합을 배열의 off-by-one으로 덮어쓴 주소에 쓸 수 있습니다. 스택을 제어하여 GOT `exit` 주소를 `pop rdi; ret`로 덮어쓰고, 스택에 `main` 주소를 추가합니다 (`main`으로 다시 이동). puts를 사용하여 GOT에 있는 put 주소를 노출하는 ROP 체인을 사용합니다 (`exit`이 호출되어 `pop rdi; ret`이 호출되므로 스택에서 이 체인을 실행합니다). 마지막으로 ret2lib를 실행하는 새로운 ROP 체인을 사용합니다.
* [https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/tu\_guestbook/index.html)
* 32비트, relro 없음, 캐너리 없음, nx, pie. 잘못된 인덱싱을 악용하여 스택에서 libc 및 힙의 주소를 노출합니다. 버퍼 오버플로우를 악용하여 `system('/bin/sh')`를 호출하는 ret2lib를 수행합니다 (힙 주소가 필요하여 체크를 우회해야 함).