๐Ÿ’ซ[Dreamhack] Exploit Tech: Return Address Overwrite

beaniiยท2023๋…„ 11์›” 30์ผ

Pwnable

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

๋“œ๋ฆผํ•ต https://learn.dreamhack.io/58#1

1. ์„œ๋ก 


// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie

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

void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}

void get_shell() {
  char *cmd = "/bin/sh";
  char *args[] = {cmd, NULL};

  execve(cmd, args, NULL);
}

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

  init();

  printf("Input: ");
  scanf("%s", buf);

  return 0;
}

2. ๋ถ„์„


์ทจ์•ฝ์  ๋ถ„์„

์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์ทจ์•ฝ์ ์€ `scanf("%s", buf)์ž„!!

  • scanf ํ•จ์ˆ˜์˜ ํฌ๋งท ์ŠคํŠธ๋ง ์ค‘ ํ•˜๋‚˜์ธ %s๋Š” ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
    • ์ž…๋ ฅ์˜ ๊ธธ์ด ์ œํ•œํ•˜์ง€ ์•Š์Œ -> ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
    • ๊ณต๋ฐฑ ๋ฌธ์ž์ธ ๋„์–ด์“ฐ๊ธฐ, ํƒญ, ๊ฐœํ–‰ ๋ฌธ์ž ๋“ฑ์ด ๋“ค์–ด์˜ฌ ๋•Œ๊นŒ์ง€ ๊ณ„์† ์ž…๋ ฅ์„ ๋ฐ›์Œ
      -> %s ๋Œ€์‹  %[n]s ์‚ฌ์šฉํ•ด์•ผ ํ•จ

  • ์œ ์‚ฌํ•˜๊ฒŒ ๋ฒ„ํผ์˜ ๊ธธ์ด๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” strcpy, strcat, sprintf ๋Œ€์‹  strncpy, strncat, snprintf, fgets, memcpy ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

ํŠธ๋ฆฌ๊ฑฐ๐Ÿ”ซ

ํŠธ๋ฆฌ๊ฑฐ: ์ทจ์•ฝ์ ์„ ๋ฐœํ˜„์‹œ์ผœ ํ™•์ธํ•˜๋Š” ํ–‰์œ„

  • A๋ฅผ 5๊ฐœ ์ž…๋ ฅํ–ˆ์„ ๋•Œ -> ํ”„๋กœ๊ทธ๋žจ ์ •์ƒ ์ข…๋ฃŒ

  • A๋ฅผ 64๊ฐœ ์ž…๋ ฅํ–ˆ์„ ๋•Œ -> Segmentation fault ์—๋Ÿฌ ์ถœ๋ ฅ, ํ”„๋กœ๊ทธ๋žจ ๋น„์ •์ƒ ์ข…๋ฃŒ

  • core dumped๋Š” ์ฝ”์–ดํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ๋œป์œผ๋กœ, ํ”„๋กœ๊ทธ๋žจ ๋น„์ •์ƒ ์ข…๋ฃŒ ์‹œ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด OS๊ฐ€ ์ƒ์„ฑ

    • Ubuntu 20.04 ๋ฒ„์ „ ์ด์ƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ /var/lib/apport/coredump ๋””๋ ‰ํ† ๋ฆฌ์— ์ฝ”์–ด ํŒŒ์ผ ์ƒ์„ฑ
    • ์ฝ”์–ด ํŒŒ์ผ์ด ์ƒ๊ธฐ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์ƒ์„ฑํ•ด์•ผ ํ•  ์ฝ”์–ด ์ฝ”์ผ์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด unlimit -c unlimited ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋‹ค์‹œ ์‹คํ–‰

์ฝ”์–ด ํŒŒ์ผ ๋ถ„์„๐Ÿ”

  • gdb์—๋Š” ์ฝ”์–ด ํŒŒ์ผ ๋ถ„์„ ๊ธฐ๋Šฅ ์กด์žฌ -> ์ž…๋ ฅ์ด ์Šคํƒ์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋๋Š”์ง€ ๋ถ„์„ ๋ฐ ์…ธ์„ ํš๋“ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ„ํš ์„ธ์šฐ๊ธฐ

  • gdb rao -c core ๋ช…๋ น์–ด๋กœ ์ฝ”์–ด ํŒŒ์ผ ์˜คํ”ˆ

    • ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์›์ธ ๋ฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ฃผ์†Œ ๋ณด์—ฌ์คŒ
  • ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ๋œ ์ฝ”๋“œ์™€ ์Šคํƒ์„ ๊ด€์ฐฐํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด mainํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์Šคํƒ ์ตœ์ƒ๋‹จ์— ์ €์žฅ๋œ ๊ฐ’์ด ์ž…๋ ฅ๊ฐ’์˜ ์ผ๋ถ€์ธ 0x4141414141414141('AAAAAAAA')๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
    -> ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ์–ด์„œ ์„ธ๊ทธ๋จผํ…Œ์ด์…˜ ํดํŠธ ๋ฐœ์ƒํ•œ ๊ฒƒ
    -> ์ด ๊ฐ’์ด ์›ํ•˜๋Š” ์ฝ”๋“œ ์ฃผ์†Œ๊ฐ€ ๋˜๋„๋ก ์ ์ ˆํ•œ ์ž…๋ ฅ์„ ์ฃผ๋ฉด ์›ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ

3. ์ต์Šคํ”Œ๋กœ์ž‡


์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ ํŒŒ์•…

  • ์Šคํƒ ๋ฒ„ํผ์— ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ๋ฐ˜ํ™˜์ฃผ์†Œ๋ฅผ ๋ฎ์œผ๋ ค๋ฉด ํ•ด๋‹น ๋ฒ„ํผ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ์–ด๋””์— ์œ„์น˜ํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•ด์•ผ ํ•จ
  • ์•„๋ž˜๋Š” main ํ•จ์ˆ˜์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ(์‹ค์Šต ์‹œ ๊ฐ•์˜์™€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์™€์„œ ๊ฐ•์˜์ž๋ฃŒ๋กœ ๋Œ€์ฒด)

(์‹ค์Šต๊ฒฐ๊ณผ: nearpc ๋ช…๋ น์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์„œ disassemble main ์‹คํ–‰ํ•œ ๋ชจ์Šต)

-> ์˜์‚ฌ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด

scanf("%s", (rbp-0x30));
  • ์ฆ‰, ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๋ฒ„ํผ๋Š” rbp-0x30์— ์œ„์น˜
  • ์•„๋ž˜ ์‚ฌ์ง„์€ ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ๊ทธ๋ฆฐ ์Šคํƒ ํ”„๋ ˆ์ž„
  • ์ž…๋ ฅํ•  ๋ฒ„ํผ์™€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์‚ฌ์ด์— 0x38๋งŒํผ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Œ
    -> ๊ทธ๋งŒํผ์„ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’(dummy data)์œผ๋กœ ์ฑ„์šฐ๊ณ , ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ์˜ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹คํ–‰ ํ๋ฆ„ ์กฐ์ž‘

get_shell() ์ฃผ์†Œ ํ™•์ธ

  • ์‹ค์Šต ํŒŒ์ผ์—๋Š” ์…ธ์„ ์‹คํ–‰ํ•ด์ฃผ๋Š” get_shell() ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ
  • main ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์ด ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋กœ ๋ฎ์–ด์„œ ์…ธ ํš๋“ํ•˜๊ธฐ

  • get_shell()์˜ ์ฃผ์†Œ๋Š” 0x401199 ์ž„

ํŽ˜์ด๋กœ๋“œ ๊ตฌ์„ฑ

ํŽ˜์ด๋กœ๋“œ(Payload): ๊ณต๊ฒฉ์„ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ

  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŽ˜์ด๋กœ๋“œ ๊ตฌ์„ฑ

์—”๋””์–ธ ์ ์šฉ

  • ์—”๋””์–ธ: ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜๋Š” ๋ฐฉ์‹
    • ์ฃผ๋กœ ๋ฆฌํ‹€ ์—”๋””์–ธ(Little-Endian, LE)๊ณผ ๋น… ์—”๋””์–ธ(Big-Endian, BE) ์‚ฌ์šฉ
    • ๋ฆฌํ‹€ ์—”๋””์–ธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ Most Significant Byte(MSB; ๊ฐ€์žฅ ์™ผ์ชฝ์˜ ๋ฐ”์ดํŠธ)๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ฃผ์†Œ์— ์ €์žฅ๋จ
    • ๋น… ์—”๋””์–ธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ MSB๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ฃผ์†Œ์— ์ €์žฅ๋จ
  • ๊ตฌ์„ฑํ•œ ํŽ˜์ด๋กœ๋“œ๋Š” ์ ์ ˆํ•œ ์—”๋””์–ธ ์ ์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•ด์•ผ ํ•จ
  • get_shell()์˜ ์ฃผ์†Œ์ธ 0x401199์€ \x99\x11\x40\x00\x00\x00\x00\x00๋กœ ์ „๋‹ฌ๋ผ์•ผ ๋จ

์ต์Šคํ”Œ๋กœ์ž‡

  • ์—”๋””์–ธ์„ ์ ์šฉํ•œ ํŽ˜์ด๋กœ๋“œ ์ž‘์„ฑ ํ›„ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ rao์— ์ „๋‹ฌํ•˜๋ฉด ์…ธ ํš๋“ ๊ฐ€๋Šฅ
    • ํŒŒ์ด์ฌ์œผ๋กœ ์ถœ๋ ฅํ•œ ํŽ˜์ด๋กœ๋“œ๋ฅผ rao์˜ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •

์…ธ์„ ์–ป์–ด์•ผํ•˜๋Š”๋ฐ,,,,์™œ์•ˆ๋˜์ง€


์ฐธ๊ณ 

pwngdb ์„ค์น˜
https://eteo.tistory.com/290

0๊ฐœ์˜ ๋Œ“๊ธ€