Off by one overflow

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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

๋‹จ์ง€ 1๋ฐ”์ดํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋‹ค์Œ ์ฒญํฌ์˜ size ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹ค์ œ๋กœ ์–ด๋–ค ์ฒญํฌ๋“ค์ด free๋˜๋Š”์ง€๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉฐ, ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ•ฉ๋ฒ•์ ์ธ ์ฒญํฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ฒญํฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡ ๋ฐฉ๋ฒ•์€ double free ๋˜๋Š” overlapping chunks์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

There are 2 types of off by one vulnerabilities:

  • Arbitrary byte: ์ด ์œ ํ˜•์€ ํ•ด๋‹น ๋ฐ”์ดํŠธ๋ฅผ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค
  • Null byte (off-by-null): ์ด ์œ ํ˜•์€ ํ•ด๋‹น ๋ฐ”์ดํŠธ๋ฅผ ์˜ค์ง 0x00์œผ๋กœ๋งŒ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค
  • A common example of this vulnerability can be seen in the following code where the behavior of strlen and strcpy is inconsistent, which allows set a 0x00 byte in the beginning of the next chunk.
  • This can be expoited with the House of Einherjar.
  • If using Tcache, this can be leveraged to a double free situation.
Off-by-null ```c // From https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/off_by_one/ int main(void) { char buffer[40]=""; void *chunk1; chunk1 = malloc(24); puts("Get Input"); gets(buffer); if(strlen(buffer)==24) { strcpy(chunk1,buffer); } return 0; } ```

๋‹ค๋ฅธ ๊ฒ€์‚ฌ๋“ค๊ณผ ํ•จ๊ป˜, ์ด์ œ chunk๊ฐ€ free๋  ๋•Œ๋งˆ๋‹ค ์ด์ „ previous size๊ฐ€ metadata์˜ chunk์— ์„ค์ •๋œ size์™€ ๋น„๊ต๋˜๋ฏ€๋กœ ์ด ๊ณต๊ฒฉ์€ 2.28 ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ๋‹นํžˆ ๋ณต์žกํ•ด์กŒ๋‹ค.

Code example:

Goal

  • ํ•˜๋‚˜์˜ chunk๊ฐ€ ๋‹ค๋ฅธ chunk ๋‚ด๋ถ€์— ํฌํ•จ๋˜๋„๋ก ๋งŒ๋“ค์–ด, ๋‘ ๋ฒˆ์งธ chunk์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ ‘๊ทผ์œผ๋กœ ๋‚ด๋ถ€์— ํฌํ•จ๋œ chunk๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค

Requirements

  • size metadata ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” Off by one overflow

General off-by-one attack

  • ์„ธ ๊ฐœ์˜ chunk A, B ๋ฐ C๋ฅผ ํ• ๋‹นํ•œ๋‹ค(์˜ˆ: ํฌ๊ธฐ 0x20). ๊ทธ๋ฆฌ๊ณ  top-chunk์™€์˜ consolidation์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ํ•˜๋‚˜๋ฅผ ๋” ํ• ๋‹นํ•œ๋‹ค.
  • C๋ฅผ freeํ•œ๋‹ค(0x20 Tcache free-list์— ์‚ฝ์ž…๋จ).
  • A๋ฅผ ์‚ฌ์šฉํ•ด B์— overflow๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. off-by-one์„ ์•…์šฉํ•ด B์˜ size ํ•„๋“œ๋ฅผ 0x21์—์„œ 0x41๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  • ์ด์ œ B๋Š” free๋œ chunk C๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋œ๋‹ค.
  • B๋ฅผ freeํ•˜๊ณ  0x40 ํฌ๊ธฐ์˜ chunk๋ฅผ ํ• ๋‹นํ•˜๋ฉด(ํ•ด๋‹น ์œ„์น˜์— ๋‹ค์‹œ ๋ฐฐ์น˜๋œ๋‹ค).
  • C๋Š” ์—ฌ์ „ํžˆ free ์ƒํƒœ์ด๋ฏ€๋กœ ๊ทธ ์•ˆ์˜ fd ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค (Tcache poisoning)

