๐ŸŒ‡โ”‚System_Study/๐Ÿ“•โ”‚Dreamhack_Hacking

Background: Library - Static Link vs. Dynamic Link

Jastes 2022. 6. 8. 20:49


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๐Ÿ“š

์—ฌ๋Ÿฌ ์ปดํŒŒ์ผ ์–ธ์–ด๋“ค์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ •์˜๋ฅผ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ lib ํŒŒ์ผ๋กœ ์ƒ์„ฑ
์ด๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ํ•จ์ˆ˜๋“ค ๋ฐ˜๋ณต์  ์ •์˜ ํ•„์š” X
์ฆ‰, ์ฝ”๋“œ ๊ฐœ๋ฐœ์˜ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋˜๋Š” ์žฅ์ !!

๋˜ํ•œ ๊ฐ ์–ธ์–ด์— ๋ฒ”์šฉ์  ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค์€ ํ‘œ์ค€ lib๊ฐ€ ์ œ์ž‘๋˜์–ด ๊ฐœ๋ฐœ์ž๋“ค์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ฃ 
๋Œ€ํ‘œ์ ์ธ C์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libc๋Š” ์šฐ๋ถ„ํˆฌ์— ๊ธฐ๋ณธ ํƒ‘์žฌ๋œ lib์ž…๋‹ˆ๋‹ค.
์‹ค์Šตํ™˜๊ฒฝ์—์„  /lib/x86_64-linux-gun/libc-2.27.so ๊ฐ€ ์žˆ์ฃ 

๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ํ•จ์ˆ˜๋“ค์˜ ์‚ฌ์šฉ์— ์žˆ์–ด์„œ ์ •์˜ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋„ ์ด ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ


๋งํฌ๐Ÿ–‡๏ธ

๋งํฌ(Link)๋Š” ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ์ปดํŒŒ์ผ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ์จ..
ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ค lib์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์™€ ์‹ค์ œ libํ•จ์ˆ˜๊ฐ€ ๋งํฌ ๊ณผ์ •์— ์—ฐ๊ฒฐ๋จ

๋ฆฌ๋ˆ…์Šค์—์„œ C ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ „์ฒ˜๋ฆฌ, ์ปดํŒŒ์ผ, ์–ด์…ˆ๋ธ” ๊ณผ์ •์„ ๊ฑฐ์ณ ELF ํ˜•์‹์„..
๊ฐ–์ถ˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(Object file)๋กœ ๋ฒˆ์—ญ๋˜๋ฉฐ ์œ„์— ๋ช…๋ น์–ด๋กœ hello-world.c๋กœ ์–ด์…ˆ๋ธ”๋ฉ๋‹ˆ๋‹ค.
์•„๋ก€์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์–ด์…ˆ๋ธ” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜•์‹์„ ๊ฐ–์ถ”๊ณ  ์žˆ์ง€๋งŒ, lib ํ•จ์ˆ˜๋“ค์˜ ์ •์˜์˜ ์œ„์น˜๋ฅผ ๋ชจ๋ฅด๊ธฐ์— ์‹คํ–‰ X
๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด, puts์˜ ์„ ์–ธ์ด stdio.h์— ์žˆ์–ด์„œ ์‹ฌ๋ณผ(Symbol;)๋กœ ๊ธฐ๋ก๋˜๋‚˜ ๊ทธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€..
์‹ฌ๋ณผ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ ์ฐพ์•„์„œ ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์— ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ๋งํฌ ๊ณผ์ •์—์„œ ํ•˜๋Š” ์ผ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒŒ... ๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ ๋œจ๋ฉด ์•ˆ๋˜๋Š”๋ฐ.. ๋งํฌ๋กœ ์•Œ์•„์„œ ํ•ด์ฃผ๋„ค์š”

์ฐธ๊ณ ๋กœ ๋ฐ‘์— ์ฝ”๋“œ๋“ค์€ ์œ„์— ์‹คํ–‰ํ•œ ๊ฒƒ๋“ค ํ™•์ธ ์šฉ๋„ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
ํ•œ๋ฒˆ์ฏค ํ•˜์…”๋„ ์ข‹๊ณ , ์•ˆํ•ด๋„ ์ข‹๊ณ ..

1
2
3
4
5
6
7
8
9
// Name: hello-world.c
// Compile: gcc -o hello-world hello-world.c
 
#include <stdio.h>
 
int main() {
  puts("Hello, world!");
  return 0;
}
cs