Off-by-null attack

  • ์—ฐ์†์œผ๋กœ 3๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ chunk(a, b, c)๋ฅผ ํ• ๋‹นํ•œ ๋’ค ์ค‘๊ฐ„ chunk๋ฅผ freeํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ chunk์—๋Š” off by one overflow ์ทจ์•ฝ์ ์ด ์žˆ๊ณ  ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ 0x00์œผ๋กœ ์•…์šฉํ•œ๋‹ค(์ด์ „ ๋ฐ”์ดํŠธ๊ฐ€ 0x10์ด์—ˆ๋‹ค๋ฉด ์ค‘๊ฐ„ chunk๊ฐ€ ์‹ค์ œ๋ณด๋‹ค 0x10 ์ž‘๋‹ค๊ณ  ํ‘œ์‹œํ•˜๊ฒŒ ๋œ๋‹ค).
  • ๊ทธ ๋‹ค์Œ ์ค‘๊ฐ„์— free๋œ chunk(b) ์•ˆ์— ๋” ์ž‘์€ ๋‘ ๊ฐœ์˜ chunk๋ฅผ ์ถ”๊ฐ€๋กœ ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ b + b->size๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ์‹ค์ œ๋ณด๋‹ค ์ž‘๊ธฐ ๋•Œ๋ฌธ์— c chunk๋Š” ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ทธ ํ›„ b1๊ณผ c๊ฐ€ free๋œ๋‹ค. c - c->prev_size๊ฐ€ ์—ฌ์ „ํžˆ b(ํ˜„์žฌ b1)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฏ€๋กœ ๋‘ ๊ฐœ๋Š” ํ•˜๋‚˜์˜ chunk๋กœ ๋ณ‘ํ•ฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ b2๋Š” b1๊ณผ c ์‚ฌ์ด์— ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒˆ๋กœ malloc์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‹ค์ œ๋กœ b2๋ฅผ ํฌํ•จํ•˜๋Š” ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํšŒ์ˆ˜ํ•˜๊ฒŒ ๋˜์–ด, ์ƒˆ malloc์˜ ์†Œ์œ ์ž๊ฐ€ b2์˜ ๋‚ด์šฉ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

This image explains perfectly the attack:

https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks

Modern glibc hardening & bypass notes (>=2.32)

  • Safe-Linking์€ ์ด์ œ ๋ชจ๋“  singly linked bin ํฌ์ธํ„ฐ๋ฅผ fd = ptr ^ (chunk_addr >> 12)๋กœ ์ €์žฅํ•ด ๋ณดํ˜ธํ•˜๋ฏ€๋กœ, size์˜ ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ๋’ค์ง‘๋Š” off-by-one์€ ๋ณดํ†ต Tcache poisoning์ด ๋™์ž‘ํ•˜๊ธฐ ์ „์— XOR ๋งˆ์Šคํฌ๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ heap leak์ด ํ•„์š”ํ•˜๋‹ค.
  • ์‹ค์ œ๋กœ leak ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆญ์€ ํฌ์ธํ„ฐ๋ฅผ โ€œdouble-protectโ€œํ•˜๋Š” ๊ฒƒ์ด๋‹ค: ์ด๋ฏธ ์ œ์–ดํ•˜๋Š” ํฌ์ธํ„ฐ๋ฅผ PROTECT_PTR๋กœ ์ธ์ฝ”๋”ฉํ•œ ๋’ค, ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์žฌ์‚ฌ์šฉํ•ด ์œ„์กฐํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ์ •๋ ฌ ๊ฒ€์‚ฌ(alignment check)๊ฐ€ ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ํ†ต๊ณผํ•œ๋‹ค.
  • safe-linking + single-byte corruptions ์ž‘์—… ํ๋ฆ„:
  1. victim chunk๋ฅผ ์ œ์–ดํ•˜๋Š” ์ด๋ฏธ ๊ฐ€์ง„ free๋œ chunk๋ฅผ ์™„์ „ํžˆ ๋ฎ์„ ๋•Œ๊นŒ์ง€ ํ™•์žฅํ•œ๋‹ค (overlapping-chunk ์„ค์ •).
  2. heap ํฌ์ธํ„ฐ(stdout, UAF, ๋ถ€๋ถ„์ ์œผ๋กœ ์ œ์–ด๋œ struct ๋“ฑ)๋ฅผ leakํ•˜๊ณ  ํ‚ค heap_base >> 12๋ฅผ ๋„์ถœํ•œ๋‹ค.
  3. free-list ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๊ธฐ ์ „์— ์žฌ์ธ์ฝ”๋”ฉํ•œ๋‹ค โ€” ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์„ user data ์•ˆ์— ๋ฐฐ์น˜ํ•˜๊ณ  single-byte ์“ฐ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‚˜์ค‘์— memcpy๋กœ ์˜ฎ๊ธด๋‹ค.
  4. ์œ„์กฐ ํฌ์ธํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ธ์ฝ”๋”ฉ๋˜๋ฉด Tcache bin attacks์™€ ๊ฒฐํ•ฉํ•ด ํ• ๋‹น์„ __free_hook์ด๋‚˜ tcache_perthread_struct ์—”ํŠธ๋ฆฌ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•œ๋‹ค.