์ด์ œ ์˜ˆ์ œ๋ฅผ ์™„์ „ํžˆ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋งํฌ ์ „ ํ›„๋ฅผ ๋น„๊ตํ•ด๋ด…์‹œ๋‹ค.
์œ„์— ์ด๋ฏธ์ง€๋“ค์ด ์ด๋ฏธ libc์—์„œ puts์˜ ์ •์˜๋ฅผ ์ฐพ์•„ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ libc๋ฅผ ๊ฐ™์ด ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์•˜์Œ์—๋„ libc์—์„œ ํ•ด๋‹น ์‹ฌ๋ณผ์„ ํƒ์ƒ‰ํ•œ ๊ฒƒ์€,
libc๊ฐ€ ์žˆ๋Š” /lib/x86_64-linux-gun/๊ฐ€ ํ‘œ์ค€ lib ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
gcc๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ํ‘œ์ค€ lib์˜ lib ํŒŒ์ผ๋“ค์„
๋ชจ๋‘ ํƒ์ƒ‰ ๋ฐ‘์— ๋ช…๋ น์–ด๋กœ ํ‘œ์ค€ lib ๊ฒฝ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ

๋งํฌ๋ฅผ ๊ฑฐ์น˜๊ณ  ๋‚˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์—์„œ puts๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, puts์˜ ์ •์˜๊ฐ€ ์žˆ๋Š” libc์—์„œ
puts์˜ ์ฝ”๋“œ๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ € ๋ช…๋ น์–ด๋“ค์— ๋Œ€ํ•˜์—ฌ ์ต์ˆ™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด.. ๊ตฌ๊ธ€๋งํ•ด์„œ ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ์ฃ ..
์ €๋„ ๋ง‰ํžˆ๊ฑฐ๋‚˜ ๋ชจ๋ฅผ๋•Œ ๊ทธ๋•Œ๋งˆ๋‹ค ํ•ด๋ด์š” ใ… 


๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งํฌ์˜ ์ข…๋ฅ˜

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํฌ๊ฒŒ ๋™์ /์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ๋ถ„๋จ
  • ๋™์  ๋งํฌ(Dynamic Link) : ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํฌํ•œ ๊ฒƒ
  • ์ •์  ๋งํฌ(Static Link) : ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํฌํ•œ ๊ฒƒ

๋™์  ๋งํฌ

๋™์  ๋งํฌ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋™์  lib๊ฐ€ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘๋จ!
๊ทธ๋ฆฌ๊ณ  ์‹คํ–‰ ์ค‘์— lib ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ ๋งคํ•‘๋œ lib์— ํ˜ธ์ถœํ•  ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ๊ทธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰!
๋งˆ์น˜ ์ด ๊ณผ์ •์€ ์‚ฌ๋žŒ์ด ๋„์„œ๊ด€์— ๋ฐฉ๋ฌธ์— ์›ํ•˜๋Š” ์ฑ… ์œ„์น˜ ์ฐพ๊ณ 
๊ทธ ์ฑ…์—์„œ ์ •๋ณด ์Šต๋“ํ•˜๋Š” ๊ณผ์ •๊ณผ ์œ ์‚ฌํ•จ


์ •์  ๋งํฌ

๋˜‘๊ฐ™์ด ๋น„์œ ํ•˜๋ฉด ์ด ๊ฒƒ์€ ๋„์„œ๊ด€์˜ ๋ชจ๋“  ์ฑ…์„ ์•”๊ธฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ •์  ๋งํฌ๋ฅผ ํ•˜๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์ •์  lib์˜ ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ํ•ด๋‹น ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, lib์— ์ฐธ์กฐ๊ฐ€ ์•„๋‹Œ ์ž์‹ ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋“ฏ ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ!!
lib์—์„œ ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ํ•„์š” ์—†์–ด ํƒ์ƒ‰ ๋น„์šฉ์ด ์ ˆ๊ฐ๋˜๋Š” ๋“ฏํ•˜์ง€๋งŒ,
์—ฌ๋Ÿฌ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ lib๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ lib์˜ ๋ณต์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ด๋ฃจ์–ด์ง€๊ธฐ์— ์šฉ๋Ÿ‰ ๋‚ญ๋น„๋„ ๋˜๊ฒ ์ฃ 

๊ทธ๋Ÿผ ์ด ๋‘˜์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด hello-world.c๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค!


๋™์  ๋งํฌ vs ์ •์  ๋งํฌ

๋จผ์ € ์•ž์˜ hello-world.c๋ฅผ ์ •์  ์ปดํŒŒ์ผํ•˜์—ฌ static์„, ๋™์ ์œผ๋ก  dynamic์„ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค

์šฉ๋Ÿ‰

๊ฐ ์šฉ๋Ÿ‰์„ ๋น„๊ตํ•˜๋ฉด static์ด dynamic๋ณด๋‹ค 100๋ฐฐ ๊ฐ€๊นŒ์ด ๋” ํฐ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•œ๋‹ต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

static์—์„  puts๊ฐ€ ์žˆ๋Š” 0x40a770์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ฐ˜๋ฉด dynamic์€ 0x401030(plt)์„ ํ˜ธ์ถœํ•˜์ฃ 
์ด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ์œ„์—์„œ ๋งŽ์ด ์„ค๋ช…ํ–ˆ๊ณ , plt๋Š” dynamic์˜ ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค

์™ผ์ชฝ์ด static ์˜ค๋ฅธ์ชฝ์€ dynamic


PLT์™€ GOT

PLT(Procedure Linkage Table)
GOT(Global Offset Table)

์ด ๋‘˜์€ lib์—์„œ ๋™์  ๋งํฌ๋œ ์‹ฌ๋ณผ ์ฃผ์†Œ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ASLR์— ์˜ํ•ด lib๊ฐ€ ์ž„์˜์˜ ์ฃผ์†Œ์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
์ด ์ƒํƒœ์—์„œ lib ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ → ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”ํƒ• lib์— ์‹ฌ๋ณผ๋“ค ํƒ์ƒ‰ → ํ•จ์ˆ˜ ์ •์˜ ๋ฐœ๊ฒฌ ๊ทธ ์ฃผ์†Œ๋กœ ์‹คํ–‰ ํ๋ฆ„
์ด ์ „ ๊ณผ์ •์„ ํ†ตํ‹€์–ด runtime resolve๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋‚˜์ค‘์— ์ž์„ธํžˆ.. ๋ณด์ž๊ณ ์š”

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ •์˜๋ฅผ ๋งค๋ฒˆ ํƒ์ƒ‰ํ•œ๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ด๊ฒ ์ฃ 
๊ทธ๋ž˜์„œ ELF๋Š” GOT๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๋‘๊ณ , resolve๋œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ํ•ด๋‹น ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์‹œ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ๊บผ๋‚ด ์‚ฌ์šฉํ•˜์ฃ 

๊ทธ๋Ÿผ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์‹ค์ œ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๋™์ž‘์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค!

1
2
3
4
5
6
7
8
9
10
// Name: got.c
// Compile: gcc -o got got.c
 
#include <stdio.h>
 
int main() {
  puts("Resolving address of 'puts'.");
  puts("Get address from GOT");
}
 
cs

resolve๋˜๊ธฐ ์ „

๋จผ์ € got.c๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ , ์‹คํ–‰ ํ›„ GOT๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์•„์ง puts์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ๊ธฐ ์ „์ด๋ฏ€๋กœ
ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ puts@plt+6๋ผ๋Š” PLT ๋‚ด๋ถ€์˜ ์ฃผ์†Œ๊ฐ€ ์ ํ˜€์žˆ์ฃ 

gdb ./got → start → got

์ด์ œ puts@plt๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ง€์ ์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ , ๋‚ด๋ถ€๋กœ ๋”ฐ๋ผ๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
PLT์—์„œ๋Š” ๋จผ์ € puts์˜ GOT์ธ 0x555...8018์— ์“ฐ์ธ๊ฐ’์œผ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊น๋‹ˆ๋‹ค.

ํ˜„์žฌ GOT์—๋Š” puts@plt+6์˜ ์ฃผ์†Œ๊ฐ€ ์“ฐ์—ฌ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ”๋กœ ๋‹ค์Œ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰!

b *main+11 → c → si → ni

ํ•จ์ˆ˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด์˜จ ๋ชจ์Šต(si)
๋‹ค์‹œ ์›๋ž˜ ๋กœ์ง์œผ๋กœ ๋Œ์•„์™€ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ„ ๋ชจ์Šต(ni)

์—ฌ๊ธฐ์„œ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์‹คํ–‰์‹œํ‚ค๋ฉด dl_runtime_resolve_xsavec๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ,
์ด ํ•จ์ˆ˜์—์„œ puts์˜ ์ฃผ์†Œ๊ฐ€ ๊ตฌํ•ด์ง€๊ณ , GOT์— ์ฃผ์†Œ๊ฐ€ ์จ์ง‘๋‹ˆ๋‹ค.

ni.. → finish → got