์ตœ์‹  ์ต์Šคํ”Œ๋กœ์ž‡์„ ๋””๋ฒ„๊น…ํ•  ๋•Œ ์ธ์ฝ”๋“œ/๋””์ฝ”๋“œ ๋‹จ๊ณ„๋ฅผ ์—ฐ์Šตํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ํ—ฌํผ:

def protect(ptr, chunk_addr):
return ptr ^ (chunk_addr >> 12)

def reveal(encoded, chunk_addr):
return encoded ^ (chunk_addr >> 12)

chunk = 0x55555555c2c0
encoded_fd = protect(0xdeadbeefcaf0, chunk)
print(hex(reveal(encoded_fd, chunk)))  # 0xdeadbeefcaf0

์ตœ๊ทผ ์‹ค์ œ ํ‘œ์ : glibc __vsyslog_internal off-by-one (CVE-2023-6779)

  • 2024๋…„ 1์›” Qualys๋Š” CVE-2023-6779์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ, ์ด๋Š” __vsyslog_internal() ๋‚ด๋ถ€์˜ off-by-one ์ทจ์•ฝ์ ์œผ๋กœ syslog()/vsyslog()์˜ ํฌ๋งท ๋ฌธ์ž์—ด์ด INT_MAX๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ ๋ฐœ์ƒํ•˜์—ฌ ์ข…๋ฃŒ \0์ด glibc 2.37โ€“2.39 ์‹œ์Šคํ…œ์—์„œ ์ธ์ ‘ ์ฒญํฌ์˜ ๊ฐ€์žฅ ํ•˜์œ„ size ๋ฐ”์ดํŠธ๋ฅผ ์†์ƒ์‹œํ‚จ๋‹ค (Qualys advisory).
  • ๊ทธ๋“ค์˜ Fedora 38 exploit pipeline:
  1. ๊ณผ๋„ํ•˜๊ฒŒ ๊ธด openlog() ident์„ ๋งŒ๋“ค์–ด vasprintf๊ฐ€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ๋ฐ์ดํ„ฐ ์˜†์— ํž™ ๋ฒ„ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•œ๋‹ค.
  2. ์ด์›ƒ ์ฒญํฌ์˜ size | prev_inuse ๋ฐ”์ดํŠธ๋ฅผ ํŒŒ๊ดดํ•˜๊ธฐ ์œ„ํ•ด syslog()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•ด๋‹น ์ฒญํฌ๋ฅผ freeํ•œ ๋’ค ๊ณต๊ฒฉ์ž ๋ฐ์ดํ„ฐ์™€ ์ค‘์ฒฉ๋˜๋„๋ก consolidation์„ ๊ฐ•์ œํ•œ๋‹ค.
  3. ์ค‘์ฒฉ๋œ ๋ทฐ๋ฅผ ์ด์šฉํ•ด tcache_perthread_struct ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์†์ƒ์‹œํ‚ค๊ณ  ๋‹ค์Œ ํ• ๋‹น์ด __free_hook๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋งŒ๋“  ๋‹ค์Œ system ๋˜๋Š” root ๊ถŒํ•œ์„ ์œ„ํ•œ one_gadget์œผ๋กœ ๋ฎ์–ด์“ด๋‹ค.
  • ํ…Œ์ŠคํŠธ ํ•˜๋‹ˆ์Šค์—์„œ ์†์ƒ ์“ฐ๊ธฐ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๋ฉด, ๊ฑฐ๋Œ€ํ•œ argv[0]์œผ๋กœ forkํ•˜๊ณ  openlog(NULL, LOG_PID, LOG_USER)๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ syslog(LOG_INFO, "%s", payload)๋ฅผ ํ˜ธ์ถœํ•˜๋ผ. ์—ฌ๊ธฐ์„œ payload = b"A" * 0x7fffffff; pwndbg์˜ heap bins๋Š” ์ฆ‰์‹œ ๋‹จ์ผ ๋ฐ”์ดํŠธ ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • Ubuntu๋Š” ์ด ๋ฒ„๊ทธ๋ฅผ CVE-2023-6779๋กœ ์ถ”์ ํ•˜๋ฉฐ, ์ด ๋™์ผํ•œ INT truncation์ด ์ด ์ทจ์•ฝ์ ์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” off-by-one primitive๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ๋ฌธ์„œํ™”ํ•œ๋‹ค.

๊ธฐํƒ€ ์˜ˆ์ œ ๋ฐ ์ฐธ๊ณ ์ž๋ฃŒ

  • https://heap-exploitation.dhavalkapil.com/attacks/shrinking_free_chunks
  • Bon-nie-appetit. HTB Cyber Apocalypse CTF 2022
  • Off-by-one์€ strlen์ด ๋‹ค์Œ ์ฒญํฌ์˜ size ํ•„๋“œ๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.
  • Tcache๊ฐ€ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ off-by-one ๊ณต๊ฒฉ์œผ๋กœ Tcache poisoning์„ ํ†ตํ•ด arbitrary write primitive๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • Asis CTF 2016 b00ks
  • ๋ฌธ์ž์—ด ๋์˜ 0x00 ๋ฐ”์ดํŠธ๊ฐ€ ๋‹ค์Œ ํ•„๋“œ์— ์˜ํ•ด ๋ฎ์–ด์จ์ง€๊ธฐ ๋•Œ๋ฌธ์— off-by-one์„ ์•…์šฉํ•˜์—ฌ ํž™์—์„œ ์ฃผ์†Œ๋ฅผ leakํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Arbitrary write๋Š” off by one ์“ฐ๊ธฐ๋ฅผ ์•…์šฉํ•ด ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€์งœ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ€์งœ struct๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋‹ค๋ฅธ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•จ์œผ๋กœ์จ ์–ป๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ ์ด struct์˜ ํฌ์ธํ„ฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉด arbitrary write๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํž™์ด mmap์œผ๋กœ ํ™•์žฅ๋˜๋ฉด mmap์ด ํ• ๋‹นํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” libc๋กœ๋ถ€ํ„ฐ ๊ณ ์ •๋œ ์˜คํ”„์…‹์„ ๊ฐ€์ง€๋ฏ€๋กœ libc ์ฃผ์†Œ๊ฐ€ leak๋œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ arbitrary write๋ฅผ ์•…์šฉํ•ด __free_hook ์ฃผ์†Œ์— one gadget์„ ์จ๋„ฃ๋Š”๋‹ค.
  • plaidctf 2015 plaiddb
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ผ์ธ์„ ์ฝ๋Š” getline ํ•จ์ˆ˜์— NULL off by one ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ฝ˜ํ…์ธ ์˜ โ€œkeyโ€œ๋ฅผ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๊ณ  ์ฝ˜ํ…์ธ  ์ž์ฒด๋ฅผ ์ฝ๋Š” ๋ฐ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • In the writeup ์ดˆ๊ธฐ 5๊ฐœ์˜ ์ฒญํฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค:
  • chunk1 (0x200)
  • chunk2 (0x50)
  • chunk5 (0x68)
  • chunk3 (0x1f8)
  • chunk4 (0xf0)
  • chunk defense (0x400)๋Š” top chunk์™€ consolidating๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค
  • ๊ทธ๋‹ค์Œ chunk 1, 5, 3์ด free๋˜์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค:

[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]