ni.. ์—ฌ๋Ÿฌ๋ฒˆ?์„ ํ†ตํ•ด ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค์‹œ๋ฉด..
finish๋กœ ์ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์ข…๊ฒฐ ๊ทธ๋Ÿผ plt ํ• ๋‹น ๋˜๊ฒ ์ฃ  ํ™•์ธ ใ„ฑ
์งœ๋ž€!! PLT๊ฐ€ ํ• ๋‹น๋ฌ๊ธฐ์— GOT๋„ ๊ฐฑ์‹ ๋ฌ์ฃ !!


resolve๋œ ํ›„

๋‘ ๋ฒˆ์งธ๋กœ puts@plt๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” GOT์— puts์˜ ์ฃผ์†Œ๊ฐ€ ์“ฐ์—ฌ์žˆ์–ด์„œ ๋ฐ”๋กœ puts๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ si๋ฅผ ์ง„ํ–‰ํ•ด ๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ๋“ค์–ด๊ฐ„ ๋ชจ์Šต!


์‹œ์Šคํ…œ ํ•ดํ‚น์˜ ๊ด€์ ์—์„œ ๋ณธ PLT์™€ GOT

PLT์™€ GOT๋Š” ๋™์  ๋งํฌ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ lib ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ฐพ๊ณ , ๊ธฐ๋กํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ค‘์š” ํ…Œ์ด๋ธ”!
๊ทธ๋Ÿฐ๋ฐ, ํ•ด์ปค ๊ด€์ ์—์„  PLT → GOT๋ฅผ ์ฐธ์กฐํ•ด ์‹คํ–‰ ํ๋ฆ„์— ์˜ฎ๊ธธ ๋•Œ, GOT์˜ ๊ฐ’ ๊ฒ€์ฆ X(๋ณด์•ˆ ์ทจ์•ฝ)

๋”ฐ๋ผ์„œ ์•ž์˜ ์˜ˆ์—์„œ GOT์— ์ €์žฅ๋œ puts์˜ ์ฃผ์†Œ๋ฅผ ๊ณต๊ฒฉ์ž๊ฐ€ ์ž„์˜๋กœ ๋ณ€๊ฒฝ ํ•˜๋ฉด,
๋‘ ๋ฒˆ์งธ๋กœ puts๊ฐ€ ํ˜ธ์ถœ ์‹œ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๊ฐ€๋Šฅํ•œ์ง€ gdb๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ํ•ด๋ด…์‹œ๋‹ค.

์•ž์˜ got ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋‘ ๋ฒˆ์งธ puts ํ˜ธ์ถœ ์ง์ ์— puts์˜ GOT ๊ฐ’์„..
"AAAAAAAA"๋กœ ๋ณ€๊ฒฝ ํ›„ ์‹คํ–‰ํ•˜๋ฉด ์‹ค์ œ๋กœ ์ž…๋ ฅํ•œ๋Œ€๋กœ ์‹คํ–‰ ํ๋ฆ„์ด ์˜ฎ๊ฒจ์ง„๋‹ต๋‹ˆ๋‹ค.

gdb ./got → b* main+29 → r
→ set *(unsigned long long*)0x555555558018 = 0x4141414141414141 → c

break ๊ฑธ์–ด์ค€ ๊ณณ์— ์žˆ๋Š” Puts์˜ ์ฃผ์†Œ ์ฆ‰, got๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ฒ ์ฃ 
ํ•ด๋‹น ์œ„์น˜์˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์„ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
Countineํ•˜๋ฉด ์ด์ œ GOT๊ฐ€ ๋ณ€๊ฒฝ๋œ ๋ชจ์Šต์„ ์นœํžˆ ๋ณด์—ฌ์ฃผ์ฃ 

๋ญ ๋‹น์—ฐํ•œ๊ฑฐ๊ฒ ์ง€๋งŒ ์ง์ ‘ํ•ด๋ณด์‹œ๋ฉด ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ˆ๊นŒ ๋งˆ๋ƒฅ ๋”ฐ๋ผ๋งŒ ํ•˜์ง€ ๋ง๊ณ  ์•Œ์•„๋ด์•ผ๊ฒ ์ฃ ?

์ด๋Ÿฐ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ GOT Overwrite๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ž„์˜ ์ฃผ์†Œ์— ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ์„ ๋•Œ,
RCE๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 


์ฐธ๊ณ  ์ž๋ฃŒ

 

Background: Library - Static Link vs. Dynamic Link

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งํฌ์˜ ๊ฐœ๋…์„ ์†Œ๊ฐœํ•˜๊ณ , ๋ฆฌ๋ˆ…์Šค์˜ PLT, GOT์— ๋Œ€ํ•ด ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€