- ๊ทธ ํ›„ chunk3 (0x1f8)์„ ์•…์šฉํ•˜์—ฌ null off-by-one์„ ์ด์šฉํ•ด prev_size๋ฅผ `0x4e0`์œผ๋กœ ์“ด๋‹ค.
- ์ดˆ๊ธฐ์— ํ• ๋‹น๋œ chunks 1, 2, 5, 3์˜ ํฌ๊ธฐ์™€ ๊ทธ๋“ค ์ฒญํฌ 4๊ฐœ์˜ ํ—ค๋” ํฌ๊ธฐ ํ•ฉ์ด `0x4e0`์ธ ๊ฒƒ์„ ์ฃผ๋ชฉํ•˜๋ผ: `hex(0x1f8 + 0x10 + 0x68 + 0x10 + 0x50 + 0x10 + 0x200) = 0x4e0`
- ๊ทธ ๋‹ค์Œ chunk 4๊ฐ€ free๋˜์–ด ์‹œ์ž‘์ง€์ ๊นŒ์ง€ ๋ชจ๋“  ์ฒญํฌ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ์ฒญํฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค:
- ```python
[ 0x4e0 Chunk 1-2-5-3 (free) ] [ 0xf0 Chunk 4 (corrupted) ] [ 0x400 Chunk defense ]

[ 0x200 Chunk 1 (free) ] [ 0x50 Chunk 2 ] [ 0x68 Chunk 5 (free) ] [ 0x1f8 Chunk 3 (free) ] [ 0xf0 Chunk 4 ] [ 0x400 Chunk defense ]

- ๊ทธ ํ›„ ์›๋ž˜์˜ chunk 1์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด `0x200` ๋ฐ”์ดํŠธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค
- ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ 0x200 ๋ฐ”์ดํŠธ๊ฐ€ ํ• ๋‹น๋˜์–ด chunk2๊ฐ€ ํŒŒ๊ดด๋˜๋ฏ€๋กœ, ๋”ฐ๋ผ์„œ fucking leak๊ฐ€ ์—†์–ด์„œ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค? ์•„๋งˆ ์ด๊ฑด ํ•˜๋ฉด ์•ˆ ๋  ๊ฒƒ์ด๋‹ค
- ๊ทธ ๋‹ค์Œ 0x58๊ฐœ์˜ "a"๋กœ ๋‹ค๋ฅธ ์ฒญํฌ๋ฅผ ํ• ๋‹น( chunk2๋ฅผ ๋ฎ์–ด์“ฐ๊ณ  chunk5์— ๋„๋‹ฌ)ํ•˜๊ณ  chunk5์˜ fast bin ์ฒญํฌ์˜ `fd`๋ฅผ `__malloc_hook`๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค
- ๊ทธ ๋‹ค์Œ 0x68 ํฌ๊ธฐ์˜ ์ฒญํฌ๋ฅผ ํ• ๋‹นํ•˜์—ฌ `__malloc_hook`์— ์žˆ๋Š” ๊ฐ€์งœ fast bin ์ฒญํฌ๊ฐ€ ๋‹ค์Œ fast bin ์ฒญํฌ๊ฐ€ ๋˜๊ฒŒ ํ•œ๋‹ค
- ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒˆ๋กœ์šด 0x68 fast bin ์ฒญํฌ๊ฐ€ ํ• ๋‹น๋˜๊ณ  `__malloc_hook`๊ฐ€ `one_gadget` ์ฃผ์†Œ๋กœ ๋ฎ์–ด์จ์ง„๋‹ค

## References

- [Qualys Security Advisory โ€“ CVE-2023-6246/6779/6780](https://www.qualys.com/2024/01/30/cve-2023-6246/syslog.txt)
- [Ubuntu Security โ€“ CVE-2023-6779](https://ubuntu.com/security/CVE-2023-6779)
- [Breaking Safe-Linking in Modern Glibc โ€“ Google CTF 2022 "saas" analysis](https://blog.csdn.net/2402_86373248/article/details/148717274)

> [!TIP]
> AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>HackTricks ์ง€์›ํ•˜๊ธฐ</summary>
>
> - [**๊ตฌ๋… ๊ณ„ํš**](https://github.com/sponsors/carlospolop) ํ™•์ธํ•˜๊ธฐ!
> - **๐Ÿ’ฌ [**๋””์Šค์ฝ”๋“œ ๊ทธ๋ฃน**](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) ๊นƒํ—ˆ๋ธŒ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— PR์„ ์ œ์ถœํ•˜์—ฌ ํ•ดํ‚น ํŠธ๋ฆญ์„ ๊ณต์œ ํ•˜์„ธ์š”.**
>
> </details>